Kubernetes--有状态应用编排:StatefulSet
Deployment认为:管理的所有同版本的pod都是一模一样的副本
StatefulSet能够比较好的满足一些有状态应用特有的要求:
1、每个Pod有Order序号,会按照序号创建、删除、更新pod
2、通过配置headless service,使每个pod有唯一的网络标识(HOSTNAME)
3、通过配置pvc template,每个pod有一块独享的pv存储盘
4、支持一定数量的灰度发布
一个简单的Statefulset范例创建
# 创建service.yaml apiVersion: v1 kind: Service metadata: name: nginx namespace: dev labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx # 创建pc-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: pc-statefulset namespace: dev spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80 name: nginx
到这,创建好了一个svc和一个statefulset,查看一下状态:
# 查看service [root@master ~]# kubectl get svc nginx -n dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx ClusterIP None <none> 80/TCP 3h4m # 查看一下ip [root@master ~]# kubectl get endpoints nginx -n dev NAME ENDPOINTS AGE nginx 10.244.169.183:80,10.244.169.184:80,10.244.169.185:80 + 3 more... 2s # 查看创建的statefulset [root@master ~]# kubectl get sts -n dev NAME READY AGE pc-statefulset 3/3 85m # 查看sts创建的pod [root@master ~]# kubectl get pod -n dev -o wide pc-statefulset-0 1/1 Running 1 (6m21s ago) 87m 10.244.169.185 k8s-node2 <none> <none> pc-statefulset-1 1/1 Running 1 (6m21s ago) 87m 10.244.169.183 k8s-node2 <none> <none> pc-statefulset-2 1/1 Running 1 (6m7s ago) 87m 10.244.36.90 k8s-node1 <none> <none>
Pod版本
不同于Deployment使用ReplicaSet来管理版本和维持副本数,Statefulset controller直接管理下属的pod,而pod中用一个label来标识版本:controller-revision-hash
[root@master ~]# kubectl get pod -L controller-revision-hash -n dev NAME READY STATUS RESTARTS AGE CONTROLLER-REVISION-HASH demo-cloneset-bc6jq 1/1 Running 6 (6m13s ago) 2d4h demo-cloneset-7b4f8f8579 demo-cloneset-gnd5c 1/1 Running 6 (5m55s ago) 2d4h demo-cloneset-7b4f8f8579 demo-cloneset-vzg4j 1/1 Running 6 (6m32s ago) 2d4h demo-cloneset-7b4f8f8579 nginx-f87cbb8b5-6xf6p 1/1 Running 2 (28m ago) 10h pc-statefulset-0 1/1 Running 0 3m34s pc-statefulset-589995765c pc-statefulset-1 1/1 Running 0 3m3s pc-statefulset-589995765c
管理模式
Statefulset会创建管理的资源:
● ControllerRevision:通过这个资源,Statefulset可以很方便的管理不同版本的template模板
● PVC:如果在Statefulset中定义了volumeClaimTemplates,Statefulset会在创建Pod之前,先根据这个模板创建PVC,并把PVC加到Pod volume中。
● Pod:Statefulset按照顺序创建、删除、更新Pod,每个Pod有唯一的序号
扩缩容管理策略
Statefulset.spec中,有一个字段名为podManagementPolicy,可选策略为OrderedReady和Parallel,默认为前者:
● OrderedReady: 扩缩容按照order顺序执行,扩容时,必须前面序号的Pod都ready了,才能扩下一个,缩容时,按照倒序删除
● Parallel:并行扩缩容,不需要等待前面Pod都ready或删除后再删除下一个