본문 바로가기

⭐ DevOps/Ansible (앤서블)

Ansible과 Terraform을 활용한 K8S 예제

728x90
반응형

계획

  1. Terraform: 클라우드 제공자 (예: AWS, GCP, Azure)에서 Kubernetes 클러스터를 프로비저닝한다.
  2. Ansible: Kubernetes 클러스터에 애플리케이션을 배포합니다.

Terraform 단계

  1. Kubernetes 클러스터를 프로비저닝하기 위한 Terraform 구성 파일을 생성한다.
  2. Terraform 구성을 초기화하고 적용한다.

Ansible 단계

  1. Kubernetes 마스터 노드가 포함된 인벤토리 파일을 생성한다.
  2. Kubernetes 클러스터에 애플리케이션을 배포하기 위한 플레이북을 생성한다.

Terraform 구성

# main.tf
provider "aws" {
  region = "us-west-2"
}

resource "aws_eks_cluster" "k8s_cluster" {
  name     = "k8s-cluster"
  role_arn = aws_iam_role.eks_role.arn

  vpc_config {
    subnet_ids = aws_subnet.subnet[*].id
  }
}

resource "aws_iam_role" "eks_role" {
  name = "eks-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "eks.amazonaws.com"
        }
      },
    ]
  })
}

resource "aws_subnet" "subnet" {
  count = 2
  vpc_id     = aws_vpc.main.id
  cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

Terraform 초기화 및 적용

terraform init
terraform apply

Ansible 인벤토리

# inventory
[k8s_master]
master ansible_host=<master_node_ip> ansible_user=ubuntu

Ansible 플레이북

# playbook.yml
---
- name: Deploy application to Kubernetes
  hosts: k8s_master
  become: yes
  tasks:
    - name: Create Kubernetes deployment
      k8s:
        state: present
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: nginx-deployment
          spec:
            replicas: 2
            selector:
              matchLabels:
                app: nginx
            template:
              metadata:
                labels:
                  app: nginx
              spec:
                containers:
                - name: nginx
                  image: nginx:1.14.2
                  ports:
                  - containerPort: 80
    - name: Create Kubernetes service
      k8s:
        state: present
        definition:
          apiVersion: v1
          kind: Service
          metadata:
            name: nginx-service
          spec:
            selector:
              app: nginx
            ports:
              - protocol: TCP
                port: 80
                targetPort: 80
            type: LoadBalancer

Ansible 플레이북 실행

ansible-playbook -i inventory playbook.yml

 

- 끝 -

728x90
반응형