StatefulSet
–背景
当对于无状态应用时我们可以随意扩容删除
但对于有状态应用时我们就不能随意,因为他要依赖我们本地的文件和网络等
那么我们有状态应用就需要实现在容器的删除建立中,文件网络时不变的
Headless Service
用于定义网络标志(DNS domain)
服务名 ==> 域名 ==> ip
volumeClaimTemplate
将某些依赖挂载到这个卷上,实现持久化存储
如何创建一个sts#
cd /home/echin mkdir sts cd sts/ touch web.yaml vim web.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
* `````
apiVersion: apps/v1 # 指定使用的 Kubernetes API 版本
kind: StatefulSet # 资源类型为 StatefulSet,用于管理有状态应用的 Pod 副本
metadata:
name: web # StatefulSet 的名称
spec: # StatefulSet 的规格定义
serviceName: "nginx" # 服务名称,StatefulSet 中的 Pod 将通过这个服务名进行网络通信
replicas: 2 # 期望运行的 Pod 副本数量
selector: # 选择器,用于匹配 StatefulSet 管理的 Pod
matchLabels:
app: web # 选择器匹配的标签
template: # Pod 模板,定义了 Pod 的规格和运行的容器
metadata:
labels:
app: web # Pod 模板的标签,用于与选择器匹配
spec: # Pod 模板的规格定义
containers: # Pod 中的容器列表
- name: nginx # 容器名称
image: nginx:latest # 容器使用的镜像
ports: # 容器暴露的端口列表
- containerPort: 80 # 容器内部暴露的端口号
name: web # 端口名称
volumeMounts: # 容器的卷挂载点
- name: www # 挂载的卷名称
mountPath: /usr/share/nginx/html # 卷挂载到容器内的路径
volumeClaimTemplates: # 卷声明模板列表,用于动态创建持久化存储
- metadata: # 卷声明模板的元数据
name: www # 卷声明模板的名称
spec: # 卷声明模板的规格定义
accessModes: [ "ReadWriteOnce" ] # 卷的访问模式,这里指定为可读写
resources: # 卷的资源请求
requests: # 资源的请求量
storage: 1Gi # 请求的存储容量为 1 吉字节
`````
* ````bash
# 查看
kubectl get sts
kubectl describe sts web-0
扩容/缩容#
1 | kubectl scale sts web --replicas=2 |
灰度发布/金丝雀发布#
将应用上线把上线风险降到最低
虽然滚动更新可以偷偷摸摸地把所有东西都更新完
但是如果新版本是有问题的,就会产生很大的风险
而灰度发布就是对少部分的服务器进行更新,如果这些服务器没问题,再使用滚动更新到所有服务器
利用配置中的 partition
字段:
如果总共有5个Pod,updateStrategy:partition=3
,那么只会更新序号大于等于3的pod
通过不断缩小partition
的数字来扩大更新的数量
1 | kubectl edit sts web-0 |
onDelete#
配置中修改成:
1 | updateStrategy: |
就会变成只有我删除时才会更新的操作
1 | kubectl edit po web-0 |
1 | kubectl delete po web-0 |
作用:可以实现复制体中的单独一个两个更新,如果我想更新其中一个,我只要删除某一个Pod就行
级联删除和非级联删除#
级联删除
当你删除 StatefulSet 时,默认情况下会触发级联删除,这意味着 StatefulSet 管理的所有 Pods 也会被自动删除。这是删除 StatefulSet 的默认行为。
命令
1
kubectl delete statefulset web
这个命令会删除名为 web
的 sts
以及所有由他管理的pods
非级联删除
如果你希望删除 StatefulSet 但保留与之关联的 Pods,你可以使用
--cascade=false
或--delete-dependents=false
标志。请注意,--cascade
标志在某些版本的kubectl
中可能不可用或已被替换为--delete-dependents
。命令
1
2
3kubectl delete statefulset web --cascade=false
# 或者
kubectl delete statefulset web --delete-dependents=false这个命令会删除 StatefulSet,但不会删除它管理的 Pods。Pods 将继续存在,但将成为 “孤儿”(即没有 StatefulSet 控制器管理它们)。
删除 Service
删除 Service 资源时,通常不会影响与之关联的 Pods。Service 负责定义访问 Pods 的网络接口,但并不直接管理 Pods 的生命周期。
命令
1
kubectl delete service nginx
这个命令会删除名为 nginx 的 Service。如果这个 Service 被用来暴露 StatefulSet 中的 Pods,删除 Service 将停止外部对这些 Pods 的访问,但不会影响 Pods 本身。