GitLab 차트를 지속 볼륨으로 구성하기
포함된 서비스 중 일부는 지속적인 저장소를 요구하며, 이는 클러스터가 접근할 수 있는 디스크를 지정하는 지속 볼륨(Persistent Volumes)를 통해 구성됩니다.
이 차트를 설치하는 데 필요한 저장소 구성에 대한 문서는 저장소 가이드에서 찾을 수 있습니다.
설치 후 저장소 변경은 클러스터 관리자가 수동으로 처리해야 합니다.
설치 후 자동으로 관리되지 않는 변경 사항의 예는 다음과 같습니다:
- Pods에 다른 볼륨을 마운트하기
- 효과적인 accessModes 또는 Storage Class 변경
- 볼륨의 저장소 크기 늘리기*1
1 Kubernetes 1.11에서, 볼륨의 저장소 크기 늘리기가 지원됩니다
allowVolumeExpansion
이 Storage Class에 대해 true로 설정된 경우.
이러한 변경을 자동화하는 것은 다음과 같은 이유로 복잡합니다:
- Kubernetes는 기존 PersistentVolumeClaim의 대부분 필드 변경을 허용하지 않습니다.
- 수동으로 구성되지 않는 한, PVC는 동적으로 제공된 PersistentVolumes에 대한 유일한 참조입니다.
-
Delete
는 동적으로 제공된 PersistentVolumes에 대한 기본 reclaimPolicy입니다.
이는 변경을 수행하기 위해 PersistentVolumeClaim을 삭제하고 변경과 함께 새로 만들어야 함을 의미합니다.
하지만 기본 reclaimPolicy로 인해 PersistentVolumeClaim을 삭제하면 PersistentVolumes 및 기본 디스크가 삭제될 수 있습니다.
그리고 적절한 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에 업데이트해야 합니다.
변경하기 전에 PersistentVolumes가 Retain
reclaimPolicy를 사용하고 있는지 확인해야 합니다. 변경 사항을 진행하는 동안 삭제되지 않도록 하기 위해서입니다.
먼저, 사용 중인 볼륨/클레임 찾기를 수행하세요.
다음으로, 각 볼륨을 편집하고 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에서 디스크 크기 조정, 스냅샷이나 클론에서 새 디스크 생성 등).
이 작업을 수행하는 방법과 이를 라이브로, 다운타임 없이 할 수 있는지 여부는 사용 중인 스토리지 솔루션에 따라 달라지며, 이 문서에서 다룰 수 없습니다.
다음으로, Kubernetes 객체에 이러한 변경 사항이 반영되어야 하는지 평가하세요. 예를 들어: 디스크 스토리지 크기를 확장하는 경우, PersistentVolumeClaim의 스토리지 크기 설정은 새 볼륨 리소스가 요청될 때만 사용됩니다. 따라서 추가 Gitaly 포드에서 사용할 더 많은 디스크를 확장할 계획이라면 PersistentVolumeClaim의 값을 증가시켜야 합니다.
Kubernetes에 변경 사항이 반영되어야 하는 경우, 저장소 변경 사항 적용 전 섹션에서 설명한 대로 볼륨의 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
이제 볼륨에 변경 사항이 반영되었으므로, 클레임을 업데이트해야 합니다.
PersistentVolumeClaim 수정하기 섹션의 지침을 따르세요.
클레임에 바인딩하려면 볼륨 업데이트
별도의 터미널에서 클레임의 상태가 바인드로 변경될 때까지 모니터링을 시작하고, 다음 단계로 나아가 새로운 클레임에서 사용 가능하도록 볼륨을 만드세요.
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에서 새로운 Persistent Volume을 생성해야 합니다.
디스크에 대한 Persistent Volume을 생성하려면, 저장소 유형에 대한 드라이버 문서를 찾아야 합니다. 동일한 Storage Class의 기존 Persistent Volume을 시작점으로 사용할 수 있습니다:
kubectl --namespace <namespace> get PersistentVolume <volume name> -o yaml > <volume name>.bak.yaml
드라이버 문서를 따를 때 염두에 두어야 할 몇 가지 사항이 있습니다:
- 많은 문서에서 볼륨이 있는 Pod 객체를 생성하는 것이 아니라, Persistent Volume을 생성하기 위해 드라이버를 사용해야 합니다.
- 볼륨에 대한 PersistentVolumeClaim을 생성하지 않아야 하며, 우리는 대신 기존 청구를 편집할 것입니다.
드라이버 문서에는 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
일반적으로 PersistentVolume 정보를 사용하여 로컬 yaml
파일을 만들고, 파일을 사용하여 Kubernetes에 객체를 생성하는 명령을 발행합니다.
kubectl --namespace <your namespace> create -f <local-pv-file>.yaml
볼륨을 생성한 후, 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}}'
새로운 청구를 생성합니다:
kubectl --namespace <namespace> create -f <new claim yaml file>
이전 청구와 이전에 바인딩된 같은 PersistentVolume에 바인딩하고 있다면, 청구에 바인딩하기 위해 볼륨 업데이트하기로 진행합니다.
그렇지 않고 새로운 볼륨에 청구를 바인딩한 경우, GitLab 차트에 변경 적용하기로 이동합니다.
GitLab 차트에 변경 사항 적용
PersistentVolumes 및 PersistentVolumeClaims에 변경을 준 후,
차트 설정에 적용된 변경 사항으로 Helm 업데이트를 발행하고 싶을 것입니다.
옵션에 대해서는 설치 스토리지 가이드를 참조하세요.
참고: Gitaly 볼륨 클레임에 변경을 했으면, Helm 업데이트를 발행하기 전에 Gitaly StatefulSet을 삭제해야 합니다. 이는 StatefulSet의 Volume 템플릿이 불변이며, 변경할 수 없기 때문입니다.
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>