永続ボリュームを使ったGitLab Chartの設定

含まれるサービスの中には永続的なストレージを必要とするものがあり、クラスターがアクセスできるディスクを指定する永続ボリュームを通して設定します。このChartをインストールするために必要なストレージ設定に関するドキュメントはストレージガイドにあります。

インストール後のストレージの変更は、クラスター管理者が手動で行う必要があります。インストール後のこれらのボリュームの自動管理は、GitLabチャートでは扱えません。

初期インストール後に自動管理されない変更の例には以下が含まれます:

  • ポッドへの異なるボリュームのマウント
  • 有効なアクセスモードまたはストレージクラスの変更
  • ボリュームのストレージサイズを拡張する*1

1 Kubernetes 1.11では、Storage ClassでallowVolumeExpansion をtrueに設定すると、ボリュームのストレージサイズの拡張がサポートされます。

これらの変更を自動化するのは、以下の理由で複雑です:

  1. Kubernetesでは、既存のPersistentVolumeClaimのほとんどのフィールドを変更できません。
  2. 手動で設定しない限り、PVCは動的にプロビジョニングされたPersistentVolumeへの唯一の参照です。
  3. 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.namemetadata.labelsmetadata.namespacespec フィールド(更新が適用されています)を使用し、他の設定を削除します:

使用例:

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 チャートに変更を適用します。

PersistentVolumesPersistentVolumeClaims に変更を加えた後、チャートの設定にも変更を適用して 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>