使用持久卷配置极狐GitLab chart
一些包含的服务需要持久存储,通过持久卷进行配置,这些持久卷指定了集群可以访问的磁盘。有关安装此图所需的存储配置的文档可以在我们的存储指南中找到。
安装后的存储更改需要由集群管理员手动处理。安装后,这些卷的自动化管理不由极狐GitLab图表处理。
初始安装后未自动管理的更改示例包括:
- 将不同的卷挂载到 Pod
- 更改有效的 accessModes 或 存储类
- 扩展卷的存储大小*1
1 在 Kubernetes 1.11 中,支持扩展卷的存储大小,如果在存储类中将 allowVolumeExpansion 配置为 true。
由于以下原因,自动化这些更改很复杂:
- Kubernetes 不允许更改现有 PersistentVolumeClaim 中的大多数字段
- 除非手动配置,否则 PVC 是动态配置的唯一参考 PersistentVolumes
- Delete 是动态配置的 PersistentVolumes 的默认 reclaimPolicy
这意味着要进行更改,我们需要删除 PersistentVolumeClaim 并使用我们的更改创建一个新的。但由于默认的 reclaimPolicy,删除 PersistentVolumeClaim 可能会删除 PersistentVolumes 和底层磁盘。除非配置了适当的 volumeNames 和/或 labelSelectors,否则图表不知道要附加的卷。
我们将继续研究使此过程更容易的方法,但目前需要遵循手动过程来更改您的存储。
定位极狐GitLab卷
找到正在使用的卷/声明:
shellkubectl --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图表的名称。
该命令将打印卷名称列表,后跟它们所用服务的名称。
例如:
shell1$ 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
例如:
shellkubectl --namespace helm-charts-win edit PersistentVolume pvc-6247502b-8c2d-11e8-8267-42010a9a0113
编辑输出:
yaml1# 请编辑下面的对象。以 '#' 开头的行将被忽略, 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 对卷进行所需的配置更改。(这些更改应仅为更新以反映附加磁盘的真实状态)
例如:
shellkubectl --namespace helm-charts-win edit PersistentVolume pvc-6247502b-8c2d-11e8-8267-42010a9a0113
编辑输出:
yaml1# 请编辑下面的对象。以 '#' 开头的行将被忽略, 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部分中的说明进行操作。
更新卷以绑定声明
在一个单独的终端中,开始观察何时声明的状态更改为绑定,然后继续下一步以使卷可用于新声明。
shellkubectl --namespace <namespace> get --watch PersistentVolumeClaim <claim name>
编辑卷以使其可用于新声明。删除 .spec.claimRef 部分。
shellkubectl --namespace <namespace> edit PersistentVolume <volume name>
编辑输出:
yaml1# 请编辑下面的对象。以 '#' 开头的行将被忽略, 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 中创建新的持久卷。
为了为您的磁盘创建持久卷,您需要查找驱动程序特定文档以获取您的存储类型。您可能希望使用与现有持久卷相同的存储类作为起点:
shellkubectl --namespace <namespace> get PersistentVolume <volume name> -o yaml > <volume name>.bak.yaml
在遵循驱动程序文档时需要注意几点:
- 您需要使用驱动程序创建 Persistent Volume,而不是文档中显示的具有卷的 Pod 对象。
- 您不想为该卷创建 PersistentVolumeClaim,我们将编辑现有声明。
驱动程序文档通常包含在 Pod 中使用驱动程序的示例,例如:
yaml1apiVersion: 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
您实际上想要的是创建一个持久卷,如下所示:
yaml1apiVersion: 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 发出创建命令以使用该文件创建对象。
shellkubectl --namespace <your namespace> create -f <local-pv-file>.yaml
一旦创建了卷,您可以继续更改 PersistentVolumeClaim。
更改 PersistentVolumeClaim
找到您要更改的 PersistentVolumeClaim。
shellkubectl --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 名称列表,后跟它们所用服务的名称。
然后将声明的副本保存到本地文件系统:
shellkubectl --namespace <namespace> get PersistentVolumeClaim <claim name> -o yaml > <claim name>.bak.yaml
示例输出:
yaml1apiVersion: 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.name、metadata.labels、metadata.namespace 和 spec 字段(应用您的更新)并删除其他设置:
示例:
yaml1apiVersion: 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
现在删除旧的声明:
shellkubectl --namespace <namespace> delete PersistentVolumeClaim <claim name>
您可能需要清除 finalizers 以允许删除完成:
shellkubectl --namespace <namespace> patch PersistentVolumeClaim <claim name> -p '{"metadata":{"finalizers":null}}'
创建新的声明:
shellkubectl --namespace <namespace> create -f <new claim yaml file>
如果您正在绑定到之前绑定到声明的相同 PersistentVolume,则继续更新卷以绑定声明。
否则,如果您已将声明绑定到新卷,请继续将更改应用到极狐GitLab图表。
将更改应用到极狐GitLab图表
在对 PersistentVolumes 和 PersistentVolumeClaims 进行更改后,您还需要发出 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。
更新图表,并包含更新的配置:
示例:
shellhelm upgrade --install review-update-app-h8qogp gitlab/gitlab \ --set gitlab.gitaly.persistence.size=100Gi \ <your other config settings>