상세 컨텐츠

본문 제목

EKS - jenkins - ArgoCD 인프라 구축 -Terraform

Iac

by drogva 2024. 4. 18. 09:30

본문

목표: EKS 에서 로드밸런서로 구현한 jenkins, argoCD 인프라 구축

 

기존에 있던 ROOT 모듈에

bation.tf  작성 -  eks가 생성된 후 local 에서 kubeconfig 추가, 기존의 yaml 을 적용 및, 레지스트리 리소스를 사용해 구현

jenkins-values.yaml , argo.yml -  terraform-module/release/helm 리소스로 설치 시 템플릿 파일 변수로 사용.

 

 

 

1. ebs 생성 

argo, jenkins 설치를 위해선 우선 볼륨이 필요하다.

 

resource "aws_ebs_volume  - 리소스를 사용해서 형식만 갖쳐주면 된다.  

 

resource "aws_ebs_volume" "jenkins" {
  availability_zone = "ap-northeast-2a" 
  size              = 10
  tags = {
    Name = "jenkins-volume"
  }
}

resource "aws_ebs_volume" "argo" {
  availability_zone = "ap-northeast-2c"
  size              = 30
  tags = {
    Name = "volume-argo"
  }
}

 

 

출저 : https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ebs_volume

 

 

 

-추가 된 프로파이더  local

 

