Iac

EKS - jenkins - ArgoCD 인프라 구축 -Terraform -(2)

drogva 2024. 4. 18. 09:58

- argo 도 jenkins 설치와 거의 같다.

 

 

그러나 설치 후 수정 사항이 있어 config-map를 편집해야 한다. config-map 수정 후 유저생성, 권한부여가 한 번에 이뤄지면 애러가 발생함. 그리하여 중간에 local 도커 설치, ecr-registry-secret 생성하는 리소스 절차를 기입했다.

 

 


resource "null_resource" "patch_argo_basehref" {
  depends_on = [null_resource.create_argo_namespace, null_resource.apply_kubernetes_manifest_ingress-argo]
  provisioner "local-exec" {
    command = "kubectl patch configmap argocd-cmd-params-cm -n argocd --type merge -p '{\"data\":{\"server.basehref\":\"/argocd\"}}'"
  }
}

resource "null_resource" "patch_argo_insecure" {
  depends_on = [null_resource.create_argo_namespace, null_resource.patch_argo_basehref]
  provisioner "local-exec" {
    command = "kubectl patch configmap argocd-cmd-params-cm -n argocd --type merge -p '{\"data\":{\"server.insecure\":\"true\"}}'"
  }
}

resource "null_resource" "patch_argo_rootpath" {
  depends_on = [null_resource.create_argo_namespace, null_resource.patch_argo_insecure]
  provisioner "local-exec" {
    command = "kubectl patch configmap argocd-cmd-params-cm -n argocd --type merge -p '{\"data\":{\"server.rootpath\":\"/argocd\"}}'"
  }
}


resource "null_resource" "restart_argo_deployments" {
  depends_on = [null_resource.create_argo_namespace,null_resource.patch_argo_rootpath]
  provisioner "local-exec" {
    command = "kubectl rollout restart deployments --namespace argocd"


  }

 

- config 의 맵의 수정사항.  rootpath 가 원래는 /  로 되어있다. svc 생성 할 때 argocd 로 하였는데도 반영을 못해서 수정. 

 

local 도커설치 후, ecr-registry-secret 생성 후 eks    에 부여 

: 젠킨슨으로 kaniko 를 사용해 빌드 하는 경우 eks 에 kaniko -container 가 생성되어 이미지 빌드 후 ecr에 푸쉬해야하므로 그 접근 권한이 필요하다. 그래서 생성 

 

resource "null_resource" "install_docker" {
  depends_on = [null_resource.restart_argo_deployments]
  provisioner "local-exec" {
    command = <<-EOT
      # Docker 설치
      sudo yum -y install docker

      # Docker 서비스 시작
      sudo service docker start

      # 현재 사용자를 docker 그룹에 추가
      sudo usermod -aG docker $(whoami)

      # AWS ECR에 로그인
      aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 553186839963.dkr.ecr.ap-northeast-2.amazonaws.com
    EOT
  }
}

resource "null_resource" "create_kpop_namespace" {
  provisioner "local-exec" {
    command = "kubectl create ns kpop"
  }
  depends_on = [null_resource.install_docker]
}

resource "null_resource" "create_ecr_secret_kpop" {
  provisioner "local-exec" {
    command = <<-EOT
      # 스크립트 파일을 만듭니다.
      echo "#!/bin/bash" > create_ecr_secret_kpop.sh
      echo "ecr_token=\$(aws ecr get-login-password --region ap-northeast-2)" >> create_ecr_secret_kpop.sh
      echo "kubectl create secret docker-registry ecr-registry-secret \\" >> create_ecr_secret_kpop.sh
      echo "  --docker-server=553186839963.dkr.ecr.ap-northeast-2.amazonaws.com \\" >> create_ecr_secret_kpop.sh
      echo "  --docker-username=AWS \\" >> create_ecr_secret_kpop.sh
      echo "  --docker-password=\$ecr_token \\" >> create_ecr_secret_kpop.sh
      echo "  -n kpop" >> create_ecr_secret_kpop.sh

      # 스크립트 파일을 실행합니다.
      chmod +x create_ecr_secret_kpop.sh
      ./create_ecr_secret_kpop.sh
    EOT
  }
  depends_on = [null_resource.create_kpop_namespace]
}

resource "null_resource" "create_ecr_secret_jenkins" {
  provisioner "local-exec" {
    command = <<-EOT
      # 스크립트 파일을 만듭니다.
      echo "#!/bin/bash" > create_ecr_secret_jenkins.sh
      echo "ecr_token=\$(aws ecr get-login-password --region ap-northeast-2)" >> create_ecr_secret_jenkins.sh
      echo "kubectl create secret docker-registry ecr-registry-secret \\" >> create_ecr_secret_jenkins.sh
      echo "  --docker-server=553186839963.dkr.ecr.ap-northeast-2.amazonaws.com \\" >> create_ecr_secret_jenkins.sh
      echo "  --docker-username=AWS \\" >> create_ecr_secret_jenkins.sh
      echo "  --docker-password=\$ecr_token \\" >> create_ecr_secret_jenkins.sh
      echo "  -n jenkins" >> create_ecr_secret_jenkins.sh

      # 스크립트 파일을 실행합니다.
      chmod +x create_ecr_secret_jenkins.sh
      ./create_ecr_secret_jenkins.sh
    EOT
  }
  depends_on = [null_resource.create_kpop_namespace]
}




 

argo user 생성하기, 그리고 admin 권한 부여 하기

admin 권한은 권한 부여부분만 yaml 작성하여 적용하면 자동 구현된다.

출저 : https://loyle.medium.com/argo-cd-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%9C%A0%EC%A0%80-%EC%84%A4%EC%A0%95-899d182b1dea

 

Argo CD 설치 및 유저 설정

Argo CD 설치 및 유저 설정에 관한 내용입니다.

loyle.medium.com

 


resource "null_resource" "patch_argo_accounts" {
  depends_on = [null_resource.create_ecr_secret_jenkins]
  provisioner "local-exec" {
    command = "kubectl patch configmap argocd-cm -n argocd --type merge -p '{\"data\":{\"accounts.argo\":\"apiKey\"}}'"

  }
}






resource "local_file" "argocd-rbac" {
  depends_on = [null_resource.patch_argo_accounts]
  filename = "${path.module}/argocd-rbac.yml"
  content = <<-EOT

apiVersion: v1
data:
  policy.csv: |
    g, argo, role:admin
  policy.default: role:''
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
  namespace: argocd




EOT
}

resource "null_resource" "apply_argocd_rbac" {
  depends_on = [local_file.argocd-rbac]

  provisioner "local-exec" {
    command = "kubectl apply -f ${path.module}/argocd-rbac.yml"


  }
}

 

 

결과

 

 

argo 의 수정사항이 반영되는 모습

 

manifest 파일이 적용되는 모습이다. pv 와 pvc 는 어떤 순서로 생성되는지 상관없다. 대상 이름이 명확하다면 알아서 pvc는 일치하는 대상 pv 에 마운트된다.

 

 

ecr 시크릿 값이 자동 생성된다.

 

 

 

 

 

 

자동 생성된 argo와 jenkins

 

 

git-hub : https://github.com/drogva/terraform-eks-self-made-/tree/main

 

GitHub - drogva/terraform-eks-self-made-

Contribute to drogva/terraform-eks-self-made- development by creating an account on GitHub.

github.com