목표: 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 와 일치.
EKS - jenkins - ArgoCD 인프라 구축 -Terraform -(2) (0) | 2024.04.18 |
---|---|
테라폼으로 eks 구축하기 (0) | 2024.03.31 |
테라폼으로 eks 구축하기 (0) | 2024.03.31 |