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

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

설치 후 저장소 변경은 수동으로 클러스터 관리자가 처리해야 합니다. 설치 후 이러한 볼륨의 자동 관리는 GitLab 차트에서 처리되지 않습니다.

초기 설치 후 자동으로 관리되지 않는 변경 사항의 예시:

  • 파드에 다른 볼륨 장착
  • 유효한 accessModes 또는 저장소 클래스 변경
  • 볼륨 크기 확장*1

1 Kubernetes 1.11에서는 볼륨 크기 확장이 지원됩니다. 이는 저장소 클래스에서 allowVolumeExpansion을 true로 구성한 경우입니다.

이는 변경이 까다로운 이유로 자동화된 변화입니다:

  1. Kubernetes가 기존 지속적 볼륨 클레임의 대부분 필드를 수정하는 것을 허용하지 않습니다.
  2. 수동으로 구성하지 않는 한 (저장소 가이드), PVC는 동적으로 프로비저닝된 지속적 볼륨에 대한 유일한 참조입니다.
  3. Delete는 동적으로 프로비저닝된 지속적 볼륨의 기본 재클레임 정책입니다.

즉, 변경 사항을 적용하려면 지속적 볼륨 클레임을 삭제하고 변경된 내용으로 새로 만들어야 합니다. 그러나 기본 재클레임 정책으로 인해 지속적 볼륨 클레임을 삭제하면 지속적 볼륨 및 하부 디스크가 삭제될 수 있습니다. 또한 적절한 volumeNames 및/또는 labelSelectors로 구성되지 않은 경우 차트는 연결할 볼륨을 알 수 없습니다.

본 프로세스를 더욱 쉽게 만들기 위한 노력을 계속하겠지만, 현재로서는 저장소 변경을 위해 수동 프로세스를 따라야 합니다.

GitLab 볼륨 찾기

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

kubectl --namespace <namespace> get PersistentVolumeClaims -l release=<chart release name> -ojsonpath='{range .items[*]}{.spec.volumeName}{"\t"}{.metadata.labels.app}{"\n"}{end}'
  • <namespace>는 GitLab 차트를 설치한 네임스페이스로 대체되어야 합니다.
  • <chart release name>은 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에서 업데이트해야 합니다.

변경을 수행하기 전에, 지속적 볼륨이 변경 사항을 적용하는 동안 삭제되지 않도록 Retain 재클레임 정책을 사용하는지 확인해야 합니다.

먼저, 사용 중인 볼륨/클레임을 찾으세요(#GitLab-볼륨-찾기).

그 다음, 각 볼륨을 편집하여 spec 필드 아래의 persistentVolumeReclaimPolicy 값을 Delete가 아닌 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 팟에서 사용하기 위해 디스크 크기를 확장하려는 경우에만 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

이제 변경 사항이 볼륨에 반영되었으므로 claim을 업데이트해야 합니다.

PersistentVolumeClaim에 변경 사항을 적용하는 지침에 따라 진행하세요.

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

다른 터미널에서 claim의 상태가 바인딩되는지 확인하기 위해 감시를 시작한 후, 새 클레임에서 사용 가능한 볼륨을 만들기 위해 다음 단계로 이동하세요.

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

볼륨에 변경 사항을 반영한 직후에, 클레임 상태를 감시하는 터미널에서 Bound로 나타나야 합니다.

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

다른 볼륨으로 전환이

새로운 볼륨을 사용하도록 전환하려면, 해당 이전 볼륨의 데이터 복사본이 있는 디스크를 사용하여 먼저 Kubernetes에서 새 지속적 볼륨을 생성해야 합니다.

디스크에 대한 지속적 볼륨을 생성하려면, 저장소 유형에 대한 드라이버별 문서를 찾아야 합니다. 시작점으로 동일한 저장소 클래스의 기존 지속적 볼륨을 사용할 수 있습니다:

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

실제 원하는 것은 다음과 같이 지속적 볼륨을 생성하는 것입니다:

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

보통 로컬 yaml 파일에 지속적 볼륨 정보를 생성한 후, 파일을 사용하여 Kubernetes에 객체를 생성하는 명령어를 내리게 됩니다.

kubectl --namespace <your namespace> create -f <local-pv-file>.yaml

볼륨을 생성한 후에 지속적 볼륨 클레임을 수정할 수 있습니다.

지속적 볼륨 클레임 수정

변경하려는 지속적 볼륨 클레임을 찾아보세요.

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 차트를 설치할 때 사용한 이름으로 대체해야 합니다.

해당 명령어는 지속적 볼륨 클레임 이름 목록을 출력한 뒤, 해당 서비스의 이름을 표시합니다.

그런 다음 클레임의 복사본을 로컬 파일 시스템에 저장하세요:

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

이제 이전 클레임을 삭제하세요:

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

삭제가 완료되도록 finalizers를 지워야 할 수도 있습니다:

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

새 클레임을 생성하세요:

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

클레임을 이전에 바인딩된 동일한 지속적 볼륨에 바인딩하는 경우, 볼륨을 클레임에 바인딩하도록 업데이트하세요.

그렇지 않고 새로운 볼륨에 클레임을 바인딩한 경우, GitLab 차트에 변경 적용로 이동하세요.

GitLab 차트에 변경 사항 적용하기

PersistentVolumesPersistentVolumeClaims에 변경 사항을 적용한 후, 차트 설정도 반영된 Helm 업데이트를 하고 싶어할 것입니다.

옵션에 대한 자세한 내용은 설치 스토리지 가이드를 참조하세요.

참고: Gitaly 볼륨 클레임에 변경 사항을 적용했다면, Helm 업데이트를 발행하기 전에 Gitaly StatefulSet을 삭제해야 합니다. 이는 StatefulSet의 볼륨 템플릿이 변경할 수 없는 immutable하며 변경할 수 없기 때문입니다.

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 \
  <업데이트된 다른 구성 설정>