지속적인 볼륨을 사용하여 GitLab 차트 구성

포함된 일부 서비스는 클러스터에서 액세스할 디스크를 지정하는 지속적인 볼륨을 통해 구성된 지속적인 리포지터리가 필요합니다. 이 차트를 설치하는 데 필요한 저장 구성에 대한 문서는 우리의 저장 가이드에서 찾을 수 있습니다.

설치 후에 리포지터리가 변경되면 클러스터 관리자가 매뉴얼으로 처리해야 합니다. 설치 후 이러한 볼륨을 자동으로 관리하지 않습니다. 변경된 예시는 다음과 같습니다:

  • 파드에 다른 볼륨 장착
  • 효과적인 accessModes 또는 Storage Class 변경
  • 볼륨 크기 확장*1

1 Kubernetes 1.11에서 볼륨 크기를 확장하는 기능을 지원합니다. 이는 Storage Class에서 allowVolumeExpansion이 true로 구성된 경우에 해당합니다.

이러한 변경 사항을 자동화하는 것은 다음과 같은 이유로 복잡합니다:

  1. Kubernetes는 기존 PersistentVolumeClaim의 대부분 필드를 변경하지 못합니다.
  2. 매뉴얼으로 구성하지 않는 한, PVC가 동적으로 제공된 PersistentVolumes에 대한 유일한 참조입니다.
  3. 동적으로 제공된 PersistentVolumes에 대해 Delete가 기본 reclaimPolicy로 설정된 경우가 많습니다.

즉, 변경 사항을 적용하려면 PersistentVolumeClaim을 삭제하고 변경 내용이 적용된 새로운 요청을 생성해야 합니다. 그러나 기본 reclaimPolicy 때문에, PersistentVolumeClaim을 삭제하면 PersistentVolumes와 기본 디스크도 삭제될 수 있습니다. 또한 적절한 volumeNames 및/또는 labelSelectors로 구성되지 않은 경우, 차트는 연결해야 할 볼륨을 알 수 없습니다.

이 프로세스를 간편하게 만들기 위한 연구를 계속 진행할 것이지만 현재로서는 리포지터리를 변경하려면 매뉴얼 프로세스를 따라야 합니다.

GitLab 볼륨 찾기

사용 중인 볼륨/클레임을 찾습니다:

kubectl --namespace <네임스페이스> get PersistentVolumeClaims -l release=<차트 릴리스 이름> -ojsonpath='{range .items[*]}{.spec.volumeName}{"\t"}{.metadata.labels.app}{"\n"}{end}'
  • <네임스페이스>는 GitLab 차트를 설치한 네임스페이스로 대체되어야 합니다.
  • <차트 릴리스 이름>은 GitLab 차트를 설치할 때 사용한 이름으로 대체되어야 합니다.

명령어는 볼륨 이름 디렉터리을 인쇄한 후 해당 서비스의 이름을 표시합니다.

예시:

$ kubectl --namespace helm-charts-win get PersistentVolumeClaims -l release=review-update-app-h8qogp -ojsonpath='{range .items[*]}{.spec.volumeName}{"\t"}{.metadata.labels.app}{"\n"}{end}'
pvc-6247502b-8c2d-11e8-8267-42010a9a0113  gitaly
pvc-61bbc05e-8c2d-11e8-8267-42010a9a0113  minio
pvc-61bc6069-8c2d-11e8-8267-42010a9a0113  postgresql
pvc-61bcd6d2-8c2d-11e8-8267-42010a9a0113  prometheus
pvc-61bdf136-8c2d-11e8-8267-42010a9a0113  redis

리포지터리 변경 전

변경을 수행하는 사용자는 클러스터에 관리자 액세스 권한 및 사용 중인 리포지터리 솔루션에 적절한 액세스 권한이 있어야 합니다. 종종 변경 사항은 먼저 리포지터리 솔루션에 적용되어야 하며, 그 결과가 Kubernetes에 업데이트되어야 할 수도 있습니다.

변경을 수행하기 전에 PersistentVolumes이 변경 중에 삭제되지 않도록 Retain reclaimPolicy를 사용하고 있는지 확인해야 합니다.

