使用持久卷配置极狐GitLab chart

一些包含的服务需要持久存储,通过持久卷进行配置,这些持久卷指定了集群可以访问的磁盘。有关安装此图所需的存储配置的文档可以在我们的存储指南中找到。

安装后的存储更改需要由集群管理员手动处理。安装后,这些卷的自动化管理不由极狐GitLab图表处理。

初始安装后未自动管理的更改示例包括:

  • 将不同的卷挂载到 Pod
  • 更改有效的 accessModes 或 存储类
  • 扩展卷的存储大小*1

1 在 Kubernetes 1.11 中,支持扩展卷的存储大小,如果在存储类中将 allowVolumeExpansion 配置为 true。

由于以下原因,自动化这些更改很复杂:

  1. Kubernetes 不允许更改现有 PersistentVolumeClaim 中的大多数字段
  2. 除非手动配置,否则 PVC 是动态配置的唯一参考 PersistentVolumes
  3. Delete 是动态配置的 PersistentVolumes 的默认 reclaimPolicy

这意味着要进行更改,我们需要删除 PersistentVolumeClaim 并使用我们的更改创建一个新的。但由于默认的 reclaimPolicy,删除 PersistentVolumeClaim 可能会删除 PersistentVolumes 和底层磁盘。除非配置了适当的 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
1$ kubectl --namespace helm-charts-win get PersistentVolumeClaims -l release=review-update-app-h8qogp -ojsonpath='{range .items[*]}{.spec.volumeName}{"\t"}{.metadata.labels.app}{"\n"}{end}' 2pvc-6247502b-8c2d-11e8-8267-42010a9a0113 gitaly 3pvc-61bbc05e-8c2d-11e8-8267-42010a9a0113 minio 4pvc-61bc6069-8c2d-11e8-8267-42010a9a0113 postgresql 5pvc-61bcd6d2-8c2d-11e8-8267-42010a9a0113 prometheus 6pvc-61bdf136-8c2d-11e8-8267-42010a9a0113 redis

在进行存储更改之前#

进行更改的人需要对集群具有管理员访问权限,并对正在使用的存储解决方案具有适当的访问权限。通常,更改首先需要在存储解决方案中应用,然后需要在 Kubernetes 中更新结果。

在进行更改之前,您应确保您的 PersistentVolumes 使用 Retain reclaimPolicy,以便在您进行更改时不会被删除。

首先,找到正在使用的卷/声明

接下来,编辑每个卷并更改 spec 字段下 persistentVolumeReclaimPolicy 的值,将其设置为 Retain 而不是 Delete

例如:

shell
kubectl --namespace helm-charts-win edit PersistentVolume pvc-6247502b-8c2d-11e8-8267-42010a9a0113

编辑输出:

yaml
1# 请编辑下面的对象。以 '#' 开头的行将被忽略, 2# 并且空文件将中止编辑。如果在保存文件时发生错误,将重新打开该文件以显示相关的失败。 3# 4apiVersion: v1 5kind: PersistentVolume 6metadata: 7 annotations: 8 kubernetes.io/createdby: gce-pd-dynamic-provisioner 9 pv.kubernetes.io/bound-by-controller: "yes" 10 pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd 11 creationTimestamp: 2018-07-20T14:58:43Z 12 labels: 13 failure-domain.beta.kubernetes.io/region: europe-west2 14 failure-domain.beta.kubernetes.io/zone: europe-west2-b 15 name: pvc-6247502b-8c2d-11e8-8267-42010a9a0113 16 resourceVersion: "48362431" 17 selfLink: /api/v1/persistentvolumes/pvc-6247502b-8c2d-11e8-8267-42010a9a0113 18 uid: 650bd649-8c2d-11e8-8267-42010a9a0113 19spec: 20 accessModes: 21 - ReadWriteOnce 22 capacity: 23 storage: 50Gi 24 claimRef: 25 apiVersion: v1 26 kind: PersistentVolumeClaim 27 name: repo-data-review-update-app-h8qogp-gitaly-0 28 namespace: helm-charts-win 29 resourceVersion: "48362307" 30 uid: 6247502b-8c2d-11e8-8267-42010a9a0113 31 gcePersistentDisk: 32 fsType: ext4 33 pdName: gke-cloud-native-81a17-pvc-6247502b-8c2d-11e8-8267-42010a9a0113 34# 更改以下行 35 persistentVolumeReclaimPolicy: Retain 36 storageClassName: standard 37status: 38 phase: Bound

进行存储更改#

首先,在集群外对磁盘进行所需的更改。(在 GKE 中调整磁盘大小,或从快照或克隆创建新磁盘等)

如何执行此操作,以及是否可以在不中断的情况下执行,取决于您使用的存储解决方案,并且无法在本文档中涵盖。

