永続ボリュームを使ったGitLab Chartの設定
含まれるサービスの中には永続的なストレージを必要とするものがあり、クラスターがアクセスできるディスクを指定する永続ボリュームを通して設定します。このChartをインストールするために必要なストレージ設定に関するドキュメントはストレージガイドにあります。
インストール後のストレージの変更は、クラスター管理者が手動で行う必要があります。インストール後のこれらのボリュームの自動管理は、GitLabチャートでは扱えません。
初期インストール後に自動管理されない変更の例には以下が含まれます:
- ポッドへの異なるボリュームのマウント
- 有効なアクセスモードまたはストレージクラスの変更
- ボリュームのストレージサイズを拡張する*1
1 Kubernetes 1.11では、Storage ClassでallowVolumeExpansion
をtrueに設定すると、ボリュームのストレージサイズの拡張がサポートされます。
これらの変更を自動化するのは、以下の理由で複雑です:
- Kubernetesでは、既存のPersistentVolumeClaimのほとんどのフィールドを変更できません。
- 手動で設定しない限り、PVCは動的にプロビジョニングされたPersistentVolumeへの唯一の参照です。
-
Delete
は、動的にプロビジョニングされたPersistentVolumesのデフォルトのreclaimPolicyです。
つまり、変更を加えるには、PersistentVolumeClaimを削除して、変更内容で新しいものを作成する必要があります。しかし、デフォルトのreclaimPolicy のため、PersistentVolumeClaimを削除すると、PersistentVolumeと基礎となるディスクが削除される可能性があります。また、適切な volumeNames および/または labelSelectors を設定しない限り、Chart はアタッチするボリュームがわかりません。
このプロセスをより簡単にするための検討を続けますが、今のところ、ストレージに変更を加えるには手動プロセスに従う必要があります。
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をインストールしたネームスペースに置き換えてください。 -
<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
の値を、Retain
に変更します。Delete
使用例:
kubectl --namespace helm-charts-win edit PersistentVolume pvc-6247502b-8c2d-11e8-8267-42010a9a0113
出力の編集:
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
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
# Changed the following line
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
出力の編集:
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
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:
# Updated the storage size
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>
出力の編集:
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
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を作成するには、ストレージタイプのドライバ固有のドキュメントを見つける必要があります。同じストレージクラスの既存のPersistent Volumeを出発点として使用するとよいでしょう:
kubectl --namespace <namespace> get PersistentVolume <volume name> -o yaml > <volume name>.bak.yaml
ドライバのドキュメントを参照する際には、いくつか注意すべき点があります:
- ドライバを使用してPersistent Volumeを作成する必要がありますが、多くのドキュメントに記載されているようなボリュームを持つポッド・オブジェクトではありません。
- ボリュームのPersistentVolumeClaimは作成しないでください。
ドライバのドキュメントには、多くの場合、ドライバをポッドで使用する例などが記載されています:
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
# This GCE PD must already exist.
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
通常は、PersistentVolume情報を含むyaml
ファイルをローカルに作成し、Kubernetesにcreateコマンドをイシューして、そのファイルを使用してオブジェクトを作成します。
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をインストールしたネームスペースに置き換えてください。 -
<chart release name>
はGitLabチャートをインストールした名前に置き換えてください。
このコマンドは PersistentVolumeClaim の名前の一覧を表示し、その後にサービス名を表示します。
次に、クレームのコピーをローカル・ファイルシステムに保存します:
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:
# This is our updated field
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>
以前クレームにバインドされていたのと同じPersistentVolumeにバインドする場合は、ボリュームを更新してクレームにバインドします。
そうでない場合、クレームを新しいボリュームにバインドしたのであれば、GitLab Chartに変更を適用します。
GitLab チャートに変更を適用します。
PersistentVolumesとPersistentVolumeClaims に変更を加えた後、チャートの設定にも変更を適用して Helm アップデートをイシューします。
オプションについては、インストール・ストレージ・ガイドを参照してください。
注: Gitalyボリューム・クレームに変更を加えた場合、Helmアップデートをイシューする前にGitalyStatefulSetを削除する必要があります。これは、StatefulSetのボリュームテンプレートが不変であり、変更できないためです。
Gitalyポッドを削除せずにStatefulSetを削除することができます:
kubectl --namespace <namespace> delete --cascade=false StatefulSet <release-name>-gitaly
Helm updateコマンドでStatefulSetを再作成し、Gitalyポッドを採用して更新します。
Chartを更新し、更新された設定を含めます:
使用例:
helm upgrade --install review-update-app-h8qogp gitlab/gitlab \
--set gitlab.gitaly.persistence.size=100Gi \
<your other config settings>