ArgoCD와 Bootstrap 구성하기(실습)
사전 작업
Repository Clone
이번 실습에서는 2개의 Repository를 사용하게 됩니다. k8s-common-chart와 k8s-chart-value Repository를 사용하게 됩니다.
k8s-common-chart는 배포되는 공통된 helm chart들을 모아놓은 Repository입니다.
k8s-chart-value는 공통된 helm chart들에 value를 주입해서 배포할 수 있도록 구성한 Repository입니다.
k8s-common-chart는 다음 과정인 이해하기 부분에서 활용할 예정이고, value는 실습과정에서 사용하게 됩니다.
Parameter Store에 Github Token 저장
ArgoCD에서는 Github Repository에 접근을 해야합니다. 따라서 이 때 사용하기 위한 Github Token 값이 필요하게 됩니다. 이 값을 External Secrets에서 Kubernetes Secrets으로 만든 후, ArgoCD에서는 해당 Secret을 참조합니다. Parameter Store에 저장할 때 이름은 GITHUB_TOKEN
으로 지정해줍니다.
Domain 및 acm 생성
ArgoCD에서 사용할 Domain과 ACM이 필요합니다. 무료로 호스팅 받은 도메인이 있으신 분은 해당 도메인을 사용하셔도 무방하고, AWS ACM을 통해 발급받은 인증서로 ArgoCD와 HTTPS 통신을 하도록 구성합니다.
ArgoCD와 Bootstrap 변수 수정
이 두 과정은 Kustomize라는 명령어를 통해 한번에 순차적으로 구성됩니다. 이 과정에서 사용되는 Repository인 k8s-chart-value를 수정해보도록 하겠습니다.
먼저 생성한 Cluster의 이름과 동일하게 k8s-chart-value 하위의 Directory이름을 수정해줍니다. 그 다음 Directory로 이동한 후 tree 명령어를 쳐보시면 아래와 같은 구조를 볼 수 있습니다.
tree
> .
├── argocd
│ ├── kustomization.yaml
│ └── patches
│ ├── add-argocd-configmap-data.yaml
│ ├── add-argocd-configmap-notification.yaml
│ ├── add-bootstrap-variables.yaml
│ ├── add-node-affinity.yaml
│ ├── attach-external-secret-serviceaccount.yaml
│ ├── mount-argocd-dex-server-secret.yaml
│ ├── setup-argocd-slack-token.yaml
│ ├── setup-git-repository.yaml
│ ├── setup-k8s-chart-value-repository.yaml
│ ├── setup-k8s-common-chart-repository.yaml
│ ├── setup-k8s-package-chart-repository.yaml
│ └── specify-ingress-v2-host-certificate.yaml
├── karpenter-provisioner
└── netshoot.yaml
각각을 순서대로 수정해보고 적용해보도록 하겠습니다.
Kustomization.yaml 수정
Kustomization.yaml은 kustomize 명령어를 활용해서 하위의 Patches 파일들을 각 target에 맞춰서 변경해주는 기능을 하게 됩니다. 여기서 수정할 부분은 만약 k8s-common-chart를 Fork로 구성하셨다면 상단의 resources 부분의 경로를 수정해주셔야합니다.
# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
- https://github.com/DevopsArtFactory/k8s-common-chart.git/argocd?timeout
(... 생략 ...)
Repository 관련 yaml 수정
ArgoCD에서 사용되는 Github Repository에 대한 설정이 필요합니다. 여기서는 3개 yaml 중 먼저 2개의 yaml을 수정해봅니다. k8s-common-chart와 k8s-chart-value를 ArgoCD에서 접근할 수 있도록 합니다.
두 Repository를 Fork로 가져가신 경우에는 각 Repository에 접근할 수 있도록 link와 해당 Repository에 접근할 수 있는 Github Token(사전 준비과정에서 Parameter Store)을 발급한 Github User를 지정해줍니다.
# setup-k8s-common-chart-repository.yaml
# Add repository data in the ClusterSecretStore
- op: add
path: /spec/target/template/data/url
value: https://github.com/DevopsArtFactory/k8s-common-chart
# Add username of repository data in the ClusterSecretStore
- op: add
path: /spec/target/template/data/username
value: <username>
# setup-k8s-chart-value-repository.yaml
# Add repository data in the ClusterSecretStore
- op: add
path: /spec/target/template/data/url
value: https://github.com/DevopsArtFactory/k8s-chart-value
# Add username of repository data in the ClusterSecretStore
- op: add
path: /spec/target/template/data/username
value: <username>
External Secrets 관련 yaml 수정
External Secrets을 설치하고, ServiceAccount를 사용하도록 설정해야 합니다. 이 과정 또한 Kustomize를 통해서 Patch를 하게 하게 됩니다. 해당 yaml에서는 account id와 cluster 이름을 각자 환경에 맞게 수정해주시면 됩니다.
# attach-external-secret-serviceaccount.yaml
- op: add
path: /spec/source/helm/values
value: |-
serviceAccount:
name: external-secrets
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/eks-<cluster-name>-external-secrets
ArgoCD 관련 yaml 수정
사전 작업에서 생성했던 Domain과 ACM을 설정해야 ArgoCD를 Domain으로 접근할 수 있습니다. 이 때 argocd config map과 ingress관련된 설정을 해줘야합니다.
add-argocd-configmap-data.yaml
에서 사용하실 도메인을 url 부분에 설정해주시면 됩니다. 그리고 SSO를 활용하게 된다면 admin 계정은 필요 없게 되기 떄문에 admin.enabled
option을 false
로 처리해주면 됩니다. timeout.reconciliation
은 ArgoCD가 Github Repository와 Sync하는 주기로 기본은 180s입니다.
# add-argocd-configmap-data.yaml
- op: add
path: /data
value:
url: https://argocd.devart.tv
statusbadge.enabled: "true"
admin.enabled: "true"
timeout.reconciliation: "60s"
여기서는 사용하려는 도메인에 대한 Certificate를 지정하는 부분입니다. acm-arn에는 사전 준비과정에서 생성한 ACM ARN을 입력해주고 그 아래에는 ArgoCD의 Domain 을 입력해줍니다.
# specify-ingress-v2-host-certificate.yaml
# Add alb certificate annotation for changing domain
- op: add
path: /metadata/annotations/alb.ingress.kubernetes.io~1certificate-arn
value: <acm-arn>
# Add hostname annotation for changing domain
- op: add
path: /metadata/annotations/external-dns.alpha.kubernetes.io~1hostname
value: argocd.devart.tv
# Replace the host for changing domain
- op: replace
path: /spec/rules/0/host
value: argocd.devart.tv
bootstrap 관련 yml 수정
여기서는 k8s-common-chart안의 bootstrap에 적용되는 value를 지정하게 됩니다. helm value를 주입한다고 생각하시면 됩니다.
# add-bootstrap-variables.yaml
- op: add
path: /spec/source/helm
value:
values: |
clusterName: eksdapne2-aolu
accountId: "816736805842"
vpcName: eksd_apnortheast2
awsRegion: ap-northeast-2
clusterEndpoint: https://F052D9BED71FABEC184CF34D461E5434.gr7.ap-northeast-2.eks.amazonaws.com
loadBalancerControllerlogLevel: info
repoURL: https://github.com/DevopsArtFactory/k8s-chart-value
targetRevision: main
ingressACM: arn:aws:acm:ap-northeast-2:816736805842:certificate/87a9d99f-8f13-4c3e-b2be-4aef201c0e68
alb_controller:
nodeAffinity:
key: capacity_type
value: cpu_on_demand
nth:
nodeAffinity:
key: capacity_type
value: cpu_on_demand
metrics_server:
nodeAffinity:
key: capacity_type
value: cpu_on_demand
karpenter:
enabled: true
replicas: 1
enable_drift: true
enable_spotToSpotConsolidation: true
queueURL: https://sqs.ap-northeast-2.amazonaws.com/816736805842/eksdapne2-aolu-aws-node-termination-handler-queue
nodeAffinity:
key: capacity_type
value: cpu_on_demand
argoRollouts:
enabled: false
istio:
enabled: true
nodeAffinity:
key: capacity_type
value: cpu_on_demand
datadog:
enabled: false
- op: add
path: /spec/source/repoURL
value: https://github.com/DevopsArtFactory/k8s-common-chart
- op: add
path: /spec/source/targetRevision
value: main
- op: add
path: /spec/source/path
value: bootstrap
ArgoCD와 Bootstrap 적용하기
위의 변수를 각자 환경에 맞게 구성하셨다면, kustomize를 통해 생성해보도록 하겠습니다.
argocd directory로 이동한 후, kustomize build | kubectl apply -f-
명령어를 입력합니다.
kustomize build | kubectl apply -f-
>
(... 생략 ...)
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-ha-proxy-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-ha-server-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
resource mapping not found for name: "infra" namespace: "argocd" from "STDIN": no matches for kind "AppProject" in version "argoproj.io/v1alpha1"
ensure CRDs are installed first
resource mapping not found for name: "bootstrap" namespace: "argocd" from "STDIN": no matches for kind "Application" in version "argoproj.io/v1alpha1"
ensure CRDs are installed first
resource mapping not found for name: "external-secrets" namespace: "argocd" from "STDIN": no matches for kind "Application" in version "argoproj.io/v1alpha1"
ensure CRDs are installed first
resource mapping not found for name: "css-parameterstore" namespace: "argocd" from "STDIN": no matches for kind "ClusterSecretStore" in version "external-secrets.io/v1beta1"
ensure CRDs are installed first
resource mapping not found for name: "css-secretsmanager" namespace: "argocd" from "STDIN": no matches for kind "ClusterSecretStore" in version "external-secrets.io/v1beta1"
ensure CRDs are installed first
resource mapping not found for name: "k8s-chart-value-repository" namespace: "argocd" from "STDIN": no matches for kind "ExternalSecret" in version "external-secrets.io/v1beta1"
ensure CRDs are installed first
resource mapping not found for name: "k8s-common-chart-repository" namespace: "argocd" from "STDIN": no matches for kind "ExternalSecret" in version "external-secrets.io/v1beta1"
ensure CRDs are installed first
kustomize build | kubectl apply -f-
>
(... 생략 ...)
application.argoproj.io/external-secrets unchanged
clustersecretstore.external-secrets.io/css-parameterstore created
clustersecretstore.external-secrets.io/css-secretsmanager created
externalsecret.external-secrets.io/k8s-chart-value-repository created
externalsecret.external-secrets.io/k8s-common-chart-repository created
ingress.networking.k8s.io/argocd-ingress unchanged
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy configured
networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy unchanged
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy unchanged
networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy unchanged
networkpolicy.networking.k8s.io/argocd-redis-ha-proxy-network-policy unchanged
networkpolicy.networking.k8s.io/argocd-redis-ha-server-network-policy unchanged
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy configured
networkpolicy.networking.k8s.io/argocd-server-network-policy unchanged
명령어를 입력하고 바로 접속은 되지 않습니다. argoCD에서 사용하는 ALB가 provisioning되는데 시간이 1~2분 정도 걸리게 됩니다. 따라서 1~2분 이후에 지정한 도메인으로 접속을 시도해봅니다. 정상적으로 접속이 되면 아래와 같이 ArgoCD화면이 나오면서 username과 password를 입력하라고 나옵니다.
username의 기본값은 admin이고, password는 secert으로 생성되있습니다. secret은 base64로 인코딩되어 있기 때문에 Local환경에서 조회하기 위해 아래 명령어를 입력해줍니다.
kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d; echo
> xxxxxxxxxxxxx

위 명령어로 password를 조회한 후, admin/password로 로그인을 하면 아래와 같이 bootstrapping으로 생성된 Application들이 나오는 것을 확인할 수 있습니다.

Last updated