接下来,评估是否需要在 Kubernetes 对象中反映这些更改。例如:在扩展磁盘存储大小时,PersistentVolumeClaim 中的存储大小设置仅在请求新卷资源时使用。因此,只有在打算扩展更多磁盘(用于附加 Gitaly pod)时,才需要增加 PersistentVolumeClaim 中的值。

如果确实需要在 Kubernetes 中反映更改,请确保已按照在进行存储更改之前部分中的描述更新了卷上的回收策略。

我们记录的存储更改路径是:

更改现有卷#

首先定位您正在更改的卷名称

使用 kubectl edit 对卷进行所需的配置更改。(这些更改应仅为更新以反映附加磁盘的真实状态)

例如:

shell
kubectl --namespace helm-charts-win edit PersistentVolume pvc-6247502b-8c2d-11e8-8267-42010a9a0113

编辑输出:

yaml
1# 请编辑下面的对象。以 '#' 开头的行将被忽略, 2# 并且空文件将中止编辑。如果在保存文件时发生错误,将重新打开该文件以显示相关的失败。 3# 4apiVersion: v1 5kind: PersistentVolume 6metadata: 7 annotations: 8 kubernetes.io/createdby: gce-pd-dynamic-provisioner 9 pv.kubernetes.io/bound-by-controller: "yes" 10 pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd 11 creationTimestamp: 2018-07-20T14:58:43Z 12 labels: 13 failure-domain.beta.kubernetes.io/region: europe-west2 14 failure-domain.beta.kubernetes.io/zone: europe-west2-b 15 name: pvc-6247502b-8c2d-11e8-8267-42010a9a0113 16 resourceVersion: "48362431" 17 selfLink: /api/v1/persistentvolumes/pvc-6247502b-8c2d-11e8-8267-42010a9a0113 18 uid: 650bd649-8c2d-11e8-8267-42010a9a0113 19spec: 20 accessModes: 21 - ReadWriteOnce 22 capacity: 23 # 更新存储大小 24 storage: 100Gi 25 claimRef: 26 apiVersion: v1 27 kind: PersistentVolumeClaim 28 name: repo-data-review-update-app-h8qogp-gitaly-0 29 namespace: helm-charts-win 30 resourceVersion: "48362307" 31 uid: 6247502b-8c2d-11e8-8267-42010a9a0113 32 gcePersistentDisk: 33 fsType: ext4 34 pdName: gke-cloud-native-81a17-pvc-6247502b-8c2d-11e8-8267-42010a9a0113 35 persistentVolumeReclaimPolicy: Retain 36 storageClassName: standard 37status: 38 phase: Bound

现在更改已在中反映,我们需要更新声明

请按照更改 PersistentVolumeClaim部分中的说明进行操作。

更新卷以绑定声明#

在一个单独的终端中,开始观察何时声明的状态更改为绑定,然后继续下一步以使卷可用于新声明。

shell
kubectl --namespace <namespace> get --watch PersistentVolumeClaim <claim name>

编辑卷以使其可用于新声明。删除 .spec.claimRef 部分。

shell
kubectl --namespace <namespace> edit PersistentVolume <volume name>

编辑输出:

yaml
1# 请编辑下面的对象。以 '#' 开头的行将被忽略, 2# 并且空文件将中止编辑。如果在保存文件时发生错误,将重新打开该文件以显示相关的失败。 3# 4apiVersion: v1 5kind: PersistentVolume 6metadata: 7 annotations: 8 kubernetes.io/createdby: gce-pd-dynamic-provisioner 9 pv.kubernetes.io/bound-by-controller: "yes" 10 pv.kubernetes.io/provisioned-by: kubernetes.io/gce-pd 11 creationTimestamp: 2018-07-20T14:58:43Z 12 labels: 13 failure-domain.beta.kubernetes.io/region: europe-west2 14 failure-domain.beta.kubernetes.io/zone: europe-west2-b 15 name: pvc-6247502b-8c2d-11e8-8267-42010a9a0113 16 resourceVersion: "48362431" 17 selfLink: /api/v1/persistentvolumes/pvc-6247502b-8c2d-11e8-8267-42010a9a0113 18 uid: 650bd649-8c2d-11e8-8267-42010a9a0113 19spec: 20 accessModes: 21 - ReadWriteOnce 22 capacity: 23 storage: 100Gi 24 gcePersistentDisk: 25 fsType: ext4 26 pdName: gke-cloud-native-81a17-pvc-6247502b-8c2d-11e8-8267-42010a9a0113 27 persistentVolumeReclaimPolicy: Retain 28 storageClassName: standard 29status: 30 phase: Released

在对进行更改后不久,监视声明状态的终端应显示 Bound

最后,将更改应用到极狐GitLab图表

切换到不同的卷#

如果要切换到使用新卷,使用从旧卷复制的适当数据的磁盘,则首先需要在 Kubernetes 中创建新的持久卷

