我们知道,deployment创建的pod共享一个存储,StatefulSet创建的pod每个都有单独的存储,这是因为,deployment适用于部署无状态的应用,在deployment的定义中,pvc是放置在pod模板里面的,如下:
template:
metadata:
labels:
app: nginx-pvc
spec:
containers:
- image: nginx:1.7.9
name: nginx-container
ports:
- name: http
containerPort: 80
volumeMounts:
- name: pvc-volume
mountPath: /var/log/nginx
volumes: #这里直接引用pvc
- name: pvc-volume
persistentVolumeClaim:
claimName: pvc-nfs
readOnly: false
所以,创建的pod都共享一个存储。
StatefulSet创建的pod每个都有单独的存储,这是因为,StatefulSet适用于部署无状态的应用,在StatefulSet的定义中,pvc是放置与pod模板同级别的,如下:
spec:
selector: #标签选择器,要与下面pod模板定义的pod标签保持一致
matchLabels:
app: redis-sts
replicas: 6 #副本数为6个,redis集群模式最少要为6个节点,构成3主3从
serviceName: redis-svc #指定使用service为上面我们创建的无头service的名称
template:
metadata:
labels: #pod的标签,上面的无头service的标签选择器和sts标签选择器都要与这个相同
app: redis-sts
spec:
containers:
- name: redis #容器名称
ports: #定义容器端口
...................................
volumeClaimTemplates: #定义创建pvc的模板
- metadata:
name: "redis-data" #模板名称
spec:
resources: #资源请求
requests:
storage: 100M #需要100M的存储空间
accessModes:
- ReadWriteOnce #访问模式为RWO
storageClassName: "nfs-storageclass" #指定使用的存储类,实现动态分配pv
所以,StatefulSet创建的pod每个都有单独的存储。