본문 바로가기
카테고리 없음

마이크로서비스 인프라 구축 3

by ^..^v 2022. 3. 17.
728x90
반응형

4 Argo CD 모듈

쿠버네티스 및 헬름 공급자를 사용해 깃옵스 배포 도구인 Argo CD를 설치하는 모듈을 정의

 

4.1 깃 클론

c:\msur> git clone https://github.com/naanjini/module-argo-cd.git

 

 

4.2 Argo CD 모듈 정의

C:\msur\module-argo-cd\main.tf

쿠버네티스 및 헬름 공급자 구성

# 쿠버네티스 공급자 구성
# https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs
provider "kubernetes" {
  cluster_ca_certificate = base64decode(var.kubernetes_cluster_cert_data)
  host                   = var.kubernetes_cluster_endpoint
  exec {
    api_version = "client.authentication.k8s.io/v1alpha1"
    command     = "aws-iam-authenticator"
    args        = ["token", "-i", "${var.kubernetes_cluster_name}"]
  }
}

# 헬름 공급자 구성 - 쿠버네티스 배포 도구로 분산형 쿠버네티스 애플리케이션을 패키지로 배포하는데 널리 사용
# https://registry.terraform.io/providers/hashicorp/helm/latest/docs
provider "helm" {
  kubernetes {
    cluster_ca_certificate = base64decode(var.kubernetes_cluster_cert_data)
    host                   = var.kubernetes_cluster_endpoint
    exec {
      api_version = "client.authentication.k8s.io/v1alpha1"
      command     = "aws-iam-authenticator"
      args        = ["token", "-i", "${var.kubernetes_cluster_name}"]
    }
  }
}

 

Argo CD 커뮤니티에서 제공하는 헬름 차트를 사용해 Argo CD 서버를 설치

# 네임스페이스 생성
# https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/namespace
resource "kubernetes_namespace" "argo-ns" {
  metadata {
    name = "argocd"
  }
}

# 헬름 공급자를 사용해 Argo CD를 설치
# https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release
resource "helm_release" "argocd" {
  name       = "msur"
  chart      = "argo-cd"
  repository = "https://argoproj.github.io/argo-helm"
  namespace  = "argocd"
}

 

 

4.3 입력 값 정의

C:\msur\module-argo-cd\variables.tf

variable "kubernetes_cluster_id" {
  type = string
}

variable "kubernetes_cluster_cert_data" {
  type = string
}

variable "kubernetes_cluster_endpoint" {
  type = string
}

variable "kubernetes_cluster_name" {
  type = string
}

variable "eks_nodegroup_id" {
  type = string
}

 

 

4.4 형식 지정, 작업 디렉터리 초기화, 구성 검사 

C:\msur\module-argo-cd> terraform fmt
C:\msur\module-argo-cd> terraform init
C:\msur\module-argo-cd> terraform validate

 

 

4.5 깃허브 저장소에 푸시

C:\msur\module-argo-cd> git add .
C:\msur\module-argo-cd> git commit -m "ArgoCD 모듈 구성"
C:\msur\module-argo-cd> git push origin

 

 

4.6 샌드박스 환경에 Argo CD 설치

argocd 모듈 추가

C:\kubernetes\env-sandbox\main.tf

         … (생략) … 

# GitOps 구성
module "argo-cd-server" {
  source = "git::https://github.com/naanjini/module-argo-cd.git"

  kubernetes_cluster_name      = module.aws-eks.eks_cluster_name
  kubernetes_cluster_cert_data = module.aws-eks.eks_cluster_certificate_data
  kubernetes_cluster_endpoint  = module.aws-eks.eks_cluster_endpoint
}

 

형식 지정, 작업 디렉터리 초기화, 구성 검사 

c:\msur\env-sandbox> terraform fmt
c:\msur\env-sandbox> terraform init
c:\msur\env-sandbox> terraform validate

 

릴리스 태그 지정 및 깃허브 저장소에 푸시

c:\msur\env-sandbox> git add .
c:\msur\env-sandbox> git commit -m "ArgoCD 구성"
c:\msur\env-sandbox> git push origin

c:\msur\env-sandbox> git tag -a v1.2 -m "ArgoCD 생성"
c:\msur\env-sandbox> git push origin v1.2

 

워크플로 실행 확인

 

 

4.7 샌드박스 환경 테스트

EKS 클러스터에 연결에 사용할 kubeconfig 파일을 다운로드 

 

kubeconfig 파일을 사용할 수 있도록 설정

다운로드 받은 kubeconfig.zip 파일을 압축 해제한 파일을 c:\users\로그인계정명\.kube\config 파일에 복사하거나, 압축 해제한 파일의 경로를 KUBECONFIG 환경변수의 값으로 설정

 

