statefulset管理pod
statefulset管理pod
软件 | 版本 |
---|---|
docker | 最新版 |
kubernetes | 1.23.1 |
calico | 3.25 |
节点 | IP | 系统 | 功能 | CPU | 内存 | 硬盘 |
---|---|---|---|---|---|---|
node1 | 10.80.10.1 | centos7.9 | k8s-master | 4核心 | 8GB | 20GB |
node2 | 10.80.10.2 | centos7.9 | k8s-node | 4核心 | 8GB | 20GB |
statefulset是为了管理有状态服务的问题而设计的:
有状态服务:statefulset是有状态的集合,管理有状态的服务,它所管理的pod的名称不能随意变化。数据持久化的目录也是不一样,每一个pod都有自己独有的数据持久化存储目录。比如mysql主从、redis集群等。
无状态服务:rc、deployment、daemonSet都是管理无状态的服务,它们所管理的pod的ip、名字,启停顺序等都是随机的。个体对整体无影响,所有pod都是共用一个数据卷的,部署的tomcat就是无状态的服务,tomcat被删除,在启动一个新的tomcat,加入到集群即可,跟tomcat的名字无关。
statefulset由以下几个部分组成:
headless service:用来定义pod网路标识,生成可解析的dns记录。
volumeclaimtemplates:存储卷申请模板,创建pvc,指定pvc名称大小,自动创建pvc,且pvc由存储类供应。
statefulset:管理pod的。
什么是headless service:
headless service不分配clusterip,headless service可以通过解析service的dns,返回所有pod的dns和ip地址(statefulset部署的pod才有dns),普通的service,只能通过解析service的dns返回service的clusterip。
statefulset会为关联的pod保持一个不变的pod name。
statefulset会为关联的pod分配一个dnsname。
为什么要用volumeclaimtemplate:
对于有状态应用都会用到持久化存储,比如mysql主从,由于主从数据库的数据是不能存放在一个目录下的,每个mysql节点都需要有自己独立的存储空间。而在deployment中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,它们数据是同步的,而statefulset定义中的每一个pod都不能使用同一个存储卷,这就需要使用volumeclaintemplate,当在使用statefulset创建pod时,volumeclaintemplate会自动生成一个pvc,从而请求绑定一个pv,每一个pod都有自己专用的存储卷。
node1
查看字段:
1 | # kubectl explain statefulset |
创建存储类:
1 | # mkdir /root/statefulset && cd /root/statefulset |
1 | # kubectl apply -f class-web.yaml |
编写一个statefulset资源清单文件:
1 | # vim statefulset.yaml |
1 | # kubectl apply -f statefulset.yaml |
在共享目录创建文件夹:
1 | # mkdir /data/nfs_pro/default-www-web-0-pvc-223668d6-ac58-407a-89a5-909b6b1ebe72/web-0 |
进入容器查看:
1 | # kubectl exec -it web-0 -- /bin/ls /usr/share/nginx/html |
查看pod的dns:
1 | # kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh |
statefulset实现pod的扩容:
1 | # vim statefulset.yaml |
1 | # kubectl apply -f statefulset.yaml |
1 | # kubectl edit statefulset web |
1 | # kubectl get statefulset |
1 | # kubectl apply -f statefulset.yaml |
statefulset实现pod的缩容:
1 | # vim statefulset.yaml |
1 | # kubectl apply -f statefulset.yaml |
statefulset实现pod的更新:
1 | # vim statefulset.yaml |
1 | # kubectl apply -f statefulset.yaml |