确认[Kubernetes]就绪探针的运行情况
首先
既然上次已经确认了Liveness Probe的运作情况,这次我想确认一下Readiness Probe的运作情况。
我想请您参考上一次的内容,了解Liveness Probe和Readiness Probe之间的差异、健康检查的方式以及间隔。
确认[Kubernetes]的健康检查是否正常运行
确认操作
如果有两个Pod,当Readiness Probe检查成功时,流量将从负载均衡器中进行平衡。(见下图 左侧)
如果检查失败,流量将被控制器禁止从负载均衡器流出。(见下图 右侧)
此时,与Liveness Probe不同,Readiness Probe不会重新启动Pod。
我希望能够亲自确认这个动作。
执行
服务,Pod的部署。
首先,部署一个没有设置LoadBalancer和Readiness Probe的Pod。
apiVersion: v1
kind: Service
metadata:
name: load-balancer
spec:
ports:
- name: load-balancer
port: 8080
protocol: TCP
targetPort: 80
nodePort: 30002
selector:
app: app1
type: LoadBalancer
apiVersion: v1
kind: Pod
metadata:
labels:
app: app1
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
$ kubectl apply -f lb.yaml
service/load-balancer created
$ kubectl apply -f nginx.yaml
pod/nginx created
下一个步骤是部署已设置了Readiness Probe的Pod。
本次的设置将使用hostPath将worker节点的/test挂载到/check,并将其下的testfile作为检查对象。
需要注意的是,检查对象的testfile已事先在每个worker节点上创建好。
apiVersion: v1
kind: Pod
metadata:
labels:
app: app1
name: nginx-readiness
spec:
containers:
- name: nginx-readiness
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- mountPath: /check
name: check-vol
readinessProbe:
exec:
command:
- cat
- /check/testfile
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 1
volumes:
- name: check-vol
hostPath:
path: /test
type: Directory
$ kubectl apply -f readiness-exec.yaml
pod/nginx-readiness created
我想确认一下外部是否可以访问,所以在每个容器的index.html文件中写入主机名,以便知道负载均衡是指向哪个容器的。
$ kubectl exec -it nginx /bin/bash
root@nginx:/# echo `hostname` > /usr/share/nginx/html/index.html
root@nginx:/# cat /usr/share/nginx/html/index.html
nginx
另一个Pod也使用相同的步骤记录主机名。
确认动作
以5秒的间隔从外部访问到负载均衡器。
[client]$ while true; do curl -s http://10.20.30.150:8080 ;sleep 5; done
nginx-readiness
nginx
nginx-readiness
nginx
nginx-readiness
nginx
nginx-readiness
nginx
这个时候有两个Pod进行负载均衡。
请确定部署了Pod的节点,并尝试从工作节点上删除testfile。
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 11m 192.168.79.99 k8s-worker01 <none> <none>
nginx-readiness 1/1 Running 0 7m35s 192.168.69.247 k8s-worker02 <none> <none>
$ ssh k8s-worker02
[worker02]$ sudo rm /test/testfile
那么,我们可以看出只有“nginx”处于负载均衡状态。
[client]$ while true; do curl -s http://10.20.30.150:8080 ;sleep 5; done
nginx-readiness
nginx
nginx-readiness
nginx
・・・ # Readiness Probeが失敗↓
nginx
nginx
nginx
nginx
nginx
nginx
nginx
nginx
nginx
我尝试将测试文件还原回原始状态。
[worker02]$ sudo touch /test/testfile
再次,将被平衡分配到两个Pod中。
[client]$ while true; do curl -s http://10.20.30.150:8080 ;sleep 5; done
nginx-readiness
nginx
nginx-readiness
nginx
・・・ # Readiness Probeが失敗↓
nginx
nginx
nginx
nginx
nginx
nginx
・・・ # Readiness Probeが再び成功↓
nginx-readiness
nginx
nginx-readiness
nginx
nginx-readiness
nginx
确认这些Pod的状态变化后,情况如下。
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4m56s
nginx-readiness 1/1 Running 0 36s
nginx-readiness 0/1 Running 0 7m58s #testfileを削除し、Readiness Probeが失敗する
nginx-readiness 1/1 Running 0 9m58s #testfileを復元し、Readiness Probeが成功する
你可以看到 Pod 不再处于 READY 状态,但没有重新启动。
通过HTTP获取资源/进行TCP套接字通信
关于httpGet和tcpSocket的问题,
-
- 設定方法はLiveness Probeのマニフェストの「livenessProbe」を「readinessProbe」に変更
- 動作はReadiness Probeのexecと同様
因此,细节我将略过不提。
总结
我已经确认了上一次和这一次在Pod的健康检查机制中的”Liveness Probe”和”Readiness Probe”的运作。这两个都不难设置,但是根据需求来设计检查什么以及如何检查似乎是困难的。
另外,Liveness Probe和Readiness Probe可以同时设置,因此需要对系统启动时和运行时的检查进行区分考虑。