k8s控制器statefulset

StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API。在Pods管理的基础上,保证Pods的顺序和一致性。与Deployment一样,StatefulSet也是使用容器的Spec来创建Pod,与之不同StatefulSet创建的Pods在生命周期中会保持持久的标记(例如Pod Name)。

Petset-> StatefulSet

  1. 稳定且唯一的网络标示符
  2. 稳定且持久的存储
  3. 有序 平滑的部署和扩展
  4. 有序平滑的删除和终止
  5. 有序的滚动更新

三个组件 headless service, StatefulSet , volimeClaimTemplate

需要提前创建pv 至少和副本数量相同

部署一个sts

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
YAML

StatefulSet创建顺序是从0到N-1,终止顺序则是相反。如果需要对StatefulSet扩容,则之前的N个Pod必须已经存在。如果要终止一个Pod,则它的后序Pod必须全部终止。

查看

[root@node1 volumes]# kubectl get sts
NAME READY AGE
web 3/3 42s

[root@node1 volumes]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myappdata-web-0 Bound pv001 5Gi RWO,RWX 48s
myappdata-web-1 Bound pv002 5Gi RWO,RWX 46s
myappdata-web-2 Bound pv003 5Gi RWO,RWX 14s

[root@node1 volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 5Gi RWO,RWX Retain Bound default/myappdata-web-0 21m
pv002 5Gi RWO,RWX Retain Bound default/myappdata-web-1 21m
pv003 5Gi RWO,RWX Retain Bound default/myappdata-web-2 21m
pv004 10Gi RWO,RWX Retain Available 21m
pv005 10Gi RWO,RWX Retain Available 21m

[root@node1 volumes]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 59s
web-1 1/1 Running 0 57s
web-2 1/1 Running 0 25s
SQL

设置副本为5个

设置更新策略 id大于3的更新新的镜像

[root@node1 volumes]# kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":3}}}}'
statefulset.apps/web patched
HSP

更新镜像

[root@node1 volumes]# kubectl set image sts/web nginx=ikubernetes/myapp:v2
statefulset.apps/web image updated
ROUTEROS

查看,发现3镜像已经升级,小于3的没有升级,这种方法用于实现金丝雀发布,如发现测试没有问题 则修改partition为0  全部更新

[root@node1 volumes]# kubectl get pods web-3 -o yaml  grep image
 - image: ikubernetes/myapp:v2
 imagePullPolicy: IfNotPresent
 image: ikubernetes/myapp:v2
 imageID: docker-pullable://ikubernetes/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
 
[root@node1 volumes]# kubectl get pods web-2 -o yaml  grep image
 - image: ikubernetes/myapp:v1
 imagePullPolicy: IfNotPresent
 image: ikubernetes/myapp:v1
 imageID: docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
YAML

容器内DNS解析地址机构如下

pod名.service名.ns名.svc.cluster.local


k8s控制器statefulset
http://www.jcwit.com/article/113/
作者
Carlos
发布于
2019年5月8日
许可协议