k8s笔记七(使用statefulset控制器部署有状态的pod应用)

1、statefulset控制器

        Setatefulset控制器是pod资源控制器的一种实现,用于部署和扩展有状态应用的pod资源,确保他们的运行顺序及每个pod资源的唯一性。Statefulset主要用于以下类型的应用程序:

(1)未定且唯一的网络标识符

(2)稳定且持久的存储

(3)有序、优雅的部署和扩展

(4)有序、优雅的删除和终止

(5)有序而自动的滚动更新

2、statefulset控制器的创建与管理

(1)创建statefulset对象

        一个完整的statefulset控制器是由一个Headless Service、statefulset、volumeClaimTemplate三个组件组成。为了方便pvc的创建,使用glusterfs提供动态的pv供给。

# 查看创建的存储类
]# kubectl get StorageClass
NAME        PROVISIONER               AGE
glusterfs   kubernetes.io/glusterfs   16s
# 为stateful对象创建创建headless service
]# cat stateful-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  labels: 
    app: myapp-svc
spec:
  ports:
  - name: web
    port: 80
  clusterIP: None
  selector:
app: myapp-sfs
# 定义创建stateful格式对象
]# cat statefulset-pod.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  serviceName: myapp-svc
  replicas: 2
  selector:
    matchLabels:
      app: myapp-sfs
  template:
    metadata:
      labels:
        app: myapp-sfs
    spec:
      containers:
      - name: myapp
        image: nginx:1.12
        ports:
        - name: http
          containerPort: 80
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: html
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "glusterfs"
      resources:
        requests:
          storage: 2Gi

        默认情况下,statefulset控制器以串行的方式运行创建各pod副本,如果想要以并行的方式创建和删除pod资源,则可以设定.spec.podManagementPolicy字段值为“Parallel”,默认值为“OrderadReady”。

(2)setatefulset控制器中pod资源的标识符及存储卷

         由statefulset控制器创建的pod资源拥有固定、唯一的标识和专用的存储卷,即使重新调度或终止后重建,其名称也依然保持不变,且此前的存储卷及数据不会丢失。它们的唯一标识符是通过唯一的索引号及相关的statefulset对象的名称而生成,格式为“-”。

(3)statefulset资源扩缩容

        Statefulset资源的扩缩容与deployment资源相似,均可通过“kubectl scale”或“kubectl patch”或“kubectl edit”命令直接修改其副本数。    

3、statefulset资源升级

        statefulset控制器支持资源自动更新机制,更新策略由spec.updateStrategy字段定义。

        默认为RollingUpdate,即滚动更新;另一个可用策略为OnDelete即删除更新。

(1)滚动更新

         滚动更新是以逆序的方式从其最大索引编号的pod资源逐一进行。

# 升级nginx版本
]# kubectl set image statefulset myapp myapp=nginx:1.14-alpine
statefulset.apps/myapp image updated
# 观察升级过程
~]# kubectl get pods -l app=myapp-sfs -w
NAME      READY   STATUS    RESTARTS   AGE
myapp-0   1/1     Running   0          55s
myapp-1   1/1     Running   0          67s
myapp-2   1/1     Running   0          75s
myapp-2   1/1   Terminating   0     86s
myapp-2   0/1   Terminating   0     87s
myapp-2   0/1   Terminating   0     88s
myapp-2   0/1   Terminating   0     88s
myapp-2   0/1   Pending   0     0s
myapp-2   0/1   Pending   0     0s

(2)暂存更新

         当用户需要设定一个更新操作,但又不希望他立即执行时,可将跟新操作予以“暂存”,待条件满足后再手动触发更新。Statefulset资源的分区跟新机制能够实现此项功能。

# 首先将滚动更新分区制设置大于pod副本数量
]# kubectl patch statefulset myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":3}}}}'
statefulset.apps/myapp patched
# 更新pod镜像
]# kubectl set image statefulset myapp myapp=nginx:latest
statefulset.apps/myapp image updated
# 检查各pod中镜像版本并未发生改变
~]# kubectl get pods -l app=myapp-sfs -o custom-columns=NAME:metadata.name,IMAGE:spec.containers[0].image
NAME      IMAGE
myapp-0   nginx:1.14-alpine
myapp-1   nginx:1.14-alpine
myapp-2   nginx:1.14-alpine

(3)金丝雀部署

         将处于暂存状态的更新操作的partition定位于pod资源的最大索引号,即只放出一只金丝雀,由其测试第一轮的跟新操作,在确认无误后通过修改partition属性的值跟新其他的pod对象。

(4)并行操作

         Statefulset控制器管理的pod资源的策略除了默认的OrderedReady(顺序创建及逆序删除)外,还支持并行的创建及删除操作,即同事创建所有的pod资源及同事删除所有的pod资源,完成该操作需要将spec.podManageMentPolicy字段的值设置为Parallel。

你可能感兴趣的:(docker&k8s)