DevOps/CICD

Argocd를 사용하여 helm chart 배포 및 주의사항

Jen'_' 2022. 4. 25. 23:28
반응형

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에 리소스가 생성된 것을 확인할 수 있습니다.

cli
ui

 

 

이는 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 -​

참고: https://argo-cd.readthedocs.io/en/stable/faq/#after-deploying-my-helm-application-with-argo-cd-i-cannot-see-it-with-helm-ls-and-other-helm-commands

 

그렇기 때문에 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 가 붙어있습니다.

 

 

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

반응형