티스토리 뷰

Cloud/Kubernetes

ArgoCD backup cronjob

jacobbaek Jacob_baek 2021. 6. 28. 22:10

ArgoCD에서 sync 되는 application은 CRD로 만들어지게 된다. 이말은 manifest로 관리가 가능하다는 뜻이다.
manifest 자체를 git 저장소에 저장하는 방식을 하기전 ArgoCD 의 argocd-util을 사용한 cronjob으로 manifest를
먼저 만들어내는 backup 방식에 대하여 알아보자.

Prerequites

간단하게 구현하기 위해 local storage를 이용하는 방식으로 만들어진 manifest를 host에 바로 저장하는 방식을 사용한다.

local storage class
다음 링크에 local storage class 에 대해 설명이 나와있다.

Cronjob을 이용한 Backup 수행

먼저 local storage class가 만들어져있다고 가정하고 각 host별로 생성될 pv를 사전에 생성하자.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: host001-argocd-backup
  namespace: argocd
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-sc
  local:
    path:  /data/argocd-backup
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - host001
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: host002-argocd-backup
  namespace: argocd
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-sc
  local:
    path:  /data/argocd-backup
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - host002
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: host003-argocd-backup
  namespace: argocd
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-sc
  local:
    path:  /data/argocd-backup
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - host003

이제 생성된 pv들을 control할 pvc를 생성하자.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: argocd-backup-pvc
  namespace: argocd
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-sc
  resources:
    requests:
      storage: 10Gi

생성된 pvc를 mount 하는 cronjob을 생성하자.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: argocd-backup-batch
  namespace: argocd
spec:
  schedule: "0 4 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: argocd
            image: "argocd:2.0.0"
            imagePullPolicy: IfNotPresent
            command:
            - "/bin/bash"
            - "-c"
            args:
            - "/usr/local/bin/argocd-util -n argocd export > /backup/argocd-backup-$(date +%F).yaml"
            volumeMounts:
            - name: argocd-backup-volume
              mountPath: "/backup"
          restartPolicy: OnFailure
          volumes:
          - name: argocd-backup-volume
            persistentVolumeClaim:
              claimName: argocd-backup-pvc
          securityContext:
            runAsNonRoot: true
            runAsUser: 1000
          serviceAccount: argocd-server
          serviceAccountName: argocd-server

여기서 필히 확인해둘것은 securityContext 항목이다.
현재 여기서는 runAsUser의 uid를 1000으로 지정했다.
이는 uid 1000을 사용하는 account가 매칭되는 권한을 사용한다는 의미이며 실제 mount 될 대상(각 pv들이 mount될 host에 directory)
의 권한도 맞아야 한다는 의미이다.

하여 다음과 같은 소유자를 변경해주는것이 필요하다.

[root@host1 /data/argocd-backup]# chown -R 1000. .
[root@host2 /data/argocd-backup]# chown -R 1000. .
[root@host3 /data/argocd-backup]# chown -R 1000. .

cronjob의 경우 지정된 시간에만 동작되기 때문에 이를 테스트 해보기위해서는 그 시간까지 기다려야 한다.
하여 이를 수동으로 테스트 하는 방법이 아래와 같은 명령을 통해서 가능하다.

kubectl -n argocd create job --from=cronjob/argocd-backup-batch argocd-backup-batch-manual

https://www.craftypenguins.net/how-to-trigger-a-kubernetes-cronjob-manually/

이후 실제 생성된 backup 파일을 확인해보자.

[root@deply001 ~]# ssh host001 ls /data/argocd-backup
[root@deply001 ~]# ssh host002 ls /data/argocd-backup
argocd-backup-2021-06-27.yaml
[root@deply001 ~]# ssh host003 ls /data/argocd-backup
argocd-backup-2021-06-28.yaml

pod가 생성된 node에 맞게 backup 파일이 생성되었음을 확인할 수 있다.

'Cloud > Kubernetes' 카테고리의 다른 글

How to set the Containerd config.toml on k3s  (0) 2021.07.07
Argo CD Notification with Mattermost  (0) 2021.07.06
ArgoCD backup cronjob  (0) 2021.06.28
Custom domain lookup on Kubernetes  (0) 2021.05.07
Kustomize  (0) 2021.04.19
initcontainer with multicommand  (0) 2021.04.13
댓글
댓글쓰기 폼