我正在使用Google容器引擎为MongoDB副本集运行StatefulSet(3个副本容器)。
这适用于持久存储的动态配置 - 即在创建有状态集时为每个pod配置新存储。
但是,如果我重新启动StatefulSet,似乎我无法重新绑定旧的持久卷,因为将再次配置新存储。这意味着数据丢失。理想情况下,持久存储应该在删除Kubernetes集群本身后继续存在,数据保留并准备好在新集群中重新使用。
有没有办法创建GCE Persistent磁盘并在StatefulSet的持久卷声明中使用它们?
[2017年9月20日更新]
找到答案: 这是解决方案(归功于@RahulKrishnan R A)
创建一个存储类,指定基础磁盘类型和区域
创建一个指定存储类创建的PersistentVolume 上面,并引用您要挂载的永久磁盘
<pvc template name>-<statefulset name>-<ordinal number>
非常重要。 (正确的名字是
技巧!)将volumeName指定为上面创建的PV和存储
类。 答案 0 :(得分:0)
方法1:动态
您可以在statefulset.yaml文件中添加以下卷声明模板以及部署定义
volumeClaimTemplates:
- 元数据:
名称:存储
注释:
volume.beta.kubernetes.io/storage-class:slow
规格:
accessModes:[“ReadWriteOnce”]
资源:
要求:
存储:10Gi
创建存储类storage.yaml文件
种类:StorageClass
apiVersion:storage.k8s.io/v1beta1
元数据:
名称:慢
供应者:kubernetes.io/gce-pd
参数:
类型:pd-标准
zone:asia-east1-a
方法2静态PV:
https://github.com/rahulkrishnanfs/percona-xtradb-statefulset-cluster-k8s/blob/master/percona.yml
注意: persistentVolumeReclaimPolicy:如果您想保留音量,请保留
持久卷可以由管理员静态配置,也可以基于StorageClass资源动态配置
答案 1 :(得分:0)
看起来像使用新的kubernetes(1.12)支持现有的卷,如果您已经有包含数据的磁盘,这可能会很方便。例如,我的应用程序没有很高的数据库负载,并且我对运行具有3个实例(PSA)的副本集感到满意。我为每个对象创建了一个副本的有状态集,并将现有的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