aws-iam-authenticator 설치

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-aws-iam-authenticator.html

  1. PowerShell 터미널 
  2. curl -o aws-iam-authenticator.exe https://amazon-eks.s3.us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/windows/amd64/aws-iam-authenticator.exe
  3. aws-iam-authenticator.exe 파일을 c:\msur 폴더로 복사
  4. PATH 환경변수에 c:\msur 추가
  5. (명령 프롬프트를 새로 실행해서) aws-iam-authenticator.exe help 동작 확인

 

노드, 클러스터, 서비스 확인 ⇒ 네트워크와 EKS 서비스가 프로비저닝 되었고 클러스터에 성공적으로 연결할 수 있음

C:\msur> kubectl get node
NAME                                         STATUS   ROLES    AGE   VERSION
ip-10-10-244-57.us-west-2.compute.internal   Ready    <none>   34m   v1.21.5-eks-9017834

C:\msur> kubectl cluster-info
Kubernetes control plane is running at https://317903107F75E2C4EB5D8CA1950142BD.gr7.us-west-2.eks.amazonaws.com
CoreDNS is running at https://317903107F75E2C4EB5D8CA1950142BD.gr7.us-west-2.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

C:\msur> kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   172.20.0.1   <none>        443/TCP   40m

 

Argo CD가 클러스터에 설치되었는지 확인

C:\msur> kubectl get pod -n argocd
NAME                                                  READY   STATUS    RESTARTS   AGE
msur-argocd-application-controller-77ddcdf99c-797gb   1/1     Running   0          38m
msur-argocd-dex-server-6c9b994fcb-fx2dw               1/1     Running   0          38m
msur-argocd-redis-5d468887df-jfdmf                    1/1     Running   0          38m
msur-argocd-repo-server-697d88d9d-x6dmv               1/1     Running   0          38m
msur-argocd-server-f694b48c6-rwlpk                    1/1     Running   0          38m

 

 

4.8 인프라 환경 정리

c:\msur\env-sandbox> terraform init
c:\msur\env-sandbox> terraform get -update
c:\msur\env-sandbox> terraform destroy

 

오류 발생 시 state를 강제로 삭제

╷
│ Error: Get "https://D93BE8321A8F938E45CEEA3AD7E85C9B.gr7.us-west-2.eks.amazonaws.com/api/v1/namespaces/argocd": getting credentials: exec: executable aws-iam-authenticator not found
│
│ It looks like you are trying to use a client-go credential plugin that is not installed.
│
│ To learn more about this feature, consult the documentation available at:
│       https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
│
│   with module.argo-cd-server.kubernetes_namespace.argo-ns,
│   on .terraform\modules\argo-cd-server\main.tf line 62, in resource "kubernetes_namespace" "argo-ns":
│   62: resource "kubernetes_namespace" "argo-ns" {
│
╵
╷
│ Error: Kubernetes cluster unreachable: Get "https://D93BE8321A8F938E45CEEA3AD7E85C9B.gr7.us-west-2.eks.amazonaws.com/version?timeout=32s": getting credentials: exec: executable aws-iam-authenticator not found
│
│ It looks like you are trying to use a client-go credential plugin that is not installed.
│
│ To learn more about this feature, consult the documentation available at:
│       https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
│
│   with module.argo-cd-server.helm_release.argocd,
│   on .terraform\modules\argo-cd-server\main.tf line 68, in resource "helm_release" "argocd":
│   68: resource "helm_release" "argocd" {
│
╵

c:\msur\env-sandbox> terraform state rm module.argo-cd-server.kubernetes_namespace.argo-ns
Removed module.argo-cd-server.kubernetes_namespace.argo-ns
Successfully removed 1 resource instance(s).

c:\msur\env-sandbox> terraform state rm module.argo-cd-server.helm_release.argocd
Removed module.argo-cd-server.helm_release.argocd
Successfully removed 1 resource instance(s).

 

다시 샌드박스 환경을 삭제

c:\msur\env-sandbox> terraform destroy
module.aws-eks.aws_iam_role.ms-node: Refreshing state... [id=sk403-003-ms-cluster-sandbox.node]
			… (생략) …
module.aws-eks.aws_eks_node_group.ms-node-group: Refreshing state... [id=sk403-003-ms-cluster-sandbox:microservices]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following
symbols:
  - destroy

Terraform will perform the following actions:
		:
Plan: 0 to add, 0 to change, 26 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes						⇐ 삭제 

module.aws-eks.aws_eks_node_group.ms-node-group: Destroying... [id=sk403-003-ms-cluster-sandbox:microservices]
			… (생략) … 
module.aws-eks.aws_iam_role.sk403-003-ms-cluster: Destruction complete after 1s

Destroy complete! Resources: 26 destroyed.

 

리소스 삭제 확인

c:\msur\env-sandbox> aws eks list-clusters
{
    "clusters": []
}

c:\msur\env-sandbox> aws ec2 describe-vpcs --filters Name=cidr,Values=10.10.0.0/16
{
    "Vpcs": []
}

c:\msur\env-sandbox> aws elbv2 describe-load-balancers
{
    "LoadBalancers": []
}
728x90
반응형

댓글