我可以在 Kubernetes Statefulset 的 volumeClaimTemplate 中使用现有的 GCE 永久磁盘吗
Can I use existing GCE persistent disk in volumeClaimTemplate of Kubernetes Statefulset
我正在使用 Google 容器引擎 运行 StatefulSet 用于 MongoDB 副本集(3 个副本 pods)。
这适用于持久存储的动态配置 - 即在创建有状态集时为每个 pod 提供新存储。
但是,如果我重新启动 StatefulSet,似乎我无法重新绑定旧的持久卷,因为将再次配置新的存储。这意味着数据丢失了。理想情况下,持久存储应该在 Kubernetes 集群本身删除后仍然存在,数据会保留并准备好在新集群中再次使用。
有没有办法创建 GCE 持久磁盘并在 StatefulSet 的持久卷声明中使用它们?
[2017 年 9 月 20 日更新]
找到答案:
这就是解决方案(归功于@RahulKrishnan R A)
创建存储class,指定底层磁盘类型和区域
创建指定存储的 PersistentVolume Class 创建
上面,并引用您要挂载的永久磁盘
- 创建 PersistentVolumeClaim。将 PVC 命名为
<pvc template name>-<statefulset name>-<ordinal number>
很重要。 (正确的名字是
trick!) 将 volumeName 指定为上面创建的 PV 和 storage
class。
- 创建与您拥有的副本一样多的 PV 和 PVC
正确的名字。
- 使用 PVC 模板创建 statefulSet。
方法 1:动态
您可以在 statefulset.yaml 文件中添加卷声明模板以及部署定义
volumeClaimTemplates:
- 元数据:
名称:存储
注释:
volume.beta.kubernetes.io/storage-class: 慢
规格:
访问模式:[“ReadWriteOnce”]
资源:
请求:
存储:10Gi
创建存储classstorage.yaml文件
种类:存储类
api版本:storage.k8s.io/v1beta1
元数据:
名称:慢
供给者:kubernetes.io/gce-pd
参数:
类型:pd-标准
区域:asia-east1-a
方法二静态PV:
https://github.com/rahulkrishnanfs/percona-xtradb-statefulset-cluster-k8s/blob/master/percona.yml
注意:persistentVolumeReclaimPolicy:保留 如果您想保留卷
,请使用
持久卷可由管理员静态配置,或基于 StorageClass 资源动态配置
看起来使用新的 kubernetes (1.12) 支持现有的卷,如果您已经有包含数据的磁盘,这可能会很方便。例如,我的应用程序没有高数据库负载,我对 运行 具有 3 个实例的副本集 (PSA) 很满意。对于其中的每一个,我都使用一个副本创建了 statefulset,并将现有的 gcePersistentDisk
用于 PRIMARY 和 SECONDARY。下面是第二个节点的配置:
apiVersion: v1
kind: Service
metadata:
name: mongo-svc-b
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
app: si
tier: db
node: b
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo-b
spec:
replicas: 1
selector:
matchLabels:
app: si
tier: db
node: b
serviceName: mongo-b
template:
metadata:
labels:
app: si
tier: db
node: b
spec:
containers:
- name: mongo
image: mongo:3.2
command: ["mongod"]
args: ["-replSet", "si"]
ports:
- containerPort: 27017
- containerPort: 28017
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
volumes:
- name: mongo-persistent-storage
gcePersistentDisk:
pdName: mongo-disk-b-green
fsType: ext4
我正在使用 Google 容器引擎 运行 StatefulSet 用于 MongoDB 副本集(3 个副本 pods)。
这适用于持久存储的动态配置 - 即在创建有状态集时为每个 pod 提供新存储。
但是,如果我重新启动 StatefulSet,似乎我无法重新绑定旧的持久卷,因为将再次配置新的存储。这意味着数据丢失了。理想情况下,持久存储应该在 Kubernetes 集群本身删除后仍然存在,数据会保留并准备好在新集群中再次使用。
有没有办法创建 GCE 持久磁盘并在 StatefulSet 的持久卷声明中使用它们?
[2017 年 9 月 20 日更新]
找到答案: 这就是解决方案(归功于@RahulKrishnan R A)
创建存储class,指定底层磁盘类型和区域
创建指定存储的 PersistentVolume Class 创建 上面,并引用您要挂载的永久磁盘
- 创建 PersistentVolumeClaim。将 PVC 命名为
<pvc template name>-<statefulset name>-<ordinal number>
很重要。 (正确的名字是 trick!) 将 volumeName 指定为上面创建的 PV 和 storage class。 - 创建与您拥有的副本一样多的 PV 和 PVC 正确的名字。
- 使用 PVC 模板创建 statefulSet。
方法 1:动态
您可以在 statefulset.yaml 文件中添加卷声明模板以及部署定义
volumeClaimTemplates:
- 元数据:
名称:存储
注释:
volume.beta.kubernetes.io/storage-class: 慢
规格:
访问模式:[“ReadWriteOnce”]
资源:
请求:
存储:10Gi
创建存储classstorage.yaml文件
种类:存储类
api版本:storage.k8s.io/v1beta1
元数据:
名称:慢
供给者:kubernetes.io/gce-pd
参数:
类型:pd-标准
区域:asia-east1-a
方法二静态PV:
https://github.com/rahulkrishnanfs/percona-xtradb-statefulset-cluster-k8s/blob/master/percona.yml
注意:persistentVolumeReclaimPolicy:保留 如果您想保留卷
,请使用持久卷可由管理员静态配置,或基于 StorageClass 资源动态配置
看起来使用新的 kubernetes (1.12) 支持现有的卷,如果您已经有包含数据的磁盘,这可能会很方便。例如,我的应用程序没有高数据库负载,我对 运行 具有 3 个实例的副本集 (PSA) 很满意。对于其中的每一个,我都使用一个副本创建了 statefulset,并将现有的 gcePersistentDisk
用于 PRIMARY 和 SECONDARY。下面是第二个节点的配置:
apiVersion: v1
kind: Service
metadata:
name: mongo-svc-b
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
app: si
tier: db
node: b
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo-b
spec:
replicas: 1
selector:
matchLabels:
app: si
tier: db
node: b
serviceName: mongo-b
template:
metadata:
labels:
app: si
tier: db
node: b
spec:
containers:
- name: mongo
image: mongo:3.2
command: ["mongod"]
args: ["-replSet", "si"]
ports:
- containerPort: 27017
- containerPort: 28017
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
volumes:
- name: mongo-persistent-storage
gcePersistentDisk:
pdName: mongo-disk-b-green
fsType: ext4