为了为您的磁盘创建持久卷,您需要查找驱动程序特定文档以获取您的存储类型。您可能希望使用与现有持久卷相同的存储类作为起点:

shell
kubectl --namespace <namespace> get PersistentVolume <volume name> -o yaml > <volume name>.bak.yaml

在遵循驱动程序文档时需要注意几点:

驱动程序文档通常包含在 Pod 中使用驱动程序的示例,例如:

yaml
1apiVersion: v1 2kind: Pod 3metadata: 4 name: test-pd 5spec: 6 containers: 7 - image: registry.k8s.io/test-webserver 8 name: test-container 9 volumeMounts: 10 - mountPath: /test-pd 11 name: test-volume 12 volumes: 13 - name: test-volume 14 # 这个 GCE PD 必须已经存在。 15 gcePersistentDisk: 16 pdName: my-data-disk 17 fsType: ext4

您实际上想要的是创建一个持久卷,如下所示:

yaml
1apiVersion: v1 2kind: PersistentVolume 3metadata: 4 name: test-volume 5spec: 6 capacity: 7 storage: 400Gi 8 accessModes: 9 - ReadWriteOnce 10 gcePersistentDisk: 11 pdName: my-data-disk 12 fsType: ext4

您通常会使用 PersistentVolume 信息创建一个本地 yaml 文件,然后向 Kubernetes 发出创建命令以使用该文件创建对象。

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

一旦创建了卷,您可以继续更改 PersistentVolumeClaim

更改 PersistentVolumeClaim#

找到您要更改的 PersistentVolumeClaim

shell
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 名称列表,后跟它们所用服务的名称。

然后将声明的副本保存到本地文件系统:

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

示例输出:

yaml
1apiVersion: v1 2kind: PersistentVolumeClaim 3metadata: 4 annotations: 5 pv.kubernetes.io/bind-completed: "yes" 6 pv.kubernetes.io/bound-by-controller: "yes" 7 volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd 8 creationTimestamp: 2018-07-20T14:58:38Z 9 labels: 10 app: gitaly 11 release: review-update-app-h8qogp 12 name: repo-data-review-update-app-h8qogp-gitaly-0 13 namespace: helm-charts-win 14 resourceVersion: "48362433" 15 selfLink: /api/v1/namespaces/helm-charts-win/persistentvolumeclaims/repo-data-review-update-app-h8qogp-gitaly-0 16 uid: 6247502b-8c2d-11e8-8267-42010a9a0113 17spec: 18 accessModes: 19 - ReadWriteOnce 20 resources: 21 requests: 22 storage: 50Gi 23 storageClassName: standard 24 volumeName: pvc-6247502b-8c2d-11e8-8267-42010a9a0113 25status: 26 accessModes: 27 - ReadWriteOnce 28 capacity: 29 storage: 50Gi 30 phase: Bound

为新的 PVC 对象创建一个新的 YAML 文件。使用相同的 metadata.namemetadata.labelsmetadata.namespacespec 字段(应用您的更新)并删除其他设置:

示例:

yaml
1apiVersion: v1 2kind: PersistentVolumeClaim 3metadata: 4 labels: 5 app: gitaly 6 release: review-update-app-h8qogp 7 name: repo-data-review-update-app-h8qogp-gitaly-0 8 namespace: helm-charts-win 9spec: 10 accessModes: 11 - ReadWriteOnce 12 resources: 13 requests: 14 # 这是我们更新的字段 15 storage: 100Gi 16 storageClassName: standard 17 volumeName: pvc-6247502b-8c2d-11e8-8267-42010a9a0113

现在删除旧的声明

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

您可能需要清除 finalizers 以允许删除完成:

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

创建新的声明:

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

如果您正在绑定到之前绑定到声明的相同 PersistentVolume,则继续更新卷以绑定声明

否则,如果您已将声明绑定到新卷,请继续将更改应用到极狐GitLab图表

将更改应用到极狐GitLab图表#

在对 PersistentVolumesPersistentVolumeClaims 进行更改后,您还需要发出 Helm 更新,并将更改应用到图表设置中。

有关选项,请参阅安装存储指南

注意:如果您对 Gitaly volume claim 进行了更改,则需要删除 Gitaly StatefulSet 才能发出 Helm 更新。这是因为 StatefulSet 的卷模板是不可变的,无法更改。

您可以在不删除 Gitaly Pod 的情况下删除 StatefulSet: kubectl --namespace <namespace> delete --cascade=false StatefulSet <release-name>-gitaly Helm 更新命令将重新创建 StatefulSet,它将采用并更新 Gitaly pod。

更新图表,并包含更新的配置:

示例:

shell
helm upgrade --install review-update-app-h8qogp gitlab/gitlab \ --set gitlab.gitaly.persistence.size=100Gi \ <your other config settings>