泰安做网站公司哪家比较好,飞行时代网站建设,企业网站开发用什么好,网站建设的收获体会一、statefullsets控制器概述
1#xff0c;举例 假如#xff0c;我们有一个deployment资源#xff0c;创建了3个nginx的副本#xff0c;对于nginx来讲#xff0c;它是不区分启动或者关闭的先后顺序的#xff0c;也就是“没有特殊状态”的一个服务#xff0c;也成“无状…一、statefullsets控制器概述
1举例 假如我们有一个deployment资源创建了3个nginx的副本对于nginx来讲它是不区分启动或者关闭的先后顺序的也就是“没有特殊状态”的一个服务也成“无状态服务”3个副本谁先启动、谁后启动都没有关系它只是用来web服务分发使用的一个工具而已 那么反之有没有需要有启动顺序、关闭顺序这样的“有状态服务”呐答案肯定是有啊 【访问顺序问题】再假如再企业当中的MySQL主从数据库架构中假设是2主1从数据架构架构本身是区分master和slave角色的在构建主从关系的时候master必须先启动不然slave没办法加入到主从架构中所以需要有相同副本服务启动的先后顺序 【副本独立的存储问题】我们知道MySQL是不能多服务共享数据目录的所以在拉去多副本的“有状态服务”时存储独立化就成了问题也就是说一个pod副本对应一个单独的存储目录。 【固定的访问地址问题】还拿MySQL做举例我们需要对有状态服务有固定寻址的能力我们知道pod删除重新拉取后ip就会发生变化那么对于mysql服务来说副本的每个pod都需要有精准的、不变的唯一标识不然主从架构等问题一旦重新新启动pod就会彻底摧毁架构也就是说pod副本删除重新拉取后能够精准的找到对应原来的服务
2总结 对于同一个deployment或者其他资源创建的pod副本我们在使用“有状态服务”的副本pod时有着三个需求 1副本启动、停止要求有顺序 2每个副本需要有独立的存储目录空间 3副本重新拉起能够有方式在其改变ip的情况下还能精准的找到对应副本
那么以上也是statefulsets控制器能够解决的问题
二、启停顺序与headless网络唯一标识
1创建一个“无头”svc资源
· 编辑无头服务svc资源清单
无头svc服务就是没有ClusterIP的svc资源 [rootk8s231 statefulsets]# cat headless.yaml apiVersion: v1 kind: Service metadata: name: xinjizhiwa-headless spec: ports: - port: 80 name: web # 将clusterIP字段设置为None表示为一个无头服务headless即svc将不会分配VIP。 clusterIP: None selector: k8s: xinjizhiwa · 创建无头svc服务 [rootk8s231 statefulsets]# kubectl apply -f headless.yaml 2创建statefullsets使用无头服务
· 编辑statefulsets资源清单
声明使用无头svc [rootk8s231 statefulsets]# vim staefulsets.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: xinjizhiwa-web spec: selector: matchLabels: k8s: xinjizhiwa #声明无头服务的service serviceName: xinjizhiwa-headless replicas: 3 template: metadata: labels: k8s: xinjizhiwa spec: containers: - name: c1 image: nginx:1.20.1-alpine · 创建statefulsets资源 [rootk8s231 statefulsets]# kubectl apply -f staefulsets.yaml 3验证无头服务机启停顺序
· 查看pod
发现破的名称是按照statefulsets资源的名称加上数字顺序排列生成的 [rootk8s231 statefulsets]# kubectl get pods -o wide · 查看无头svc [rootk8s231 statefulsets]# kubectl get svc · 创建一个用来测试【pod网络唯一标识 】的pod容器 [rootk8s231 statefulsets]# kubectl run -it dns-test --rm --imagealpine:latest -- sh / # / # for i in seq 0 2;do ping xinjizhiwa-web-${i}.xinjizhiwa-headless.default.svc.xinjizhiwa.com -c3;done 网路唯一标识 【pod的名称】.【无头服务的名称】.【名称空间】.【svc】.【集群DNS域名】 拓展这个就是集群DNS域名的所在位置可以通过这里来查看 [rootk8s231 deploy]# vim /var/lib/kubelet/config.yaml ....... clusterDNS: - 10.200.0.10 clusterDomain: xinjizhiwa.com · 删除pod重新拉起在ping唯一标识测试结果 [rootk8s231 deploy]# kubectl delete pods --all 删除pod等待重新拉取 · 结论 通过ping唯一标识ping通后删除pod在ping唯一标识还可以ping通查看pod的ip已经重新拉起后改变了可还是ping通了就证明唯一标识成功 三、StatefulSets副本独立存储
1创建一个无头服务 [rootk8s231 vol]# vim headless.yaml apiVersion: v1 kind: Service metadata: name: xjzw-headless spec: ports: - port: 80 name: web clusterIP: None selector: k8s: xjzw [rootk8s231 vol]# kubectl apply -f headless.yaml 查看无头svc [rootk8s231 vol]# kubectl get svc 2创建StatefulSets资源
声明独立存储 [rootk8s231 vol]# cat statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: xjzw-web spec: selector: matchLabels: k8s: xjzw serviceName: xjzw-headless replicas: 3 #声明创建pvc存储卷卷申请模板会为每个Pod去创建唯一的pvc并与之关联哟! volumeClaimTemplates: - metadata: name: data spec: accessModes: [ ReadWriteOnce ] # 声明咱们自定义的动态存储类即storageclass动态存储资源。 storageClassName: managed-nfs-storage resources: requests: storage: 2Gi template: metadata: labels: k8s: xjzw spec: containers: - name: nginx image: nginx:1.20.1-alpine volumeMounts: - name: data mountPath: /usr/share/nginx/html [rootk8s231 vol]# kubectl apply -f statefulset.yaml 查看statefulsets资源 [rootk8s231 vol]# kubectl get statefulsets NAME READY AGE xinjizhiwa-web 3/3 55m xjzw-web 3/3 17s 3验证是否有独立存储
查看nfs挂载地址可以看到创建出来三个存储地址证明3个副本都有自己的独立存储空间了 [rootk8s231 vol]# kubectl exec -it xjzw-web-0 -- sh / # echo 111111111 /usr/share/nginx/html/index.html / # exit [rootk8s231 vol]# kubectl exec -it xjzw-web-1 -- sh / # echo 222222222 /usr/share/nginx/html/index.html / # exit [rootk8s231 vol]# kubectl exec -it xjzw-web-2 -- sh / # echo 333333333 /usr/share/nginx/html/index.html / # exit 证明三个pod副本的存储是相互独立的 至此咱们的statefulset资源学习完毕
四、总结
1唯一的pod副本网络标识重启pod时ip改变也不影响访问
2启停顺序安转数字排序
3个副本通过声明存储卷申请模板独立存储