k8s之StatefulSet
1.应用场景- 稳定的不共享持久化存储:即每个pod的存储资源是不共享的,且pod重新调度后还是能访问到相同的持久化数据,基于pvc实现。- 稳定的网络标志:即pod重新调度后其PodName和HostName不变,且PodName和HostName是相同的,基于Headless Service来实现的。- 有序部署,有序扩展:即pod是有顺序的,在部署或者扩展的时候是根据定义的顺序依次依序部署的
·
1.应用场景
- 稳定的不共享持久化存储:即每个pod的存储资源是不共享的,且pod重新调度后还是能访问到相同的持久化数据,基于pvc实现。 - 稳定的网络标志:即pod重新调度后其PodName和HostName不变,且PodName和HostName是相同的,基于Headless Service来实现的。 - 有序部署,有序扩展:即pod是有顺序的,在部署或者扩展的时候是根据定义的顺序依次依序部署的(即从0到N-1,在下一个Pod运行之前所有之前的pod必都是Running状态或者Ready状态),是基于init containers来实现的。 - 有序收缩:在pod删除时是从最后一个依次往前删除,即从N-1到0. 基于上面的特性,可以发现statefulset由以下几个部分组成: - 用于定义网络标志(DNS domain)的headless service - 用于**创建pvc的volumeClaimTemplates** - 具体的statefulSet应用
2.示例
2.1创建yaml文件
[root@vm21 opt]# vi statefulset-demo.yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None # 要点1,可以不用指定clusterIP selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" # 要点2,指定serviceName名称 replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 name: web
2.2应用yaml文件
[root@vm21 opt]# kubectl apply -f statefulset-demo.yaml service/nginx created statefulset.apps/web created
2.3查看资源清单
[root@vm21 opt]# kubectl get pods,svc,sts NAME READY STATUS RESTARTS AGE pod/web-0 1/1 Running 0 10m pod/web-1 1/1 Running 0 10m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 109m service/nginx ClusterIP None <none> 80/TCP 10m NAME READY AGE statefulset.apps/web 2/2 10m
2.4扩缩容
# 增加一个pod [root@vm21 opt]# kubectl scale --replicas=3 sts web statefulset.apps/web scaled
2.5查看资源清单
[root@vm21 opt]# kubectl get pods,svc,sts NAME READY STATUS RESTARTS AGE pod/web-0 1/1 Running 0 10m pod/web-1 1/1 Running 0 10m pod/web-2 1/1 Running 0 5m51s # 扩容后增加的pod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 109m service/nginx ClusterIP None <none> 80/TCP 10m NAME READY AGE statefulset.apps/web 3/3 10m
2.6创建外部测试pod
vi busubox-test.yaml apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox image: busybox:1.28 command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
2.7stateful资源对照清单
[root@vm21 opt]# kubectl get pod -o wide |grep web NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 35m 10.244.125.197 vm23 <none> <none> web-1 1/1 Running 0 34m 10.244.14.5 vm22 <none> <none> web-2 1/1 Running 0 30m 10.244.124.71 vm21 <none> <none>
2.8测试stateful解析
[root@vm21 opt]# kubectl exec -it busybox -- sh /bin # nslookup web-0.nginx Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: web-0.nginx Address 1: 10.244.125.197 web-0.nginx.default.svc.cluster.local #对照上面清单中web-0的IP为10.244.125.197 /bin # nslookup web-1.nginx Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: web-1.nginx Address 1: 10.244.14.5 web-1.nginx.default.svc.cluster.local #对照上面清单中web-0的IP为10.244.14.5 /bin # nslookup web-2.nginx Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: web-2.nginx Address 1: 10.244.124.71 web-2.nginx.default.svc.cluster.local #对照上面清单中web-0的IP为10.244.124.71 / # ping web-0.nginx PING web-0.nginx (10.244.125.197): 56 data bytes #对照上面清单中web-0的IP为10.244.125.197 64 bytes from 10.244.125.197: seq=0 ttl=63 time=0.173 ms 64 bytes from 10.244.125.197: seq=1 ttl=63 time=0.081 ms 64 bytes from 10.244.125.197: seq=2 ttl=63 time=0.139 ms ^C --- web-0.nginx ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.081/0.131/0.173 ms / # wget web-0.nginx Connecting to web-0.nginx (10.244.125.197:80) index.html 100% |*****************************************************| 615 0:00:00 ETA / # cat index.html <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
2.9小结
1)有序索引 对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号, 从 0 到 N-1,该序号在 StatefulSet 上是唯一的。比如``sts name=nginx ,replicas=3则对应的pod名称依次为nginx-0、nginx-1、nginx-2`, 2)稳定的网络ID StatefulSet 可以使用 "无头服务" 控制它的 Pod 的网络域。管理域的这个服务的格式为: $(服务名称).$(命名空间).svc.cluster.local 其中 cluster.local 是集群域。 一旦每个 Pod 创建成功,就会得到一个匹配的 DNS 子域,格式为: $(pod 名称).$(所属服务的 DNS 域名) 其中所属服务由 StatefulSet 的 serviceName 域来设定。
更多推荐
已为社区贡献2条内容
所有评论(0)