먼저, 사용 중인 볼륨/클레임을 찾으세요.

다음으로, 각 볼륨을 편집하여 spec 필드 하위의 persistentVolumeReclaimPolicy 값을 삭제가 아닌 Retain으로 변경해야 합니다.

예시:

kubectl --namespace helm-charts-win edit PersistentVolume pvc-6247502b-8c2d-11e8-8267-42010a9a0113

편집 결과:

# 아래의 객체를 편집하세요. '#'으로 시작하는 줄은 무시되고, 빈 파일이면 편집이 중단됩니다. 파일을 저장하는 중 오류가 발생하면 해당 오류가 있는 파일이 다시 열립니다.
#
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubernetes.io/createdby: gce-pd-dynamic-provisioner
    pv.kubernetes.io/bound-by-controller: "yes"
    pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd
  creationTimestamp: 2018-07-20T14:58:43Z
  labels:
    failure-domain.beta.kubernetes.io/region: europe-west2
    failure-domain.beta.kubernetes.io/zone: europe-west2-b
  name: pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  resourceVersion: "48362431"
  selfLink: /api/v1/persistentvolumes/pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  uid: 650bd649-8c2d-11e8-8267-42010a9a0113
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 50Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: repo-data-review-update-app-h8qogp-gitaly-0
    namespace: helm-charts-win
    resourceVersion: "48362307"
    uid: 6247502b-8c2d-11e8-8267-42010a9a0113
  gcePersistentDisk:
    fsType: ext4
    pdName: gke-cloud-native-81a17-pvc-6247502b-8c2d-11e8-8267-42010a9a0113
# 아래의 줄을 변경하세요
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
status:
  phase: Bound

스토리지 변경하기

먼저, 클러스터 외부에서 디스크에 원하는 변경 사항을 가합니다. (GKE에서 디스크 크기 조정하거나, 스냅샷이나 클론에서 새 디스크를 만드는 등).

이렇게 하는 방법 및 견고성 여부는 사용 중인 스토리지 솔루션에 따라 다르며, 이 문서에서 다룰 수 없습니다.

다음으로, 이러한 변경 내용이 쿠버네티스 객체에 반영해야 하는지를 평가하세요. 예를 들어, 디스크 스토리지 크기를 확장하는 경우, PersistentVolumeClaim에서의 스토리지 크기 설정은 새 볼륨 리소스가 요청될 때에만 사용됩니다. 따라서 추가 Gitaly pod에서 사용할 디스크를 확장하려면 PersistentVolumeClaim의 값을 증가시키어야 합니다.

쿠버네티스에서 변경 사항을 반영해야 한다면, 변경 전 스토리지에 대한 reclaim 정책을 스토리지 변경 전 섹션에서 설명된 대로 업데이트했는지 확인하세요.

저희가 스토리지 변경에 대해 문서화한 경로는 다음과 같습니다:

기존 볼륨의 변경

먼저 변경 중인 볼륨의 이름을 찾으세요.

kubectl edit을 사용하여 볼륨에 대한 원하는 구성 변경을 수행하세요. (이러한 변경 사항은 연결된 디스크의 실제 상태를 반영하는 데 사용되어야 합니다)

예시:

kubectl --namespace helm-charts-win edit PersistentVolume pvc-6247502b-8c2d-11e8-8267-42010a9a0113

수정된 출력:

# 아래의 객체를 편집하십시오. '#'으로 시작하는 줄은 무시되며,
# 공백 파일이 편집을 중단합니다. 파일을 저장하는 도중 오류가 발생하면
# 관련 실패 사항이 있는 상태에서 파일이 다시 개방됩니다.
#
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubernetes.io/createdby: gce-pd-dynamic-provisioner
    pv.kubernetes.io/bound-by-controller: "yes"
    pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd
  creationTimestamp: 2018-07-20T14:58:43Z
  labels:
    failure-domain.beta.kubernetes.io/region: europe-west2
    failure-domain.beta.kubernetes.io/zone: europe-west2-b
  name: pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  resourceVersion: "48362431"
  selfLink: /api/v1/persistentvolumes/pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  uid: 650bd649-8c2d-11e8-8267-42010a9a0113
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    # 스토리지 크기를 업데이트했습니다
    storage: 100Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: repo-data-review-update-app-h8qogp-gitaly-0
    namespace: helm-charts-win
    resourceVersion: "48362307"
    uid: 6247502b-8c2d-11e8-8267-42010a9a0113
  gcePersistentDisk:
    fsType: ext4
    pdName: gke-cloud-native-81a17-pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
