学习极客时间上的《深入剖析Kubernetes》
秉持眼过千遍不如手过一遍的原则。动手实践并记录结果
对应章节:18 | 深入理解StatefulSet(一):拓扑状态
Headless Service
创建service
1 2 3 4 5 6 7 8 9 10 11 12 13
| apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx
|
1 2 3
| $ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx ClusterIP None <none> 80/TCP 129m
|
创建StatefulSet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 name: web
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $ kubectl apply -f statefulset.yaml statefulset.apps/web created $ kubectl get pods -w -l app=nginx NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 2s web-1 0/1 ContainerCreating 0 1s web-1 1/1 Running 0 2s $ kubectl get statefulset -o wide NAME READY AGE CONTAINERS IMAGES web 2/2 52s nginx nginx $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 85s 172.1.1.199 node2 <none> <none> web-1 1/1 Running 0 81s 172.1.2.180 bqi-k8s-node3 <none> <none>
|
可以看出,statefulset创建出来的pod,名字是固定的,而不再像deployment中的,pod名字会变化
验证
1 2 3 4
| $ kubectl exec web-0 -- sh -c 'hostname' web-0 $ kubectl exec web-1 -- sh -c 'hostname' web-1
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $ kubectl run -i --tty --image busybox:1.28.4 web-test --restart=Never --rm -- /bin/sh If you don't see a command prompt, try pressing enter. / # 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: 172.1.1.199 web-0.nginx.default.svc.cluster.local / # 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: 172.1.2.180 web-1.nginx.default.svc.cluster.local / #
|
重建pod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $ kubectl delete pod -l app=nginx pod "web-0" deleted pod "web-1" deleted
$ kubectl get pod -w -l app=nginx NAME READY STATUS RESTARTS AGE web-0 0/1 ContainerCreating 0 0s web-0 1/1 Running 0 1s web-1 0/1 Pending 0 0s web-1 0/1 Pending 0 0s web-1 0/1 ContainerCreating 0 0s web-1 1/1 Running 0 3s $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 85s 172.1.1.201 node2 <none> <none> web-1 1/1 Running 0 81s 172.1.2.181 bqi-k8s-node3 <none> <none>
|
可以看到,当删除了相关的pod后,kubernetes会以同样的名字重建pod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $ kubectl run -i --tty --image busybox:1.28.4 connect-test --restart=Never --rm -- /bin/sh If you don't see a command prompt, try pressing enter. / # 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: 172.1.1.201 web-0.nginx.default.svc.cluster.local / # 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: 172.1.2.181 web-1.nginx.default.svc.cluster.local / #
|
重建后,依然可以访问web-0.nginx
,但IP地址发生了变化
小结
本节课程主要学习了StatefulSet这个控制器,K8s在按照pod模版进行创建时:
- 对pod进行编号并逐一完成创建工作
- 当重建发生时,也会按照编号对pod逐一进行操作
- 通过headless service,StatefulSet 为每个 Pod 创建了一个固定并且稳定的 DNS 记录