一、配置文件

---
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:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
          name: web
#        volumeMounts:
#        - name: www
#          mountPath: /usr/share/nginx/html
#  volumeClaimTemplates:
#  - metadata:
#      name: www
#      annotations:
#        volume.alpha.kubernetes.io/storage-class: anything
#    spec:
#      accessModes: [ "ReadWriteOnce" ]
#      resources:
#        requests:
#          storage: 1Gi

二、功能

1. 创建

根据以上 配置文件

  • 创建命令
kubectl create -f web.yaml
  • 查看 service 和 statefulset => sts
# 查看名为 `nginx`的服务
kubectl get service nginx

# 获取sts
kubectl get statefulset web

  • 查看 PVC 信息
# 如果配置文件中配置了pvc相关功能, 可以查看pvc信息
kubectl get pvc
  • 查看创建的 pod,这些 pod 是有序的
kubectl get pods -l app=nginx

  • 查看这些 pod 的 dns
    运行一个 pod,基础镜像为 busybox 工具包,利用里面的 nslookup 可以看到 dns 信息
# 创建一个沙盒镜像 busybox:1.28.4 , 用于测试 , 退出后自动删除容器
kubectl run -i --tty --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh

# 
nslookup web-0.nginx

2. 扩容缩容 (两种方式)

  • 扩容
# 方式1
kubectl scale sts web --replicas=5

  • 缩容
# 方式2
kubectl patch sts web -p '{"spec":{"replicas":3}}'

3. 镜像更新

镜像更新(目前还不支持直接更新 image,需要 patch 来间接实现)

# 此处更新了nginx版本号
kubectl patch sts web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"nginx:1.9.1"}]'

# 使用命令查看配置文件中的版本号是否被更新
kubectl edit sts web

1). 滚动更新 RollingUpdate

StatefulSet 也可以采用滚动更新策略,同样是修改 pod template 属性后会触发更新,
但是由于 pod 是有序的,在 StatefulSet 中更新时是基于 pod 的顺序倒序更新的

# 编辑web的配置
kubectl edit sts web

灰度发布

利用滚动更新中的 partition 属性,可以实现简易的灰度发布的效果

例如我们有 5 个 pod,如果当前 partition 设置为 3,那么此时滚动更新时,只会更新那些 序号 >= 3 的 pod

利用该机制,我们可以通过控制 partition 的值,来决定只更新其中一部分 pod,确认没有问题后再主键增大更新的 pod 数量,最终实现全部 pod 更新

验证如下图:

  • 查看当前 sts的描述, 记录下nginx的版本号nginx:1.9.1, 将副本数改成5个
kubectl describe sts web

kubectl scale sts web --replicas=5

  • 编辑配置文件, 将更新策略中的partition改成 3
  • 然后编辑配置文件中- nginx的版本号为 1.7.9
  • 首先查看 po web-2的描述, 发现web-2的版本号没变, 依旧是 1.9.1
  • 查看web-3web-4的描述, 发现版本号被修改了

2). 删除更新 OnDelete

只有在 pod 被删除时会进行更新操作

# 编辑web的配置
kubectl edit sts web

4. 删除

# 删除 StatefulSet 和 Headless Service

# 级联删除:删除 statefulset 时会同时删除 pods
kubectl delete statefulset web

# 非级联删除:删除 statefulset 时不会删除 pods,
删除 sts 后,pods 就没人管了,此时再删除 pod 不会重建的
kubectl deelte sts web --cascade=false

# 删除 service
kubectl delete service nginx

5. 删除 PVC

# StatefulSet删除后PVC还会保留着,数据不再使用的话也需要删除
kubectl delete pvc www-web-0 www-web-1
最后修改:2023 年 07 月 26 日
如果觉得我的文章对你有用,请点个赞吧~