status:
  phase: Bound

이제 변경 내용이 볼륨에 반영되었으므로, 앵커를 업데이트해야 합니다.

PresistentVolumeClaim를 변경하는 방법 섹션의 지침을 따르세요.

볼륨을 클레임에 바인딩하도록 업데이트

다른 터미널에서, 클레임의 상태가 바운드로 변경되었는지 확인하고, 새 클레임에서 사용할 수 있도록 볼륨을 만들어주세요.

kubectl --namespace <namespace> get --watch PersistentVolumeClaim <claim name>

볼륨을 편집하여 새 클레임에서 사용할 수 있도록 만드세요. .spec.claimRef 섹션을 제거하세요.

kubectl --namespace <namespace> edit PersistentVolume <volume name>

수정된 출력:

# 아래의 객체를 편집하십시오. '#'으로 시작하는 줄은 무시되며,
# 공백 파일이 편집을 중단합니다. 파일을 저장하는 도중 오류가 발생하면
# 관련 실패 사항이 있는 상태에서 파일이 다시 개방됩니다.
#
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    kubernetes.io/createdby: gce-pd-dynamic-provisioner
    pv.kubernetes.io/bound-by-controller: "yes"
    pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd
  creationTimestamp: 2018-07-20T14:58:43Z
  labels:
    failure-domain.beta.kubernetes.io/region: europe-west2
    failure-domain.beta.kubernetes.io/zone: europe-west2-b
  name: pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  resourceVersion: "48362431"
  selfLink: /api/v1/persistentvolumes/pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  uid: 650bd649-8c2d-11e8-8267-42010a9a0113
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 100Gi
  gcePersistentDisk:
    fsType: ext4
    pdName: gke-cloud-native-81a17-pvc-6247502b-8c2d-11e8-8267-42010a9a0113
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
status:
  phase: Released

Volume에 변경 사항을 반영한 직후, 클레임 상태를 보고하는 터미널에서 바운드라는 상태가 표시되어야 합니다.

마지막으로, GitLab 차트에 변경 사항을 적용하세요.

다른 볼륨으로 전환

새 볼륨을 사용하도록 전환하려면, 이전 볼륨에서 적절한 데이터가 있는 디스크를 사용하는 경우 먼저 해당 디스크에 대한 새 Persistent Volume를 쿠버네티스에서 생성해야 합니다.

디스크에 대한 Persistent Volume를 만들려면 디스크 유형별 문서에서 driver specific documentation을 찾아야 합니다. 시작점으로 사용하려면 동일한 Storage Class를 가진 기존 Persistent Volume을 사용하고 싶을 수도 있습니다:

kubectl --namespace <namespace> get PersistentVolume <volume name> -o yaml > <volume name>.bak.yaml

드라이버 문서를 따를 때 주의해야 할 몇 가지 사항이 있습니다:

  • 볼륨을 만들기 위해 드라이버를 사용해야 하며, 많은 문서에서 볼륨을 사용하는 Pod 객체가 아니라고 표시됩니다.
  • 볼륨을 생성하는 것이 아니라 기존 클레임을 편집할 것입니다.

대부분의 경우 드라이버 문서에는 예를 들어 드라이버를 Pod에서 사용하는 예가 포함되어 있습니다. 예시:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    # 이 GCE PD는 이미 존재해야 합니다.
    gcePersistentDisk:
      pdName: my-data-disk
      fsType: ext4

실제로 해야 하는 것은 다음과 같이 Persistent Volume을 생성하는 것입니다:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-volume
spec:
  capacity:
    storage: 400Gi
  accessModes:
  - ReadWriteOnce
  gcePersistentDisk:
    pdName: my-data-disk
    fsType: ext4

