StatefulSet(有状态)
概述
无状态应用:
认为Pod都是一样的。 没有顺序要求。 不用考虑在哪个Node节点上运行。 随意进行伸缩和扩展。
有状态应用:
有顺序的要求。 认为每个Pod都是不一样的。 需要考虑在哪个Node节点上运行。 需要按照顺序进行伸缩和扩展。 让每个Pod都是独立的,保持Pod启动顺序和唯一性。
StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器。
StatefulSet部署需要HeadLinessService(无头服务)
为什么需要HeadLinessService(无头服务)? 在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在StatefulSet中要求必须是有序 ,每一个Pod不能被随意取代,Pod重建后pod名称还是一样的。 而Pod IP是变化的,所以是以Pod名称来识别。Pod名称是Pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称 。 StatefulSet常用来部署RabbitMQ集群、Zookeeper集群、MySQL集群、Eureka集群等。
创建StatefulSet
创建pc-stateful.yaml文件,内容如下
apiVersion: v1 kind: Service metadata: name: service-headliness namespace: dev spec: selector: app: nginx-pod clusterIP: None # 将clusterIP设置为None,即可创建headliness Service type: ClusterIP ports: - port: 80 # Service的端口 targetPort: 80 # Pod的端口 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: pc-statefulset namespace: dev spec: replicas: 3 serviceName: service-headliness selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80
创建StatefulSet
[root@master ~]# vim pc-stateful.yaml [root@master ~]# kubectl create -f pc-stateful.yaml [root@master ~]# kubectl get statefulset pc-statefulset -n dev -o wide [root@master ~]# kubectl get pod -n dev -o wide [root@master ~]# kubectl get svc -n dev [root@master ~]# kubectl delete -f pc-stateful.yaml
Deployment和StatefulSet的区别
Deployment和StatefulSet的区别:Deployment没有唯一标识而StatefulSet有唯一标识。 StatefulSet的唯一标识是根据主机名+一定规则生成的。 StatefulSet的唯一标识是主机名.无头Service名称.命名空间.svc.cluster.local。
StatefulSet的金丝雀发布
StatefulSet支持两种更新策略:OnDelete和RollingUpdate(默认),其中OnDelete表示删除之后才更新,RollingUpdate表示滚动更新。
updateStrategy: rollingUpdate: # 如果更新的策略是OnDelete,那么rollingUpdate就失效 partition: 2 # 表示从第2个分区开始更新,默认是0 type: RollingUpdate /OnDelete # 滚动更新
示例:pc-statefulset.yaml
apiVersion: v1 kind: Service metadata: name: service-headliness namespace: dev spec: selector: app: nginx-pod clusterIP: None # 将clusterIP设置为None,即可创建headliness Service type: ClusterIP ports: - port: 80 # Service的端口 targetPort: 80 # Pod的端口 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: pc-statefulset namespace: dev spec: replicas: 3 serviceName: service-headliness selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80 updateStrategy: rollingUpdate: partition: 0 type: RollingUpdate
参考
黑马B站k8s课程https://www.bilibili.com/video/BV1Qv41167ck/ https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md https://www.yuque.com/fairy-era/yg511q/xyqxge标签:StatefulSet,Service,pc,nginx,详解,Pod,pod From: https://www.cnblogs.com/gys001/p/16912983.html