一、状态和存储的关系
状态是进程的时间属性、无状态意味着一个进程不必跟踪过去的交互操作、本质上可以说它是一个纯粹的功能性行为、对应,有状态则以为桌进程存储了以前交互过程的记录、并且可以给予它对新的请求进行相应、至于状态信息被保存在内存中或者持久保存于磁盘上、则是另外一个问题
存储是标书持久保存数据的方法、现今通常是指机械硬盘或SSD设备。若进程仅需操作内存中的数据、则表示其无须进行磁盘I/O操作、则通常意味着数据的只读访问或读写访问行为
象限A中是那些具有读写磁盘需求的有状态应用程序、如支持事物功能的各种RDBMS存储系统、另外各种分布式存储系统也是此类应用程序的典型、如redis cluster MongoDB、Zookeeper和Cassandra等
象限B中包含两类应用程序:
一类是那些具有读写磁盘需求的无状态应用程序、如具有幂等性的文件上传类服务程序; 另一类是仅需只读类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组成
Headless Service volumeClaimTemplates StatefulSet
三、pv环境准备
1、pv配置清单
[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、创建验证
[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挂在目录
[root@node2 ~]# mkdir /data/volumes/v{1..5} [root@node2 ~]# ls /data/volumes/ v1 v2 v3 v4 v5
刚开始没有创建导致等待了近20分钟
四、创建StatefulSet对象
1、资源清单
[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、创建
[root@master chapter9]# kubectl apply -f stateful-demo.yaml service/myapp-svc created statefulset.apps/myapp created
3、观察pod资源的顺次生成过程
[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、查看状态是否就绪
[root@master ~]# kubectl get statefulsets myapp NAME READY AGE myapp 2/2 19m