흔히 로컬 yaml 파일에 PersistentVolume 정보를 만들고, 파일을 사용하여 Kubernetes에게 객체를 생성하도록 create 명령을 내립니다.

볼륨이 생성되면, PersistentVolumeClaim를 변경하는 방법으로 이동하세요.

PersistentVolumeClaim 변경하기

변경하고 싶은 PersistentVolumeClaim을(를) 찾으세요.

kubectl --namespace <namespace> get PersistentVolumeClaims -l release=<chart release name> -ojsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels.app}{"\n"}{end}'
  • <namespace>는 GitLab 차트를 설치한 네임스페이스로 대체되어야 합니다.
  • <chart release name>은 GitLab 차트를 설치할 때 사용한 이름으로 대체되어야 합니다.

해당 명령은 일련의 PersistentVolumeClaim 이름과 해당 서비스의 이름을 인쇄합니다.

그런 다음 claim의 사본을 로컬 파일 시스템에 저장하세요.

kubectl --namespace <namespace> get PersistentVolumeClaim <claim name> -o yaml > <claim name>.bak.yaml

예시 출력:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd
  creationTimestamp: 2018-07-20T14:58:38Z
  labels:
    app: gitaly
    release: review-update-app-h8qogp
  name: repo-data-review-update-app-h8qogp-gitaly-0
  namespace: helm-charts-win
  resourceVersion: "48362433"
  selfLink: /api/v1/namespaces/helm-charts-win/persistentvolumeclaims/repo-data-review-update-app-h8qogp-gitaly-0
  uid: 6247502b-8c2d-11e8-8267-42010a9a0113
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: standard
  volumeName: pvc-6247502b-8c2d-11e8-8267-42010a9a0113
status:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 50Gi
  phase: Bound

새 PVC 객체를 위한 새 YAML 파일을 생성하세요. metadata.name, metadata.labels, metadata.namespace, 및 spec 필드를 동일하게 사용하되 업데이트를 적용하고 다른 설정은 제거하세요:

예시:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: gitaly
    release: review-update-app-h8qogp
  name: repo-data-review-update-app-h8qogp-gitaly-0
  namespace: helm-charts-win
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      # 이것이 우리의 업데이트된 필드입니다
      storage: 100Gi
  storageClassName: standard
  volumeName: pvc-6247502b-8c2d-11e8-8267-42010a9a0113

그런 다음 이전 claim을 삭제하세요.

kubectl --namespace <namespace> delete PersistentVolumeClaim <claim name>

삭제를 완료하려면 finalizers를 지워야 할 수도 있습니다:

kubectl --namespace <namespace> patch PersistentVolumeClaim <claim name> -p '{"metadata":{"finalizers":null}}'

새로운 claim을 생성하세요:

kubectl --namespace <namespace> create -f <new claim yaml file>

이전에 claim에 바운드된 동일한 PersistentVolume에 바인딩하는 경우, 볼륨을 claim에 바인딩하도록 업데이트하세요.

그렇지 않고 새로운 볼륨에 claim을 바운드한 경우, GitLab 차트에 변경 사항 적용으로 이동하세요.

GitLab 차트에 변경 사항 적용

PersistentVolumesPersistentVolumeClaims을 변경한 후, 변경된 설정을 적용하여 Helm 업데이트를 수행해야 합니다.

옵션에 대한 설치 스토리지 가이드를 확인하세요.

참고: Gitaly volume claim을 변경한 경우, Helm 업데이트를 실행하기 전에 Gitaly StatefulSet을 삭제해야 할 수 있습니다. 이는 StatefulSet의 볼륨 템플릿이 불변이므로 변경할 수 없기 때문입니다.

Gitaly Pods를 삭제하지 않고 StatefulSet을 삭제할 수 있습니다: kubectl --namespace <namespace> delete --cascade=false StatefulSet <release-name>-gitaly Helm 업데이트 명령은 StatefulSet을 재생성하며, Gitaly pods를 채택하고 업데이트합니다.

차트를 업데이트하고 업데이트된 구성을 포함하세요:

예시:

helm upgrade --install review-update-app-h8qogp gitlab/gitlab \
  --set gitlab.gitaly.persistence.size=100Gi \
  <your other config settings>