Kubernetes进阶实战读书笔记:StatefulSet控制器(特性验证)
一、Pod资源标识符
由statefulset控制器创建的pod资源拥有固定、唯一的表示和专用存储卷、即便重新调度或终止后重建、其名称依然保持不变、且此前的存储卷及其数据不会丢失
1 2 3 4 | [root@master ~] # kubectl get pods -l app=myapp-pod NAME READY STATUS RESTARTS AGE myapp-0 1 /1 Running 0 40m myapp-1 1 /1 Running 0 25m |
Pod资源的主机名同其资源名称、因此也是带索引序号的名称格式、如下面的命令结果所示:
1 2 3 | [root@master ~] # for i in 0 1; do kubectl exec myapp-$i -- sh -c 'hostname'; done myapp-0 myapp-1 |
Pod资源创建后DNS资源记录格式解析
1 | $(pod_name).$(service_name).$(namespace).svc.cluster. local |
验证过程
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 | [root@master ~] # kubectl run -it --image busybox dns-client --restart=Never --rm /bin/sh If you don't see a command prompt, try pressing enter. / # nslookup myapp-0.myapp.default.svc.cluster.local Server: 10.96.0.10 Address: 10.96.0.10:53 Name: myapp-0.myapp.default.svc.cluster. local Address: 10.244.2.83 *** Can't find myapp-0.myapp.default.svc.cluster. local : No answer / # nslookup myapp-1.myapp.default.svc.cluster.local Server: 10.96.0.10 Address: 10.96.0.10:53 Name: myapp-1.myapp.default.svc.cluster. local Address: 10.244.1.58 *** Can't find myapp-1.myapp.default.svc.cluster. local : No answer / # nslookup myapp Server: 10.96.0.10 Address: 10.96.0.10:53 Name: myapp.default.svc.cluster. local Address: 10.244.1.58 Name: myapp.default.svc.cluster. local Address: 10.244.2.83 *** Can't find myapp.svc.cluster. local : No answer *** Can't find myapp.cluster. local : No answer *** Can't find myapp.localdomain: No answer *** Can't find myapp.default.svc.cluster. local : No answer *** Can't find myapp.svc.cluster. local : No answer *** Can't find myapp.cluster. local : No answer *** Can't find myapp.localdomain: No answer |
statefulset控制器管控的pod资源终止后会由控制器自动进行重建
Headless Service资源记住于SRV记录来引用真正提供服务的后端POD资源的主机名称、进行指向包含POD IP地址的记录条目
虽然其IP地址存在变化的可能性、但它的名称标识在重建会保持不变、例如、在另一个终端删除POD资源myapp-1
1 2 | [root@master ~] # kubectl delete pods myapp-1 pod "myapp-1" deleted |
删除完成后控制器将随之开始重建pod资源
1 2 3 4 | [root@master ~] # kubectl get pods -l app=myapp-pod NAME READY STATUS RESTARTS AGE myapp-0 1 /1 Running 0 68m myapp-1 0 /1 ContainerCreating 0 1s |
由此上面的命令结果可知,其名称标识符的确未发生改变
POD资源DNS表示亦未发生改变、但其IP地址会指向重建后的pod资源地址
1 2 3 4 5 6 7 8 | / # nslookup myapp-1.myapp.default.svc.cluster.local Server: 10.96.0.10 Address: 10.96.0.10:53 Name: myapp-1.myapp.default.svc.cluster. local Address: 10.244.1.60 *** Can't find myapp-1.myapp.default.svc.cluster. local : No answer |
二、Pod资源的专有存储卷
1 2 3 4 | [root@master ~] # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myappdata-myapp-0 Bound pv002 5Gi RWO 79m myappdata-myapp-1 Bound pv001 5Gi RWO,RWX 57m |
为pod资源生成测试页面、用于存储卷持久性测试
1 2 3 4 5 | [root@master ~] # for i in 0 1 2; do kubectl exec myapp-$i -- sh -c 'echo $(date),Hostname:$(hostname) > /usr/share/nginx/html/index.html';done sh: can't create /usr/share/nginx/html/index .html: Read-only file system command terminated with exit code 1 sh: can't create /usr/share/nginx/html/index .html: Read-only file system command terminated with exit code 1 |
启动客户端向pod对象进行访问测试
1 2 3 4 5 6 | [root@master ~] # kubectl run -it --image cirros client --restart=Never --rm /bin/sh If you don't see a command prompt, try pressing enter. / # curl myapp-0.myapp Thu Sep 3 09:32:10 UTC 2020,Hostname:myapp-0 / # curl myapp-1.myapp Thu Sep 3 09:23:35 UTC 2020,Hostname:myapp-1 |
删除statefulset控制器的pod资源、存储卷并不会删除
1 2 3 4 5 6 7 8 9 | [root@master ~] # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client 1 /1 Running 0 2m4s 10.244.2.89 node2 <none> <none> myapp-0 1 /1 Running 0 5m 10.244.2.88 node2 <none> <none> myapp-1 1 /1 Running 0 4m58s 10.244.1.62 node1 <none> <none> myapp-2 1 /1 Running 0 4m54s 10.244.0.25 master <none> <none> [root@master ~] # kubectl delete pods myapp-0 pod "myapp-0" deleted |
另一个终端监控到的删除及重建过程如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@master ~] # kubectl get pods -l app=myapp-pod -w NAME READY STATUS RESTARTS AGE myapp-0 1 /1 Running 0 5m47s myapp-1 1 /1 Running 0 5m45s myapp-2 1 /1 Running 0 5m41s myapp-0 1 /1 Terminating 0 6m7s myapp-0 0 /1 Terminating 0 6m8s myapp-0 0 /1 Terminating 0 6m9s myapp-0 0 /1 Terminating 0 6m9s myapp-0 0 /1 Pending 0 0s myapp-0 0 /1 Pending 0 0s myapp-0 0 /1 ContainerCreating 0 0s myapp-0 1 /1 Running 0 2s |
再次测试pod资源接口、存储卷是复用此前的那个
1 2 | / # curl myapp-0.myapp Thu Sep 3 09:32:10 UTC 2020,Hostname:myapp-0 |
由此表明、重建的pod资源被重新调度至那个节点、此前的PVC资源就会被分配至那个节点、这样就真正实现了数据的持久化
三、statefulset资源扩缩容
1、将myapp中的pod副本数量扩展至5个
1 2 | [root@master ~] # kubectl scale statefulset myapp --replicas=5 statefulset.apps /myapp scaled |
2、statefulset资源扩展过程顺次进行、序号依次向后进行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@master ~] # kubectl get pods -l app=myapp-pod -w NAME READY STATUS RESTARTS AGE myapp-0 1 /1 Running 0 105s myapp-1 1 /1 Running 0 7m52s myapp-2 1 /1 Running 0 7m48s myapp-3 0 /1 Pending 0 0s myapp-3 0 /1 Pending 0 0s myapp-3 0 /1 Pending 0 2s myapp-3 0 /1 ContainerCreating 0 2s myapp-3 1 /1 Running 0 4s myapp-4 0 /1 Pending 0 0s myapp-4 0 /1 Pending 0 0s myapp-4 0 /1 Pending 0 2s myapp-4 0 /1 ContainerCreating 0 2s myapp-4 1 /1 Running 0 4s |
3、缩容只需要将其副本数量调低即可
1 2 | [root@master ~] # kubectl patch statefulset myapp -p '{"spec":{"replicas":3}}' statefulset.apps /myapp patched |
4、缩减规模时终止pod资源倒序逐一进行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@master ~] # kubectl get pods -l app=myapp-pod -w NAME READY STATUS RESTARTS AGE myapp-0 1 /1 Running 0 2m57s myapp-1 1 /1 Running 0 9m4s myapp-2 1 /1 Running 0 9m myapp-3 1 /1 Running 0 42s myapp-4 1 /1 Running 0 38s myapp-4 1 /1 Terminating 0 5m27s myapp-4 0 /1 Terminating 0 5m28s myapp-4 0 /1 Terminating 0 5m29s myapp-4 0 /1 Terminating 0 5m30s myapp-3 1 /1 Terminating 0 5m34s myapp-3 0 /1 Terminating 0 5m35s myapp-3 0 /1 Terminating 0 5m36s myapp-3 0 /1 Terminating 0 5m36s |
直到余下的数量满足为止、另外终止pod资源后、其存储卷并不会被删除、因此缩减规模后若再将其扩展回来、那么此前的数据依然可用、且pod资源名称保持不变
作者:罗阿红
出处:http://www.cnblogs.com/luoahong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构