前言
- 实际运用中,服务要有唯一不变的标识,服务升级或者启停后仍然可以使用原有方式访问。如域名。
- 服务重启后,服务之前的数据、状态等信息保持不变,如redis 持久化数据
- 服务之间存在依赖关系,如主从架构,从节点依赖主节点
针对以上业务场景,kubernetes中提供了 statefulSet 能够满足以上需求,主要介绍statefulSet 使用
场景
- 稳定、唯一的网络标识(dnsname),便于访问
- 每个Pod始终对应各自的存储路径,pod恢复时数据、状态等不会丢失
- 按顺序地增加副本、减少副本,并在减少副本时执行清理。例如:主从架构中,先启动主在启动从
- 按顺序自动地执行滚动更新
应用
创建一个有状态pod 带有副本的服务,删除一个pod ,查看状态变化
-
创建一个服务
tomcat-statefule.yaml
apiVersion: v1 kind: Service #定义一个负载均衡网络 metadata: name: stateful-tomcat labels: app: stateful-tomcat spec: ports: - port: 8123 name: web targetPort: 8080 clusterIP: None # service网络无ip selector: app: stateful-tomcat #标签为 app: stateful-tomcat 加入负载均衡网络 --- apiVersion: apps/v1 kind: StatefulSet #控制器。控制pod副本 metadata: name: stateful-tomcat spec: selector: matchLabels: app: stateful-tomcat # pod标签 serviceName: "stateful-tomcat" # 负载均衡网络名称 replicas: 3 # 副本数 template: metadata: labels: app: stateful-tomcat spec: terminationGracePeriodSeconds: 10 containers: - name: tomcat image: tomcat:7 ports: - containerPort: 8080 name: web
-
NodePort:任意机器+NodePort都能访问,
-
ClusterIP:集群内能用这个ip、service域名能访问,clusterIP: None;不要分配集群ip。headless;无头服务。稳定的域名
-
执行
kubectl apply -f tomcat-statefule.yaml # 查看 kubect get pod, service
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mjhown05-1596203020207)(C:\Users\qinxiaoran\AppData\Roaming\Typora\typora-user-images\image-20200728230152201.png)]
-
pod 按照顺序创建
-
负载均衡网络是没有ip,负载均衡网络本身也是高可用,在服务内部可以验证查看
-
网络测试
kubectl run -i --tty --image busybox dns-test --restart=Never --rm /bin/sh ping stateful-tomcat
- 进入容器内部,ping 网络返回不同ip
服务测试访问
-
-
在容器内部
#进入容器内部 [root@guanzc-130 kubernetes]# kubectl exec -it pod/stateful-tomcat-0 /bin/bash root@stateful-tomcat-0:/usr/local/tomcat# root@stateful-tomcat-0:/usr/local/tomcat# ping stateful-tomcat-0.stateful-tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-am1iFeFf-1596203020228)(C:\Users\qinxiaoran\AppData\Roaming\Typora\typora-user-images\image-20200728225957790.png)]
- 使用 容器名+容器网络+名称空间,默认名称空间,不用加。能ping 通
-
删除第一个节点
kubectl delete pod stateful-tomcat-0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1B5ihWf-1596203020229)(C:\Users\qinxiaoran\AppData\Roaming\Typora\typora-user-images\image-20200728225324863.png)]
-
节点删除后,会重新生一个新的节点,而且名称不变,在statefulset 控制器中,名称时唯一标识
总结
域名访问仅限于statefulset控制器控制的pod 服务内部通过域名和ip,非statefulset 网络无法通过域名访问