지속적인 볼륨과 함께 GitLab 차트 구성

일부 포함된 서비스들은 꾸준한 저장소가 필요한데, 이는 귀하의 클러스터가 접근 가능한 디스크를 지정하는 지속적인 볼륨(Persistent Volumes)을 통해 구성됩니다. 본 차트를 설치하는 데 필요한 저장 구성에 대한 설명은 저장 가이드에서 찾을 수 있습니다.

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

초기 설치 후 자동으로 관리되지 않는 변경의 예시는 다음과 같습니다:

1 Kubernetes 1.11에서는 볼륨의 저장 용량을 확장하는 것이 지원되며, 이는 귀하의 저장소 클래스(Storage Class)에서 allowVolumeExpansion이 true로 구성되어 있는 경우 가능합니다.

이는 변경 사항을 적용하려면 지속적인 볼륨(Permanent Volume Claim)의 대부분의 필드를 변경할 수 없는 Kubernetes의 제한 때문에 복잡합니다. 또한, 수동으로 구성되지 않은 경우 PVC(지속적인 볼륨 클레임)은 동적으로 제공된 지속적인 볼륨(Persistent Volumes)에 대한 유일한 참조입니다. 또한, 동적으로 제공된 지속적인 볼륨(Persistent Volumes)에 대한 Delete가 기본 재할당 정책(reclaimPolicy)입니다.

이는 변경 사항을 적용하기 위해 지속적인 볼륨(Permanent Volume Claim)을 삭제하고 변경된 내용을 반영한 새로운 것으로 대체해야 한다는 것을 뜻합니다. 그러나 기본 재할당 정책(reclaimPolicy)으로 인해 지속적인 볼륨 클레임(Permanent Volume Claim)을 삭제하면 지속적인 볼륨(Persistent Volumes)과 기본 디스크가 삭제될 수 있습니다. 또한, 적합한 volumeNames 및/또는 labelSelectors로 구성되지 않은 경우 차트는 연결할 볼륨을 알지 못합니다.

본 프로세스를 더욱 쉽게 만들기 위해 노력하고 있지만, 현재로서는 저장소의 변경을 위해 수동 프로세스가 필요합니다. ## GitLab 볼륨 찾기

사용 중인 볼륨/클레임을 찾으세요: shell 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 차트를 설치하는 데 사용한 이름으로 대체되어야 합니다.

명령어는 볼륨 이름을 리스트한 후 해당 서비스의 이름이 뒤따릅니다.

예시: shell $ 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에서 업데이트되어야 할 수 있습니다.

변경 사항을 적용하기 전에 귀하의 지속적인 볼륨(Persistent Volumes)이 변경되지 않도록 재보관(reclaimPolicy)보유(Retain)로 사용하고 있는지 확인해야 합니다.

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

다음으로, 각 볼륨을 편집하고 spec필드 아래의 persistentVolumeReclaimPolicy 값을 Delete 대신 Retain으로 변경해야 합니다.

예시: shell 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에서 디스크 크기를 조정하거나, 스냅샷이나 복제본에서 새 디스크를 생성하는 등).

이를 하는 방법 및 작업 중단 없이 실시할 수 있는지 여부는 사용 중인 스토리지 솔루션에 따라 다르며, 이 문서에서 다룰 수 없습니다.

다음으로, Kubernetes 객체에 이러한 변경 사항이 반영되어야 하는지를 평가하십시오. 예를 들어, 디스크 저장소 크기를 확장하는 경우, PersistentVolumeClaim의 저장소 크기 설정은 새로운 볼륨 리소스를 요청할 때만 사용됩니다. 따라서 추가 Gitaly 파드에서 사용하기 위해 디스크를 확장하려는 경우에만 PersistentVolumeClaim의 값을 증가해야 합니다.

Kubernetes에서 변경 사항이 반영되어야 하는 경우, 스토리지 변경 사항을 만들기 전에 섹션에 설명된대로 볼륨의 재클레임 정책을 업데이트했는지 확인하십시오.

스토리지 변경에 대해 문서화된 경로는 다음과 같습니다.

기존 볼륨의 변경 사항

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

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

이 명령은 PersistentVolumeClaim 이름 목록을 인쇄한 후 이에 해당하는 서비스의 이름을 인쇄합니다.

그런 다음 클레임의 사본을 로컬 파일 시스템에 저장합니다.

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

예시 출력:

...
(기존 클레임 정보)
...

새 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 파일>

이전에 클레임에 바인딩된 동일한 지속적인 볼륨에 바인딩하는 경우 이제 클레임에 바인딩할 볼륨을 업데이트할 차례입니다.

그렇지 않고 클레임을 새 볼륨에 바인딩했다면 GitLab 차트에 변경 사항을 적용하기위해 진행합니다.

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

고정 볼륨PersistentVolumeClaims에 변경 사항을 적용한 후에는 해당 변경 사항이 적용된 차트 설정으로 Helm 업데이트를 발행해야 합니다.

옵션에 대해서는 설치 스토리지 가이드를 참조하세요.

참고: Gitaly 볼륨 클레임을 수정한 경우 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>