1、statefulset控制器的特点
-
statefulset是一个有状态副本集;
-
statefulset的的每个Pod对象都有一个专有的索引;
-
statefulset的的每个Pod对象严格按照顺序升序部署、降序终止;
-
statefulset的的每个Pod对象都有专有的存储卷;
-
一个完整的statefulset由三个组件组成:Headless Service、StatefulSet、volumeClaimTemplate(Headless Service:为Pod资源生成可解析的DNS资源记录、StatefulSet:管控Pod资源、volumeClaimTemplate:基于动态或静态的PV为Pod资源提供专有固定的存储)
-
动态存储卷供给时,statefulset控制器会为每个volumclaim模板创建一个专有的PV,它从模板中指定的storageclass中每个PVC创建PV;静态存储卷供给时,需要管理员事先创建好满足的PV。
2、创建PV
静态PV供给时需要管理员事先创建好满足条件的PV;
[root@k8s-master-01 statefulset]# cat pv-nfs-statefulset.yaml
apiVersion: v1
kind: Namespace
metadata:
name: statefulset
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: statefulset-nfs-pv1
namespace: statefulset
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfsv1
nfs:
path: data/pv-nfs/pv-1
server: k8s-nfs
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: statefulset-nfs-pv2
namespace: statefulset
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfsv1
nfs:
path: data/pv-nfs/pv-2
server: k8s-nfs
[root@k8s-master-01 statefulset]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
statefulset-nfs-pv1 2Gi RWX Retain Bound statefulset/myappdata-myapp-0 nfsv1 19m
statefulset-nfs-pv2 2Gi RWX Retain Bound statefulset/myappdata-myapp-1 nfsv1 19m
3、创建statefulset资源并利用NFS静态供给PV
-
statefulset控制器会自动创建一个PVC申请绑定与volumeClaimTemplate.storageClassName对应的PV;
-
statefulset对象引用静态PV时,PV类型资源对象中的spec.accessMode值需要与volumeClaimTemplate.accessMode的值完全一致,否者statefulset对象会一直处于pending状态;
[root@k8s-master-01 statefulset]# cat statefulset-deamon.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: statefulset
labels:
app: myapp-svc
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
namespace: statefulset
spec:
serviceName: myapp-svc
replicas: 2
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- name: myapp
image: nginx:1.12-alpine
ports:
- containerPort: 80
name: web
volumeMounts:
- name: myappdata
mountPath: usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: myappdata
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: nfsv1
resources:
requests:
storage: 2Gi
[root@k8s-master-01 statefulset]# kubectl get pvc -n statefulset
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myappdata-myapp-0 Bound statefulset-nfs-pv1 2Gi RWX nfsv1 19m
myappdata-myapp-1 Bound statefulset-nfs-pv2 2Gi RWX nfsv1 19m
[root@k8s-master-01 statefulset]# kubectl get pods -n statefulset -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-0 1/1 Running 0