一、statefullsets控制器概述
1,举例
假如,我们有一个deployment资源,创建了3个nginx的副本,对于nginx来讲,它是不区分启动或者关闭的先后顺序的,也就是“没有特殊状态”的一个服务,也成“无状态服务”,3个副本,谁先启动、谁后启动都没有关系,它只是用来web服务分发使用的一个工具而已;
那么反之,有没有需要有启动顺序、关闭顺序这样的“有状态服务”呐?答案肯定是有啊;
【访问顺序问题】,再假如,企业当中的MySQL主从数据库架构中,假设是1主2从数据架构,架构本身是区分master和slave角色的,在构建主从关系的时候,master必须先启动,不然slave没办法加入到主从架构中,所以需要有相同副本服务启动的先后顺序;
【副本独立的存储问题】,我们知道,MySQL是不能多服务共享数据目录的,所以在拉去多副本的“有状态服务”时,存储独立化就成了问题,也就是说,一个pod副本对应一个单独的存储目录。
【固定的访问地址问题】,还拿MySQL做举例,我们需要对有状态服务,有固定寻址的能力,我们知道,pod删除重新拉取后,ip就会发生变化,那么对于mysql服务来说,副本的每个pod都需要有精准的、不变的唯一标识,不然主从架构等问题,一旦重新新启动pod,就会彻底摧毁架构,也就是说pod副本删除重新拉取后,能够精准的找到对应原来的服务;
2,总结:
对于同一个deployment或者其他资源创建的pod副本,我们在使用“有状态服务”的副本pod时,有着三个需求:
1,副本启动、停止要求有顺序;
2,每个副本需要有独立的存储目录空间;
3,副本重新拉起,能够有方式在其改变ip的情况下还能精准的找到对应副本;
二、启停顺序与headless网络唯一标识
1,创建一个“无头”svc资源
无头svc服务,就是没有ClusterIP的svc资源;
[root@master statefulset]# cat headless.yaml
apiVersion: v1
kind: Service
metadata:
name: dolphin-headless
spec:
ports:
- name: web
port: 80
clusterIP: None
selector:
app: dolphin
[root@master statefulset]# kubectl apply -f headless.yaml
2,创建statefullsets使用无头服务
[root@master statefulset]# cat statefulsets.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: dolphin-web
spec:
selector:
matchLabels:
app: dolphin
serviceName: dolphin-headless #声明无头服务的service
replicas: 3
template:
metadata:
labels:
app: dolphin
spec:
containers:
- name: c1
image: nginx:1.20.1-alpine
[root@master statefulset]# kubectl apply -f statefulsets.yaml
3,验证无头服务机启停顺序
· 查看pod
发现破的名称,是按照statefulsets资源的名称加上数字顺序排列生成的;
· 查看无头svc、ep
我们可以看到CLUSTER-IP为None,无头svc没有自己的IP
ep正常
· 创建一个用来测试【pod网络唯一标识 】的pod容器
[root@master ~]# kubectl run -it dns-test --rm --image=alpine:latest -- sh
for i in `seq 0 2`;do ping dolphin-web-${i}.dolphin-headless.default.svc.cluster.local -c3;done
· 删除pod重新拉起,在ping唯一标识,测试结果
[root@master ~]# kubectl delete pod dolphin-web-0 dolphin-web-1 dolphin-web-2
pod "dolphin-web-0" deleted
pod "dolphin-web-1" deleted
pod "dolphin-web-2" deleted
重新拉起成功
网路唯一标识:
【pod的名称】.【无头服务的名称】.【名称空间】.【svc】.【集群DNS域名】
拓展:这个就是集群DNS域名的所在位置,可以通过这里来查看;
[root@root deploy]# vim /var/lib/kubelet/config.yaml
...
cgroupDriver: systemd
clusterDNS:
- 10.0.0.10
clusterDomain: cluster.local...
· 结论
通过ping唯一标识,ping通后,删除pod,在ping唯一标识还可以ping通,查看pod的ip已经重新拉起后改变了,可还是ping通了,就证明,唯一标识成功;
三、StatefulSets副本独立存储
1,创建一个无头服务
[root@master statefulset]# cat headless.yaml
apiVersion: v1
kind: Service
metadata:
name: dolphin-headless
spec:
ports:
- name: web
port: 80
clusterIP: None
selector:
app: dolphin
[root@master statefulset]# kubectl apply -f headless.yaml
2,创建StatefulSets资源
[root@master statefulset]# cat statefulsets.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: dolphin-web
spec:
selector:
matchLabels:
app: dolphin
serviceName: dolphin-headless #声明无头服务的service
replicas: 3
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 2Gi
template:
metadata:
labels:
app: dolphin
spec:
containers:
- name: c1
image: nginx:1.20.1-alpine
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
[root@master statefulset]# kubectl apply -f statefulsets.yaml
查看资源
3,验证是否有独立存储
查看nfs挂载地址,可以看到,创建出来三个存储地址,证明3个副本都有自己的独立存储空间了;
[root@master statefulset]# ll /data/kubernetes/storageclass/
总用量 0
drwxrwxrwx 2 root root 6 5月 10 14:40 default-data-dolphin-web-0-pvc-6cd0b499-cd90-4374-ad0b-89177baa51bb
drwxrwxrwx 2 root root 6 5月 10 14:40 default-data-dolphin-web-1-pvc-7e94ab1e-62e2-4f60-a36f-bf75eed87a3c
drwxrwxrwx 2 root root 6 5月 10 14:40 default-data-dolphin-web-2-pvc-cfe8d426-3bd5-4f4d-9e8b-9230dc0d7935
drwxrwxrwx 2 root root 22 5月 9 16:50 default-test-pvc-claim-pvc-bc7d9e40-2856-4839-9643-284f78998eb8
进入资源写入数据
[root@master statefulset]# kubectl exec -it dolphin-web-0 -- sh
/ # echo 11111111 > /usr/share/nginx/html/index.html
/ #
[root@master statefulset]# kubectl exec -it dolphin-web-1 -- sh
/ # echo 22222222 > /usr/share/nginx/html/index.html
/ #
[root@master statefulset]# kubectl exec -it dolphin-web-2 -- sh
/ # echo 33333333 > /usr/share/nginx/html/index.html
访问查看结果
证明三个pod副本的存储是相互独立的
四、总结:
1,唯一的pod副本网络标识,重启pod时ip改变也不影响访问;
2,启停顺序,安转数字排序;
3,个副本通过声明存储卷申请模板,独立存储;