Terraform & Ansible

strong1·2024년 8월 6일
post-thumbnail

Terraform과 Ansible의 역할 분담

  1. Terraform: 인프라 프로비저닝 및 관리
  2. Ansible: 생성된 인프라에 소프트웨어 설치 및 구성

Terraform이란?

: 인프라를 코드로 정의하고, Kubernetes 클러스터 내의 리소스(Deployment, Service 등) 관리

구성

  • provider: Terraform이 클라우드 공급자와 상호작용할 수 있도록 하는 플러그인입니다. 예를 들어, AWS, Azure, Google Cloud 등이 있습니다.

로컬 환경에서 terraform을 사용하여 k8s 클러스터에 helm 차트 배포

# terraform/providers.tf
provider "kubernetes" {
  config_path = "~/.kube/config"  # Kubernetes 클러스터 설정 파일 경로
}

provider "helm" {
  kubernetes {
    config_path = "~/.kube/config"
  }
}
# helm 차트를 패키징하고 배포하기 위한 terraform 리소스 정의
# terraform/helm.tf
resource "helm_release" "api_server" {
  name       = "api-server" # 릴리즈의 이름
  chart      = "./k8s/helm-chart"  # 배포할 차트의 경로, 로컬 Helm 차트 경로
  version    = "0.1.0"  # 차트 버전
  namespace  = "api-base" # k8s 네임 스페이스

  values = [
    file("k8s/helm-chart/values.yaml")
    # Helm 차트에 적용할 값들을 정의하는 YAML 파일의 경로를 지정합니다. 이 파일은 차트의 설정 값을 사용자 정의할 때 사용됩니다.
  ]
}
  • resource: 실제 인프라 리소스를 정의하는 블록입니다. EC2 인스턴스, RDS 데이터베이스, 네트워크 등을 설정할 수 있습니다.
    위의 코드에선 로컬의 "helm_release" "api_server"로 Helm 차트를 배포하기 위한 리소스를 정의합니다.
  • module: 재사용 가능한 인프라 구성 블록입니다. 복잡한 인프라 구성을 모듈화하여 재사용성과 관리 용이성을 높입니다.
  • apply: 정의된 인프라를 실제로 생성하거나 변경하는 명령어입니다.

helm으로 리소스들을 관리할 수 있다.

→ Terraform에서 해당 릴리즈만 helm install로 실행시키면 배포(쿠버네티스 클러스터 설정)가 완료된다.

Ansible이란?

  • 애플리케이션의 구성, 데이터베이스 초기화, 운영 및 배포 이후 설정 작업 등 세부적인 작업 수행

구성

  • inventory: 관리할 호스트 및 그룹을 정의하는 파일입니다. pod과 service의 각 호스트의 정보와 그룹을 설정하여 Ansible이 대상 서버를 알 수 있도록 합니다.
[k8s_pods]
alertmanager-prometheus-kube-prometheus-alertmanager-0 ansible_host=10.244.0.57
grafana-deployment-6cf6665d5c-8c4wp ansible_host=10.111.114.132
my-mysql-0 ansible_host=10.101.244.126
mysql-6bc459546b-254rc ansible_host=10.101.244.126
prometheus-deployment-7d8998f4b6-pm49f ansible_host=10.102.232.167
prometheus-kube-prometheus-blackbox-exporter-54457f4744-xfsw2 ansible_host=10.108.193.40
prometheus-kube-prometheus-operator-c4897fd85-f48l8 ansible_host=10.110.34.210
prometheus-kube-state-metrics-55b547994c-wtrwh ansible_host=10.100.53.231
prometheus-node-exporter-hqnfw ansible_host=10.106.28.96
prometheus-prometheus-kube-prometheus-prometheus-0 ansible_host=10.102.232.167
springboot-app-dbfd67bd6-hlp2z ansible_host=10.111.72.78

[defaults]
inventory = ./inventory
host_key_checking = False
deprecation_warnings = False
  • playbook: Ansible이 실행할 작업을 정의한 YAML 파일입니다. 여러 작업을 순서대로 실행하며 서버의 상태를 조정합니다.
- name: Set up servers
  hosts: all
  become: yes
  tasks:
    - name: Clone API Server repository
      git:
        repo: 'https://github.com/qwer9545/k8s-api-server-base.git'
        dest: '/path/to/destination'
        version: 'main/step05_probono'

    - name: Install Helm
      apt:
        name: helm
        state: present

    - name: Initialize Helm repository
      command: helm repo add stable https://charts.helm.sh/stable
      register: helm_repo_result
      failed_when: "'added' not in helm_repo_result.stdout"
  • role: 재사용 가능한 Ansible 작업 집합입니다. 역할을 사용하여 작업을 모듈화하고 재사용성을 높입니다.
  • task: Ansible Playbook의 기본 단위입니다. 개별적인 작업을 정의하며, 각 작업은 특정 작업을 수행합니다.

서비스 구축 과정

  1. Java Springboot, Mysql 컨테이너 docker-compose
  2. Minikube로 Pod, Service, Deployment 관리
  3. prometheus 및 grafana 모니터링 시스템 구축
  4. helm install prometheus-kube-alertmanager 서비스 설정
  5. terraform/ansible로 laC정의 및 배포 자동화

배포 과정

  • 로컬 시스템에 minikube 설치
  • 사용자가 api-server와 terraform/ansible 레포지토리 클론
  • terraform이 쿠버네티스 클러스터에 필요한 인프라 구성
  • ansible playbook으로 로컬 dest 설정
  • api-server에서 helm-chart를 사용하여 minikube 클러스터에 배포
  • kubectl get pods로 클러스터 배포 확인

회고

쿠버네티스와 helm-chart, Terraform, ansible 등 이름과 알고있던 개념들을 이해하면서 서비스를 구축하다보니 시간이 생각보다 많이 소요되었고, helm과 terraform 설정의 완성도가 많이 떨어진 것 같다.

추가로 쿠버네티스와 테라폼에 관련된 내용은 인프런 강의나 실습을 통해 계속 학습해나가며 숙련도를 높여나가야겠다.

profile
클라우드 엔지니어로 성장하고 있습니다.

0개의 댓글