Kubernetes进阶实战读书笔记:StatefulSet控制器(一)
一、状态和存储的关系
状态是进程的时间属性、无状态意味着一个进程不必跟踪过去的交互操作、本质上可以说它是一个纯粹的功能性行为、对应,有状态则以为桌进程存储了以前交互过程的记录、并且可以给予它对新的请求进行相应、至于状态信息被保存在内存中或者持久保存于磁盘上、则是另外一个问题
存储是标书持久保存数据的方法、现今通常是指机械硬盘或SSD设备。若进程仅需操作内存中的数据、则表示其无须进行磁盘I/O操作、则通常意味着数据的只读访问或读写访问行为
象限A中是那些具有读写磁盘需求的有状态应用程序、如支持事物功能的各种RDBMS存储系统、另外各种分布式存储系统也是此类应用程序的典型、如redis cluster MongoDB、Zookeeper和Cassandra等
象限B中包含两类应用程序:
1 2 | 一类是那些具有读写磁盘需求的无状态应用程序、如具有幂等性的文件上传类服务程序; 另一类是仅需只读类I /O 访问的无状态应用程序、例如:从外部存储加载静态资源以相应用户请求的web服务程序 |
象限C中是无磁盘访问需要的无状态应用程序、如地理坐标转换器应用
象限D中是无磁盘访问需求的有状态应用程序、如电子商城程序中的购物车系统
设计有状态应用程序时需要着重考虑的另一个方面是数据持久存储的位置
二、StatefulSet控制器概述
1、ReplicaSetStatefulSet对比
ReplicaSet 管控下的pod资源更像是一群"家禽"、他们无状态、每个个体均被重构亦能保证不变、因此也就可在任意时刻被另一个具有不同标识的同类失误所取代、
而StatefulSet控制器下的pod资源更像是多个"宠物(pet)" 每一个实力都有着其特有的状态、即使被重构、也的与其前任拥有想用的表示、事实上在云原声用用的体系里有两组常用的近义词、第一组是无状态(stateless)、牧畜(cattle)、无名(nameless)和可丢弃(disposable)、它们都不可用于表述无状态应用、另一组是有状态(stateful)、宠物(pet)、具有(non-disposable),它们则都是可用于称呼有状态应用
2、StatefulSet的特性
- 稳定且唯一的网络标识符
- 稳定且持久的存储
- 有序、优雅地部署和扩展
- 有序、优雅地删除和中指
- 有序而自动地滚动更新
3、一个典型的StatefulSet组成
1 2 3 | Headless Service volumeClaimTemplates StatefulSet |
三、pv环境准备
1、pv配置清单
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | [root@master chapter7] # cat pv-demo.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv001 labels: name: pv001 spec: nfs: path: "/data/volumes/v1" server: node2 accessModes: [ "ReadWriteMany" , "ReadWriteOnce" ] capacity: storage: 5Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv002 labels: name: pv002 spec: nfs: path: "/data/volumes/v2" server: node2 accessModes: [ "ReadWriteOnce" ] capacity: storage: 5Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv003 labels: name: pv003 spec: nfs: path: "/data/volumes/v3" server: node2 accessModes: [ "ReadWriteMany" , "ReadWriteOnce" ] capacity: storage: 5Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv004 labels: name: pv004 spec: nfs: path: "/data/volumes/v4" server: node2 accessModes: [ "ReadWriteMany" , "ReadWriteOnce" ] capacity: storage: 10Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv005 labels: name: pv005 spec: nfs: path: "/data/volumes/v5" server: node2 accessModes: [ "ReadWriteMany" , "ReadWriteOnce" ] capacity: storage: 10Gi[root@master chapter7] # |
2、创建验证
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@master chapter7] # kubectl apply -f pv-demo.yaml persistentvolume /pv001 created persistentvolume /pv002 created persistentvolume /pv003 created persistentvolume /pv004 created persistentvolume /pv005 created [root@master chapter7] # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 5Gi RWO,RWX Retain Available 6s pv002 5Gi RWO Retain Available 6s pv003 5Gi RWO,RWX Retain Available 6s pv004 10Gi RWO,RWX Retain Available 6s pv005 10Gi RWO,RWX Retain Available 6s |
3、创建pv挂在目录
1 2 3 | [root@node2 ~] # mkdir /data/volumes/v{1..5} [root@node2 ~] # ls /data/volumes/ v1 v2 v3 v4 v5 |
刚开始没有创建导致等待了近20分钟
四、创建StatefulSet对象
1、资源清单
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 38 39 40 41 42 43 44 45 46 47 | [root@master chapter9] # cat stateful-demo.yaml apiVersion: v1 kind: Service metadata: name: myapp labels: app: myapp spec: ports: - port: 80 name: web clusterIP: None selector: app: myapp-pod --- apiVersion: apps /v1 kind: StatefulSet metadata: name: myapp spec: serviceName: myapp replicas: 2 selector: matchLabels: app: myapp-pod template: metadata: labels: app: myapp-pod spec: containers: - name: myapp image: ikubernetes /myapp :v5 ports: - containerPort: 80 name: web volumeMounts: - name: myappdata mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: myappdata spec: accessModes: [ "ReadWriteMany" , "ReadWriteOnce" ] resources: requests: storage: 2Gi |
2、创建
1 2 3 | [root@master chapter9] # kubectl apply -f stateful-demo.yaml service /myapp-svc created statefulset.apps /myapp created |
3、观察pod资源的顺次生成过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@master ~] # kubectl get pods -l app=myapp-pod -w NAME READY STATUS RESTARTS AGE myapp-0 0 /1 Pending 0 0s myapp-0 0 /1 Pending 0 0s myapp-0 0 /1 Pending 0 2s myapp-0 0 /1 ContainerCreating 0 2s myapp-0 1 /1 Running 0 5s myapp-1 0 /1 Pending 0 0s myapp-1 0 /1 Pending 0 0s myapp-1 0 /1 Pending 0 2s myapp-1 0 /1 ContainerCreating 0 2s myapp-1 1 /1 Running 0 5s myapp-2 0 /1 Pending 0 0s myapp-2 0 /1 Pending 0 0s myapp-2 0 /1 Pending 0 2s myapp-2 0 /1 ContainerCreating 0 2s myapp-2 1 /1 Running 0 14s |
4、查看状态是否就绪
1 2 3 | [root@master ~] # kubectl get statefulsets myapp NAME READY AGE myapp 2 /2 19m |
【推荐】国内首个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语句:使用策略模式优化代码结构