一、配置文件
---
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-3
和web-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