Argocd를 사용하여 helm chart 배포 및 주의사항
1. helm repo 사용
Application CRD
# applications.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: tomcat
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: apps
source:
repoURL: https://charts.bitnami.com/bitnami
chart: tomcat
targetRevision: "10.1.21"
destination:
namespace: tomcat
server: "https://kubernetes.default.svc"
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
argocd에서는 helm repo에서 바로 chart를 땡겨올 수 있습니다.
저는 bitnami repo 에서 tomcat chart를 땡겨오겠습니다.
source에서 설정을 해야 합니다.
repoURL: helm repo 지정
chart: chart 지정
targetRevision: chart의 버전 지정
+ 커스터마이징 values 추가하는 방법
# applications.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: tomcat
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: apps
source:
repoURL: https://charts.bitnami.com/bitnami
chart: tomcat
targetRevision: "10.1.21"
helm:
values: |-
nameOverride: "tomcat"
destination:
namespace: tomcat
server: "https://kubernetes.default.svc"
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
application yaml에 spec.source.helm.values를 사용하면 커스터마이징 values 값을 사용할 수 있습니다.
values.yaml의 규격을 그대로 사용해야 합니다.
위의 정보는 Artifact Hub에서 install을 클릭하여 확인할 수 있습니다.
순서대로 helm repo, chart name, chart version입니다.
위의 정보를 넣으시면 됩니다.
kubectl apply -f applications.yaml
kubectl apply 명령어를 사용하여 배포하면 됩니다.
대시보드에서 tomcat 이 생성된 것을 확인할 수 있습니다.
2. 개인 github 사용
Application CRD
# applications.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: tomcat
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: apps
source:
path: charts/tomcat
repoURL: https://github.com/jenana-devops/argocd-demo.git
targetRevision: HEAD
destination:
namespace: tomcat
server: "https://kubernetes.default.svc"
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
두 번째 방법은 helm chart를 개인 깃헙에 가져와서 사용하는 방법입니다.
깃헙의 charts 폴더 하위에 tomcat helm chart 가 위치하므로 이를 path로 지정합니다.
깃헙 소스코드는 아래 주소에서 확인할 수 있습니다.
https://github.com/jenana-devops/argocd-demo.git
tomcat namespace에 리소스가 생성된 것을 확인할 수 있습니다.
이는 values file을 커스터마이징 하기 위함입니다.
argocd 2.3 버전 기준으로는 아직까지 helm chart와 value file을 따로 두지 못하기 때문에 어쩔 수 없이 원본 차트를 땡겨와야하는 경우도 생깁니다. 이러면 오픈소스가 버전업 될 때마다 git push를 해야 하는데 귀찮은 과정입니다.
해당 이슈: https://github.com/argoproj/argo-cd/issues/2789
Argocd Release Version 2.6에서부터 드디어 Multiple Sources를 지원합니다!!
드디어 pull request가 merge가 됐군요 ㅎㅎ
이제 원본 helm chart와 values.yaml 파일을 각각 다른 저장소에서 땡겨올 수 있게 되었습니다.
참고: https://github.com/argoproj/argo-cd/pull/10432
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx
namespace: argocd
labels:
argocd.argoproj.io/refresh: hard
spec:
project: default
syncPolicy:
automated:
prune: true
selfHeal: true
destination:
server: https://kubernetes.default.svc
namespace: nginx
sources:
- repoURL: https://github.com/Jena98/argocd-demo.git # path is missing so no manifests are generated
targetRevision: HEAD
ref: myRepo # repo is available via symlink "myRepo"
- repoURL: https://github.com/bitnami/charts.git
targetRevision: HEAD
path: bitnami/nginx # path "bitnami/nginx" is used to generate manifests
helm:
valueFiles:
- $myRepo/values/nginx-values.yaml # "values/nginx-values.yaml" is located in source with reference name $myRepo
깃헙 코드: https://github.com/Jena98/argocd-demo/blob/master/multi-repo-application.yaml
주의 사항
argocd에서 배포한 helm 차트는 helm 배포로 등록되지 않습니다.
helm list -n tomcat 명령어를 치면 argocd로 배포한 tomcat chart 가 나타나지 않습니다.
이는 argocd 가 helm chart를 다음과 같이 배포하기 때문입니다.
helm template . <options> | kubectl apply -f -
그렇기 때문에 argocd로 helm을 배포한다면 helm 명령어를 사용할 수 없습니다.
argocd로 deploy, rollback을 해야 합니다.
+
argocd로 배포한 helm chart
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"apache","app.kubernetes.io/managed-by":"Helm","app.kubernetes.io/name":"apache","argocd.argoproj.io/instance":"apache","helm.sh/chart":"apache-9.0.14"},"name":"apache","namespace":"apache"},"spec":{"replicas":1,"selector":{"matchLabels":{"app.kubernetes.io/instance":"apache","app.kubernetes.io/name":"apache"}},"strategy":{"type":"RollingUpdate"},"template":{"metadata":{"labels":{"app.kubernetes.io/instance":"apache","app.kubernetes.io/managed-by":"Helm","app.kubernetes.io/name":"apache","helm.sh/chart":"apache-9.0.14"}},"spec":{"affinity":{"nodeAffinity":null,"podAffinity":null,"podAntiAffinity":{"preferredDuringSchedulingIgnoredDuringExecution":[{"podAffinityTerm":{"labelSelector":{"matchLabels":{"app.kubernetes.io/instance":"apache","app.kubernetes.io/name":"apache"}},"namespaces":["apache"],"topologyKey":"kubernetes.io/hostname"},"weight":1}]}},"containers":[{"env":[{"name":"BITNAMI_DEBUG","value":"false"}],"envFrom":null,"image":"docker.io/bitnami/apache:2.4.53-debian-10-r18","imagePullPolicy":"IfNotPresent","livenessProbe":{"failureThreshold":6,"httpGet":{"path":"/","port":"http"},"initialDelaySeconds":180,"periodSeconds":20,"successThreshold":1,"timeoutSeconds":5},"name":"apache","ports":[{"containerPort":8080,"name":"http"},{"containerPort":8443,"name":"https"}],"readinessProbe":{"failureThreshold":6,"httpGet":{"path":"/","port":"http"},"initialDelaySeconds":30,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":5},"resources":{"limits":{},"requests":{}},"securityContext":{"runAsNonRoot":true,"runAsUser":1001},"volumeMounts":null}],"hostAliases":[{"hostnames":["status.localhost"],"ip":"127.0.0.1"}],"priorityClassName":"","securityContext":{"fsGroup":1001},"volumes":null}}}}
creationTimestamp: "2022-04-25T04:37:49Z"
generation: 1
labels:
app.kubernetes.io/instance: apache
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: apache
argocd.argoproj.io/instance: apache
helm.sh/chart: apache-9.0.14
name: apache
namespace: apache
어노테이션에 kubectl.kubernetes.io/last-applied-configuration 가 붙어있습니다.
- app.kubernetes.io/instance: {{ .Release.Name }} -> application crd의 name이 release name으로 붙는다
- https://argo-cd.readthedocs.io/en/stable/user-guide/helm/#helm-release-name
helm 명령어로 설치
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
meta.helm.sh/release-name: apache-2
meta.helm.sh/release-namespace: apache
creationTimestamp: "2022-04-25T04:50:34Z"
generation: 1
labels:
app.kubernetes.io/instance: apache-2
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: apache
helm.sh/chart: apache-9.0.17
name: apache-2
namespace: apache
어노테이션에 meta.helm.sh 가 붙어있습니다.
참고
https://argo-cd.readthedocs.io/en/stable/user-guide/helm/
https://cloud.redhat.com/blog/continuous-delivery-with-helm-and-argo-cd