建设银行网站个人银行上不去,什么什么网站,徐州网架加工,濮阳建站公司哪个好StatefulSet 文章目录 StatefulSet一、介绍与特点1.1、介绍1.2、特点1.3、组成部分1.4、为什么需要无头服务1.5、为什么需要volumeClaimTemplate 二、教程2.1、创建StatefulSet2.2、查看部署资源 三、StatefulSet中的Pod3.1、检查Pod的顺序索引3.2、使用稳定的网络身份标识3.3、…StatefulSet 文章目录 StatefulSet一、介绍与特点1.1、介绍1.2、特点1.3、组成部分1.4、为什么需要无头服务1.5、为什么需要volumeClaimTemplate 二、教程2.1、创建StatefulSet2.2、查看部署资源 三、StatefulSet中的Pod3.1、检查Pod的顺序索引3.2、使用稳定的网络身份标识3.3、查看主机明内部DNS地址 四、扩容/缩容StatefulSet4.1、扩容4.2、缩容 五、更新StatefulSet5.1、滚动更新 一、介绍与特点
1.1、介绍
RC、Deployment、DaemonSet都是面向无状态的服务它们所管理的Pod的IP、名字、启停顺序等都是随机的而StatefulSet是什么顾名思义有状态的集合管理所有有状态服务比如MySQL、MongoDB集群等。StatefulSet本质上是Deployment的一种变体在v1.9版本中已成为GA版本它为了解有状态服务的问题它所管理的Pod拥有固定的Pod名称启停顺序在StatefulSet中Pod名称为网络标识(hostname)还必须要用到共享存储。在Deployment中与之对应的服务是service而在StatefulSet中与之对应的是headless service即无头服务与service的与别是它没有ClusterIP解析它的名称时将返回该Headless Service对印的全部Pod的Endpoint端点列表。除此之外StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名这个域名的格式为$(podname).(headless server name)FQDN: (podname).(headless servername).namespace.svc.cluster.local
1.2、特点 Pod的一致性包含次序启停、停止次序、网络一致性。此一致性与Pod相关与 呗调度到哪个node节点无关。 稳定的次序对于N个副本的StatefulSet每个Pod都在[0-N]的范围内分配一个数字序号且是唯一的。 稳定的网络Pod的hostname模式为(StatefulSet名称)-(序号)。 稳定的存储通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本不会删除相关的卷。
1.3、组成部分 Headless Service用来定义Po的网络标识DNS domain volumeClaimTemplates存储卷申请模板创建PVC指定pvc名称大小将自动创建pvc且pvc必须由存储类供应
1.4、为什么需要无头服务
在用Deployment时每一个Pod名称是没有顺序的是随机字符串因此Pod名称是无序的但是在StatefulSet中要求必须是有序的每个Pod不能随意取代Pod重建后Pod名称还是一样的。而Pod IP是变化的所以是以Pod名称来识别Pod名称是Pod唯一性的标识符必须持久稳定有效这时候要用到无头服务它可以给每个Pod一个唯一的名称。
1.5、为什么需要volumeClaimTemplate
对于有状态的副本集都会用到持久存储对于分布式系统来讲它的最大特点是数据的不一样的所以各个节点不能使用同一存储卷每个节点有自己的专用存储但是如果在Deployment中的Pod template里定义存储卷是所有副本共有一个存储卷数据是相同的因为是基于模板来创建的而StatefulSet中每个Pod都要自己的专有存储卷所以StatefulSet的存储卷就不能再用Pod模板来创建了于是StatefulSet使用volumeClaimTemplate称为卷申请模板它会为每个Pod生成不同的pvc并绑定pv从而实现各pod有专用存储。这就是为什么要用volumeClaminTemplate的原因。
二、教程
开始之前确保你已经正常部署Kubernetes集群
2.1、创建StatefulSet
作为开始使用如下示例创建了一个StatefulSet以及它所依赖的Service。它和StatefulSet概念中的示例相似。它创建了一个Headless Servicenginx用来发布StatefulSetweb中的Pod的IP地址。
[rootmaster ~]# vim nginx-statefulset.yaml
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: None # Service的类型设置为None将标识这是个Headless Service即无头服务selector: app: nginx # 表示这个Service关联的Pod将会选择标签带有appnginx的Pod---apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: nginx # 声明它属于哪个Headless Service无头服务replicas: 2selector:matchLabels:app: nginx # 这个StatefulSet将会管理标签是appnginx的Podtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresent# 定义挂载卷,这只是一个演示生产环境一定不会这样用的volumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumes:- name: wwwhostPath:# 每个运行Pod的宿主机挂载容器中的目录路径path: /mnt# 使用此命令加载资源
[rootmaster ~]# kubectl apply -f nginx-statefulset.yaml2.2、查看部署资源
StatefulSet默认以严格的顺序创建其Pod。对于一个拥有n个副本的StatefulSetPod被部署时是按照{0…n-1}的序号顺序创建的请注意直到web-0Pod处于Running并Ready状态后web-1Pod才会被启动。
# 查看Pod
[rootmaster ~]# kubectl get pod -l appnginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 2m50s
web-1 1/1 Running 0 2m48s# 查看StatefulSet
[rootmaster ~]# kubectl get statefulset web
NAME READY AGE
web 2/2 2m6s# 查看Service无头服务
[rootmaster ~]# kubectl get service nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP None none 80/TCP 3m29s三、StatefulSet中的Pod
StatefulSet中的每个Pod拥有一个唯一的顺序索引和稳定的网络身份标识。
3.1、检查Pod的顺序索引
如果StatefulSet盖尼奥中所提到的StatefulSet中的每个Pod拥有一个具有黏性的、独一无二的身份标志这个标志基于StatefulSet控制器分配给每个Pod的唯一顺序索引。Pod名称的格式为statefulset 名称-序号索引。WebStatefulSet拥有两个副本所以它创建了两个Podweb-0和web-1
[rootmaster ~]# kubectl get pod -l appnginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 10m
web-1 1/1 Running 0 10m3.2、使用稳定的网络身份标识
每个Pod都拥有一个基于顺序索引的稳定的主机名。使用kubectl exex在每个Pod中执行hostname
[rootmaster ~]# for i in 0 1; do kubectl exec web-$i -- sh -c hostname; done
web-0
web-13.3、查看主机明内部DNS地址
使用kubectl run运行一个提供nslookup命令的容器该命令来自于dnsutils包。通过对Pod的主机名执行nslookup你可以检查这些主机名在集群内部的DNS地址
# 命令终端中运行一个Pod终端
[rootmaster ~]# kubectl run -i --tty --image busybox:1.28 dns-test --restartNever --rm# 使用以下命令解析web-0Pod的内部DNS地址
/ # nslookup web-0.nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName: web-0.nginx
Address 1: 10.244.1.2 web-0.nginx.default.svc.cluster.local四、扩容/缩容StatefulSet
扩容/缩容StatefulSet指增加或减少它的副本数。这通过更新replicas字段完成水平缩放。你也可以使用kubectl sacale或者kubectl pathch来缩容/缩容一个StatefulSet。
4.1、扩容 扩容意味着添加更多副本。如果你的应用程序能够在整个StatefulSet范围内分派工作则新的更大的Pod及可以执行更多的工作。 StatefulSet控制器扩展了副本的数量。如同创建StatefulSet所述StatefulSet按序号索引扩容各个Pod并且会等待前一个Pod变为Running和Ready才会启动下一个Pod。
# 将Pod容扩容为5个
[rootmaster ~]# kubectl scale statefulset web --replicas5# 可以提前执行效果更加明显
# 可以看出前一个Pod创建完成并且成功运行之后才会去创建下一个Pod而且创建Pod顺序也有要求仔细观察可以看出顺序是由低到高。
[rootmaster ~]# kubectl get pod -l appnginx --watch
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 27m
web-1 1/1 Running 0 26m
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 2s
web-3 0/1 Pending 0 0s
web-3 0/1 Pending 0 0s
web-3 0/1 ContainerCreating 0 0s
web-3 1/1 Running 0 1s
web-4 0/1 Pending 0 0s
web-4 0/1 Pending 0 0s
web-4 0/1 ContainerCreating 0 0s
web-4 1/1 Running 0 1s[rootmaster ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 27m
web-1 1/1 Running 0 27m
web-2 1/1 Running 0 22s
web-3 1/1 Running 0 20s
web-4 1/1 Running 0 19s4.2、缩容
缩容意味着减少副本数量。例如你可能因为服务的流量水平已降低并且在当前规模下存在空闲资源的原因执行缩容操作。
# 将Pod缩容为3个
[rootmaster ~]# kubectl patch sts web -p {spec:{replicas:3}}# 缩容的同时可以看出一共5个Pod缩容为3个之后是由从高到底的顺序去缩容的
[rootmaster ~]# kubectl get pod -l appnginx --watch
web-4 1/1 Terminating 0 3m43s
web-4 0/1 Terminating 0 3m44s
web-4 0/1 Terminating 0 3m44s
web-4 0/1 Terminating 0 3m44s
web-3 1/1 Terminating 0 3m45s
web-3 0/1 Terminating 0 3m46s
web-3 0/1 Terminating 0 3m46s
web-3 0/1 Terminating 0 3m46s五、更新StatefulSet
StatefulSet控制器支持自动更新。更新策略由StatefulSet API对象的spec.updateStrategy字段决定。这个特性能够用更新一个StatefulSet中Pod的容器镜像、资源请求和限制、标签和注解。有两个有效的更新策略RollingUpdate默认和OnDelete
5.1、滚动更新
RollingUpdate更新策略会更新一个StatefulSet中的所有Pod采用与序号索引相反的顺序并遵循StatefulSet的保证StatefulSet里的Pod采用和序号相反的顺序更新。在更新下一个Pod前StatefulSet控制器终止每个Pod并等待它们变成Running和Ready。请注意虽然在顺序后继者变成Running和Ready之前StatefulSet控制器不会更新下一个Pod
# 执行patch操作再次该表容器镜像
[rootmaster ~]# kubectl patch statefulset web --typejson -p[{op: replace, path: /spec/template/spec/containers/0/image, value:registry.k8s.io/nginx:1.20}]# 查看滚动更新状态
[rootmaster ~]# kubectl rollout status statefulset web
partitioned roll out complete: 3 new pods have been updated...# 查看pod状态
[rootmaster ~]# kubectl get pod -l appnginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 64s
web-1 1/1 Running 0 66s
web-2 1/1 Running 0 9m17s# 查看滚动更新后的Nginx版本
[rootmaster ~]# for p in 0 1 2; do kubectl get pod web-$p --template {{range $i, $c : .spec.containers}}{{$c.image}}{{end}}; echo; done
registry.k8s.io/nginx:1.20
registry.k8s.io/nginx:1.20
registry.k8s.io/nginx:1.20