카테고리 없음

Terraform을 이용한 CI/CD 구축

자바바라 2025. 2. 10. 07:20

Native Kubernetes 환경에 Terraform을 이용한 CI/CD 구축 명령어

아래는 Native Kubernetes 환경에 Terraform을 이용하여 기본적인 CI/CD 파이프라인을 구축하는 명령어와 설명입니다. 이 예시는 Git 저장소 변경을 감지하여 자동으로 애플리케이션을 빌드, 테스트, 배포하는 것을 목표로 합니다.

사전 준비:

Kubernetes 클러스터: 이미 실행 중인 Kubernetes 클러스터가 필요합니다. (Minikube, Kind, 또는 클라우드 제공 Kubernetes 서비스)

Terraform: Terraform이 설치되어 있어야 합니다. (https://www.terraform.io/downloads)

kubectl: Kubernetes 클러스터에 접근하기 위한 kubectl이 설정되어 있어야 합니다.

Git 저장소: 애플리케이션 소스 코드를 저장할 Git 저장소가 필요합니다.

Docker Hub 계정 (선택 사항): Docker 이미지를 저장할 Docker Hub 계정이 필요합니다.

단계:

Terraform 프로젝트 디렉토리 생성:

mkdir terraform-cicd
cd terraform-cicd
content_copy
download
Use code with caution.
Bash

Terraform 설정 파일 (main.tf) 생성:

# Provider 설정 (Kubernetes)
terraform {
  required_providers {
    kubernetes = {
      source  = "hashicorp/kubernetes"
      version = "~> 2.0"
    }
  }
}

provider "kubernetes" {
  # Kubernetes 클러스터 접속 정보 (kubeconfig 파일 경로 또는 인증 정보)
  # 예를 들어, 로컬 kubeconfig 파일 사용:
  config_path = "~/.kube/config"
}

# Namespace 생성 (CI/CD 파이프라인 관련 리소스 격리)
resource "kubernetes_namespace" "cicd" {
  metadata {
    name = "cicd-namespace"
  }
}

# Service Account 생성 (파이프라인에서 Kubernetes API 접근 권한 부여)
resource "kubernetes_service_account" "cicd" {
  metadata {
    name      = "cicd-service-account"
    namespace = kubernetes_namespace.cicd.metadata[0].name
  }
}

# Role 생성 (Service Account에 권한 부여)
resource "kubernetes_role" "cicd" {
  metadata {
    name      = "cicd-role"
    namespace = kubernetes_namespace.cicd.metadata[0].name
  }
  rule {
    api_groups = [""]
    resources  = ["pods", "pods/log", "deployments", "services"]
    verbs      = ["get", "list", "watch", "create", "update", "patch", "delete"]
  }
}

# Role Binding 생성 (Role과 Service Account 연결)
resource "kubernetes_role_binding" "cicd" {
  metadata {
    name      = "cicd-role-binding"
    namespace = kubernetes_namespace.cicd.metadata[0].name
  }
  role_ref {
    api_group = "rbac.authorization.k8s.io"
    kind      = "Role"
    name      = kubernetes_role.cicd.metadata[0].name
  }
  subject {
    kind      = "ServiceAccount"
    name      = kubernetes_service_account.cicd.metadata[0].name
    namespace = kubernetes_namespace.cicd.metadata[0].name
  }
}

# Jenkins 또는 다른 CI/CD 도구 설치 (Helm 차트 사용 예시)
resource "kubernetes_manifest" "jenkins" {
  manifest = {
    apiVersion = "helhttp://m.toolkit.fluxcd.io/v2beta1"
    kind       = "HelmRelease"
    metadata = {
      name      = "jenkins"
      namespace = kubernetes_namespace.cicd.metadata[0].name
    }
    spec = {
      interval = "5m"
      chart = {
        spec = {
          chart   = "jenkins"
          sourceRef = {
            kind = "HelmRepository"
            name = "jenkins"
            namespace = kubernetes_namespace.cicd.metadata[0].name
          }
          interval = "5m"
        }
      }
      values = {
        # Jenkins 설정 (필요에 따라 수정)
        serviceType = "LoadBalancer"
      }
    }
  }
}

# Helm Repository 정의 (Jenkins 차트를 가져오기 위한 설정)
resource "kubernetes_manifest" "jenkins_helm_repo" {
  manifest = {
    apiVersion = "source.toolkit.fluxcd.io/v1beta2"
    kind       = "HelmRepository"
    metadata = {
      name      = "jenkins"
      namespace = kubernetes_namespace.cicd.metadata[0].name
    }
    spec = {
      interval = "5m"
      url      = "https://charts.jenkins.io"
    }
  }
}
content_copy
download
Use code with caution.
Terraform

설명:

Provider: Kubernetes 클러스터에 접속하기 위한 설정입니다. config_path를 실제 kubeconfig 파일 경로로 변경해야 합니다.

Namespace: CI/CD 파이프라인 관련 리소스를 격리하기 위한 namespace를 생성합니다.

Service Account, Role, Role Binding: CI/CD 도구가 Kubernetes API에 접근할 수 있도록 권한을 부여합니다.

Jenkins (Helm): Jenkins를 Helm 차트를 이용하여 설치하는 예시입니다. 다른 CI/CD 도구를 사용하려면 해당 도구에 맞는 설정을 추가해야 합니다.

Terraform 초기화:

terraform init
content_copy
download
Use code with caution.
Bash

Terraform 계획:

terraform plan
content_copy
download
Use code with caution.
Bash

Terraform 적용:

terraform apply
content_copy
download
Use code with caution.
Bash

CI/CD 파이프라인 구성:

Jenkins 설정: Jenkins에 접속하여 Git 저장소 연동, 빌드 스크립트 작성, 테스트 실행, Docker 이미지 빌드 및 푸시, Kubernetes 배포 스크립트 작성 등의 파이프라인을 구성합니다.

Kubernetes 배포 스크립트: Kubernetes deployment와 service를 업데이트하는 스크립트를 작성합니다. kubectl apply -f deployment.yaml 또는 kubectl apply -f service.yaml 명령어를 사용할 수 있습니다.

주의 사항:

위 설정은 기본적인 예시이며, 실제 환경에 맞게 수정해야 합니다.

Jenkins 설정 및 파이프라인 구성은 별도로 진행해야 합니다.

보안을 위해 Service Account에 필요한 최소한의 권한만 부여해야 합니다.

클라우드 환경에서는 IAM Role을 이용하여 Kubernetes API 접근 권한을 관리하는 것이 좋습니다.

CI/CD 파이프라인 예시 (Jenkins):

Git 저장소 변경 감지: Jenkins가 Git 저장소의 변경을 감지합니다.

빌드: 애플리케이션 소스 코드를 빌드합니다.

테스트: 유닛 테스트, 통합 테스트 등을 실행합니다.

Docker 이미지 빌드: 애플리케이션을 Docker 이미지로 빌드합니다.

Docker 이미지 푸시: Docker 이미지를 Docker Hub 또는 다른 컨테이너 레지스트리에 푸시합니다.

Kubernetes 배포: Kubernetes deployment와 service를 업데이트하여 애플리케이션을 배포합니다.

추가 고려 사항:

GitOps: Argo CD 또는 Flux CD를 사용하여 Git 저장소를 통해 Kubernetes 리소스를 관리할 수 있습니다.

자동 스케일링: Kubernetes Horizontal Pod Autoscaler (HPA)를 사용하여 애플리케이션의 트래픽에 따라 자동으로 파드를 스케일링할 수 있습니다.

모니터링: Prometheus와 Grafana를 사용하여 애플리케이션 및 Kubernetes 클러스터의 상태를 모니터링할 수 있습니다.

로깅: Fluentd 또는 Elasticsearch를 사용하여 애플리케이션 로그를 수집하고 분석할 수 있습니다.

이 가이드라인과 명령어를 기반으로, 실제 환경에 맞는 CI/CD 파이프라인을 구축할 수 있습니다. 질문이나 추가적인 도움이 필요하시면 언제든지 문의하십시오.