一:Statefulset
StatefulSet是为了解决有状态服务的问题,对应的Deployment和ReplicaSet是为了无状态服务而设计,其应用场景包括:
1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
2.稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
3.有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
4.有序收缩,有序删除(即从N-1到0)
因为statefulset要求Pod的名称是有顺序的,每一个Pod都不能被随意取代,也就是即使Pod重建之后,名称依然不变。为后端的每一个Pod去命名。
从上面的应用场景可以发现,StatefulSet由以下几部分组成:
1.用于定义网络标志的Headless Service(headless-svc:无头服务。因为没有IP地址,所以它不具备负载均衡的功能了。)
2.用于创建PersistentVolumes的volumeClaimTemplates
3.定义具体应用的StatefulSet
StatefulSet:Pod控制器。
RC、RS、Deployment、DS。 无状态的服务。
template(模板):根据模板创建出来的Pod,它们的状态都是一模一样的(除了名称、IP、域名之外)
可以理解为:任何一个Pod,都可以被删除,然后用新生成的Pod进行替换。
有状态的服务:需要记录前一次或者多次通信中的相关时间,以作为下一次通信的分类标准。比如:MySQL等数据库服务。(Pod的名称,不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独有的数据持久化存储目录。)
每一个Pod-----对应一个PVC-----每一个PVC对应一个PV。
测试:要求
二、以自己的名称创建一个名称空间,以下所有资源都运行在此空间中。
用statefuset资源运行一个httpd web服务,要求3个Pod,但是每个Pod的主界面内容不一样,并且都要做专有的数据持久化,尝试删除其中一个Pod,查看新生成的Pod,是否数据与之前一致。
1.基于NFS服务,创建NFS服务。
1.[root@master ~]# yum -y install nfs-utils rpcbind 2.[root@master ~]# mkdir /nfsdata
br/>4./nfsdata *(rw,sync,no_root_squash)
5.[root@master ~]# systemctl start nfs-server.service <br/6.[root@master ~]# systemctl start rpcbind 7.[root@master ~]# showmount -e
br/>1.[root@master yaml]# kubectl apply -f nfs-deployment.yaml <br/2.deployment.extensions/nfs-client-provisioner created 3.[root@master yaml]# kubectl get pod -n lbs-test
br/>1.[root@master yaml]# kubectl apply -f sc.yaml <br/2.storageclass.storage.k8s.io/sc-nfs created 3.[root@master yaml]# kubectl get sc -n lbs-test
br/>1.[root@master yaml]# kubectl apply -f statefulset.yaml <br/2.service/headless-svc created 3.statefulset.apps/statefulset-test created
4.[root@master yaml]# kubectl get pod -n lbs-test <br/" rel="nofollow">br/>3.statefulset.apps/statefulset-test created
4.[root@master yaml]# kubectl get pod -n lbs-test <br/5.NAME READY STATUS RESTARTS AGE
6.nfs-client-provisioner-5d88975f6d-wdbnc 1/1 Running 0 22m
7.statefulset-test-0 1/1 Running 0 8m59s
8.statefulset-test-1 1/1 Running 0 2m30s
9.statefulset-test-2 1/1 Running 0 109s
**查看是否自动创建PV及PVC**
PV:
1.[root@master yaml]# kubectl get pv -n lbs-test
2.NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
3.pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5 100Mi RWO Delete Bound lbh-test/test-statefulset-test-2 sc-nfs 4m23s
4.pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5 100Mi RWO Delete Bound lbh-test/test-statefulset-test-0 sc-nfs 11m
5.pvc-99137753-ccd0-4524-bf40-f3576fc97eba 100Mi RWO Delete Bound lbh-test/test-statefulset-test-1 sc-nfs 5m4s
PVC:
1.[root@master yaml]# kubectl get pvc -n lbs-test
2.NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
3.test-statefulset-test-0 Bound pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5 100Mi RWO sc-nfs 13m
4.test-statefulset-test-1 Bound pvc-99137753-ccd0-4524-bf40-f3576fc97eba 100Mi RWO sc-nfs 6m42s
5.test-statefulset-test-2 Bound pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5 100Mi RWO sc-nfs 6m1s
查看是否创建持久化目录:
1.[root@master yaml]# ls /nfsdata/
2.lbh-test-test-statefulset-test-0-pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5
3.lbh-test-test-statefulset-test-1-pvc-99137753-ccd0-4524-bf40-f3576fc97eba
4.lbh-test-test-statefulset-test-2-pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5
6.在pod资源内创建数据。并访问测试。
1.[root@master yaml]# cd /nfsdata/
2.[root@master nfsdata]# echo 111 > lbs-test-test-statefulset-test-0-pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5/index.html
3.[root@master nfsdata]# echo 222 > lbs-test-test-statefulset-test-1-pvc-99137753-ccd0-4524-bf40-f3576fc97eba/index.html
4.[root@master nfsdata]# echo 333 > lbs-test-test-statefulset-test-2-pvc-0454e9ad-892f-4e39-8dcb-79664f65d1e5/index.html
5.[root@master nfsdata]# kubectl get pod -o wide -n lbs-test
6.NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
7.nfs-client-provisioner-5d88975f6d-wdbnc 1/1 Running 0 30m 10.244.2.2 node02 <none> <none>
8.statefulset-test-0 1/1 Running 0 17m 10.244.1.2 node01 <none> <none>
9.statefulset-test-1 1/1 Running 0 10m 10.244.2.3 node02 <none> <none>
10.statefulset-test-2 1/1 Running 0 9m57s 10.244.1.3 node01 <none> <none>
11.[root@master nfsdata]# curl 10.244.1.2
12.111
13.[root@master nfsdata]# curl 10.244.2.3
14.222
15.[root@master nfsdata]# curl 10.244.1.3
16.333
7.删除其中一个pod,查看该pod资源的数据是否会**重新创建并存在。**
1.[root@master ~]# kubectl get pod -n lbs-test
2.NAME READY STATUS RESTARTS AGE
3.nfs-client-provisioner-5d88975f6d-wdbnc 1/1 Running 0 33m
4.statefulset-test-0 1/1 Running 0 20m
5.statefulset-test-1 1/1 Running 0 13m
6.statefulset-test-2 1/1 Running 0 13m
7.[root@master ~]# kubectl delete pod -n lbs-test statefulset-test-0
8.pod "statefulset-test-0" deleted
**9. 删除后会重新创建pod资源**
10.[root@master ~]# kubectl get pod -n lbs-test -o wide
11.NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
12.nfs-client-provisioner-5d88975f6d-wdbnc 1/1 Running 0 35m 10.244.2.2 node02 <none> <none>
13.statefulset-test-0 1/1 Running 0 51s 10.244.1.4 node01 <none> <none>
14.statefulset-test-1 1/1 Running 0 15m 10.244.2.3 node02 <none> <none>
15.statefulset-test-2 1/1 Running 0 14m 10.244.1.3 node01 <none> <none>
**数据依旧存在。**
16.[root@master ~]# curl 10.244.1.4
17.111
18.[root@master ~]# cat /nfsdata/lbs-test-test-statefulset-test-0-pvc-2cb98c60-977f-4f3b-ba97-b84275f3b9e5/index.html
19.111
StatefulSet资源对象,针对有状态的服务的数据持久化测试完成。
通过测试,即使删除Pod,重新生成调度后,依旧能访问到之前的持久化数据。