본문 바로가기
개발 및 운영/Kubernetes

gitlab-ce kubernetes 자동 백업

by Joseph.Lee 2021. 9. 2.

Gitlab Backup 설정은 아래 링크를 참고한다:

- https://docs.gitlab.com/ee/raketasks/backup_restore.html

S3 API를 지원하기 때문에 S3에 백업하거나, On-premise라면 NAS에 minio설치해서 S3 API로 백업할 수도 있다.

 

gitlab을 Kubernetes에서 사용 할 경우 crontab을 사용할 수 없어 기본적으론 수동으로 gitlab 파드 안에 들어가서 gitlab-backup create 명령을 수행해주어야 한다.

하지만 이건 번거로우니... Kubernetes의 CronJob을 통해 이를 자동화한다.

 

주의 사항

gitlab이 statefulset 으로 만들어 져야 한다. deployment 으로 만드는 경우 pod이름이 random하게 생성되기 때문에 role 정의가 불가하다.

Role의 resourceNames에 wildcard를 쓸 수 있으면 좋을려만... K8s에서는 그럴 생각은 없어 보인다. 관련 논의: https://github.com/kubernetes/kubernetes/issues/56582

 

1. Service Account 생성

$ kubectl -n YOUR_GITLAB_NAMESPACE create sa gitlab-backup-job

2. Role 및 RoleBinding 생성

kind: Role
metadata:
  namespace: YOUR_GITLAB_NAMESPACE
  name: gitlab-pod-executor
rules:
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create"]
  resourceNames: ["gitlab-0"] # Gitlab Pod 이름을 적어준다.
- apiGroups: [""]
  resources: ["deployments", "statefulsets"]
  verbs: ["list", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: gitlab-backup-job-binding
  namespace: YOUR_GITLAB_NAMESPACE
subjects:
- kind: ServiceAccount
  name: gitlab-backup-job
roleRef:
  kind: Role
  name: gitlab-pod-executor
  apiGroup: rbac.authorization.k8s.io

3. CronJob 생성

kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: gitlab-backup-cronjob
  namespace: YOUR_GITLAB_NAMESPACE
spec:
  schedule: 0 3 * * *
  concurrencyPolicy: Allow
  suspend: false
  jobTemplate:
    metadata:
      creationTimestamp: null
      labels:
        job: gitlab-backup-cronjob
    spec:
      template:
        metadata:
          creationTimestamp: null
          labels:
            job: gitlab-backup-cronjob
        spec:
          restartPolicy: OnFailure
          serviceAccountName: gitlab-backup-job
          containers:
            - name: main
              image: 'bitnami/kubectl:latest'
              command:
                - kubectl
                - '-n'
                - YOUR_GITLAB_NAMESPACE
                - exec
                - 'statefulset/gitlab' # 수정
                - '-c'
                - gitlab # 수정 (컨테이너 여러개 있다면. 없으면 -c gitlab 지워도 됌)
                - '--'
                - 'gitlab-backup'
                - 'create'
              resources: {}
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              imagePullPolicy: IfNotPresent
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 3
반응형

댓글