local = {
      source  = "hashicorp/local"
      version = "2.5.1"

 

:   결국 eks 가 생성된 후 로컬에서 kubectl 인터페이스를 통해 구현해야 한다. 따라서 로컬 시스템에서 Terraform을 실행하기 위한 프로바이더이다.

 

- null resource

 

기존 terraform 리소스에서는 지원해주지 않는 경우 자체 커멘드를  실행하기 위한 깡통리소스다. 따라서 인프라스트럭처 구현해 반영되지 않는다. 

 

출저: https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource

 

Terraform Registry

 

registry.terraform.io

- provisioner

 

눌 리소스야 말 그대로 깡통리소스 형식이고, 커맨드를 실행하게 위한 역할은 이 프로비져너가 담당한다. 배포된 인스턴스 내부에서의 파일 이동 작업, 커맨드, 스크립트 실행, 플러그인 설치 등의 작업이 필요할 때 사용된다.

 

출저 : https://developer.hashicorp.com/terraform/language/resources/provisioners/local-exec

 

Provisioner: local-exec | Terraform | HashiCorp Developer

The `local-exec` provisioner invokes a local executable after a resource is created. This invokes a process on the machine running Terraform, not on the resource. See the `remote-exec` provisioner to run commands on the resource.

developer.hashicorp.com

 

resource "null_resource" "update-kubeconfig" {
  depends_on = [aws_eks_addon.ebs-csi]


  provisioner "local-exec" {
    command = "aws eks --region ap-northeast-2 update-kubeconfig --name simon-test"
  }
}

 

의존성으로는 ebs-add on 이 끝나고 kubeconfig 를 등록하도록 구성하였다. 즉, 모든 eks 제반사항이 설치 된 이후에 적용.

로컬에 aws cli, kubectl 은 미리 설치함

 

- local file, filename

 pv, pvc 생성을 위한 yaml, ingrees 생성을 위한 yaml 을 테라폼에서 구현 할 수 있도록 파일로 변환.

 

resource "local_file" "ebs_volume_jenkins_yaml" {
  depends_on = [null_resource.create_jenkins_namespace]
EOF
-----yaml 내용
EOF

 

 filename = "${path.module}/ebs-volume-jenkins.yaml"     --->  파일로 저장

 

  provisioner "local-exec" {
    command = "kubectl apply -f ${path.module}/ebs-volume-jenkins.yaml -n jenkins"     

 

 

---> 작성된 파일을 눌 리소스를 통해 커맨드로 적용

 

 

 ${path.module}: 현재 모듈의 디렉토리 경로

 

 

 

 

의존성으로는 NS jenkins 가 생성된 후 pv, pvc 가 생성되야 하므로 null_resource.create_jenkins_namespace 주입

 

출저 : https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file

 

Terraform Registry

 

registry.terraform.io

 

4. helm 리소스를 이용해 jenkins. argo-cd 설치

 

terraform-module/release/helm 를 사용 기존 포맷에 설정값만 변경하면 된다. 

 

module "jenkins" {
  depends_on = [null_resource.create_jenkins_namespace]
  source  = "terraform-module/release/helm"
  version = "2.6.0"

  namespace  = "jenkins"
  repository = "https://charts.jenkins.io"                   <----- 해당 헬름 리포지토리 주소를 입력

  app = {
    name          = "jenkins"                               <------- 생성하고자 하는 svc 의 이름과 일치시켜 변형
    version       = "5.1.5"
    chart         = "jenkins"                               

:  차트 이름은 jenkins , 헬름리포지토리에서 일치하는 chart 이름 기입
   

   force_update  = true
    wait          = false
    recreate_pods = false
    deploy        = 1
  }
  values = [templatefile("jenkins-values.yaml", {
    region                = var.main-region                              
    storage               = "10Gi"
    pvc_name              = var.jenkins_pvc
  })]

  set = [
    {
      name  = "labels.kubernetes\\.io/name"
      value = "jenkins"
    },
    {
      name  = "service.labels.kubernetes\\.io/name"
      value = "jenkins"
    },
  ]

  set_sensitive = [
    {
      path  = "controller.admin.username"                       

: 이 부분은 기존 레지스트리와 다르게 업데이트 되서 변 형,  jenkins 로그인할 때 최초 접속id : jenkins
     
 value = "jenkins"
    },

  ]

 

 

  values = [templatefile("jenkins-values.yaml", {                   
    region                = var.main-region                              
    storage               = "10Gi"
    pvc_name              = var.jenkins_pvc   

 

 

:  생성한 pvc 가 jenkins 이미지에 바인딩 되어야 하므로    jenkins-values.yaml  의 pvc_name 은 아까 생성한              jenkins-pvc 와 일치해야한다. 따라서 variables.tf 에  jenkins_pvc 에 defalut 는  jenkins-pvc 로 생성될 pvc 이름과  동일하게 작성 

                        

변수 추가 - variables.tf

variable "jenkins_pvc" {
  description = "jenkins_pvc"
  type        = string
   default     = "jenkins-pvc"
}



jenkins-values.yaml

 

controller:
  serviceType: LoadBalancer
  startupProbe:
    enabled: true
    failureThreshold: 300
    periodSeconds: 300
  jenkinsUriPrefix: "/jenkins"
persistence:
  enabled: true
  existingClaim: ${pvc_name}                     ---->  방금 pvc_name 의 출력변수를 지정. var.jenkins_pvc 이름과 일치된다.
  storageClass: gp2
  size: 30Gi
  accessMode: ReadWriteOnce

 

ingress yaml 적용하여 로드밸런서로 jenkins 구현 

resource "local_file" "ingress-jenkins_yaml" {
  depends_on = [null_resource.create_jenkins_namespace, module.jenkins]

  content  = <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins-alb
  namespace: jenkins
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:553186839963:certificate/a63aa8dd-b019-4ca6-b69c-1dce6e139bce
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
  ingressClassName: alb
  rules:
  - host: jen.seunghobet.link
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ssl-redirect
            port:
              name: use-annotation
      - path: /jenkins
        pathType: Prefix
        backend:
          service:
            name: jenkins
            port:
              number: 8080
EOF

  filename = "${path.module}/ingress-jenkins_yaml"
}

resource "null_resource" "apply_kubernetes_manifest_ingress" {
  depends_on = [null_resource.create_jenkins_namespace, local_file.ingress-jenkins_yaml]

  provisioner "local-exec" {
    command = "kubectl apply -f ${path.module}/ingress-jenkins_yaml -n jenkins"
  }
}
 


                                                                                 
                                                                                       



백앤드 path 의 /jenkins 는  jenkins-values.yaml 의 uriprefix 와 일치해야 하며 helm 으로 설치 지정한 name jenkins 와 일치.

 

 

 

'Iac' 카테고리의 다른 글

EKS - jenkins - ArgoCD 인프라 구축 -Terraform -(2)  (0) 2024.04.18
테라폼으로 eks 구축하기  (0) 2024.03.31
테라폼으로 eks 구축하기  (0) 2024.03.31

관련글 더보기