当前位置:   article > 正文

CKA备考实验 | readiness probe_readinessprobe配置文件

readinessprobe配置文件

书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》

一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客


关于readiness的探测和liveness的探测类似,不过readiness和liveness探测到问题之后,处理的方式是不一样的。

liveness:探测到pod有问题之后,通过重启pod来解决问题。

readiness:探测到pod有问题之后并不重启,只是svc接收到请求之后,不再转发到此pod。svc的主要作用是接收用户的请求,然后转发给后端的pod,如图10-1所示。

这里有3个pod,它们的标签是一样的,都是run=app,为具有这个标签的pod创建一个名字为readsvc的服务。当用户把请求发送给readsvc的时候,readsvc会把请求转发给后端的pod,即pod1、pod2、pod3。3台pod都配置了readiness probe,当探测到pod3有问题的时候,readsvc就不会再把请求转发给pod3了。

步骤1:创建含有readiness probe的pod,yaml文件内容如下。

  1. ##########实操验证##########
  2. [root@vms10 probe]# cat readiness.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. labels:
  7. run: app
  8. name: pod1
  9. spec:
  10. containers:
  11. - name: c1
  12. image: nginx
  13. imagePullPolicy: IfNotPresent
  14. lifecycle:
  15. postStart:
  16. exec:
  17. command: ["/bin/sh","-c","touch /tmp/healthy"]
  18. readinessProbe:
  19. exec:
  20. command:
  21. - cat
  22. - /tmp/healthy
  23. [root@vms10 probe]#

这里通过配置pod postStart钩子,让pod在启动的时候创建文件/tmp/healthy。然后通过readiness probe探测这个文件是否存在,存在则认为pod是健康的,否则认为nod出问题了。

步骤2:创建出来3个pod。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl apply -f readiness.yaml
  3. pod/pod1 created
  4. [root@vms10 probe]# sed 's/pod1/pod2/' readiness.yaml | kubectl apply -f -
  5. pod/pod2 created
  6. [root@vms10 probe]# sed 's/pod1/pod3/' readiness.yaml | kubectl apply -f -
  7. pod/pod3 created
  8. [root@vms10 probe]#

步骤3:查看pod的运行状态。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods --show-labels
  3. NAME READY STATUS RESTARTS AGE LABELS
  4. pod1 1/1 Running 0 57s run=app
  5. pod2 1/1 Running 0 41s run=app
  6. pod3 1/1 Running 0 34s run=app
  7. [root@vms10 probe]#

可以看到3个pod均具备相同的标签run=app。

步骤4:创建名字为readsvc的svc。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl expose --name=readsvc pod pod1 --port=80 --selector=run=app
  3. service/readsvc exposed
  4. [root@vms10 probe]#

虽然这里是为pod1创建的svc,但是因为它们的标签是一样的,所以这个readsvc会关联3个pod。

步骤5:为了看到svc把请求转发到不同的pod,这里修改3个pod的index.html的内容,分别为111、222、333。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl exec -it pod1 -- bash
  3. root@pod1:/# echo 111 > /usr/share/nginx/html/index.html
  4. root@pod1:/# exit
  5. exit
  6. [root@vms10 probe]# kubectl exec -it pod2 -- bash
  7. root@pod2:/# echo 222 > /usr/share/nginx/html/index.html
  8. root@pod2:/# exit
  9. exit
  10. [root@vms10 probe]# kubectl exec -it pod3 -- bash
  11. root@pod3:/# echo 333 > /usr/share/nginx/html/index.html
  12. root@pod3:/# exit
  13. exit
  14. [root@vms10 probe]#

步骤6:获取readsvc的IP。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get svc readsvc
  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. readsvc ClusterIP 10.97.124.183 <none> 80/TCP 95s
  5. [root@vms10 probe]#

从这里可以看到readsvc的IP是10.102.236.50。

步骤7:通过这个IP访问svc。

  1. ##########实操验证##########
  2. [root@vms10 probe]# curl -s 10.97.124.183
  3. 222
  4. [root@vms10 probe]# curl -s 10.97.124.183
  5. 333
  6. [root@vms10 probe]# curl -s 10.97.124.183
  7. 111
  8. [root@vms10 probe]#

可以看到,请求分别转发到了3个pod上。

步骤8:删除pod3里的/tmp/healthy,让pod3探测失败。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl exec -it pod1 -- ls /tmp/healthy
  3. /tmp/healthy
  4. [root@vms10 probe]#
  5. [root@vms10 probe]# kubectl exec -it pod3 -- rm -rf /tmp/healthy
  6. [root@vms10 probe]# kubectl exec -it pod3 -- ls /tmp/healthy
  7. ls: cannot access '/tmp/healthy': No such file or directory
  8. command terminated with exit code 2
  9. [root@vms10 probe]#

步骤9:看到pod 3的状态。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl describe pod pod3
  3. Name: pod3
  4. Namespace: nsprobe
  5. Priority: 0
  6. Node: vms12.rhce.cc/192.168.1.112
  7. Start Time: Mon, 05 Jun 2023 15:29:08 +0800
  8. Labels: run=app
  9. Annotations: cni.projectcalico.org/containerID: 23902ece57adb5126f09c083608a4f6a6b6db951ffd90d696bc424cb5743cc82
  10. cni.projectcalico.org/podIP: 10.244.14.19/32
  11. cni.projectcalico.org/podIPs: 10.244.14.19/32
  12. Status: Running
  13. IP: 10.244.14.19
  14. IPs:
  15. IP: 10.244.14.19
  16. Containers:
  17. c1:
  18. Container ID: docker://d46c971d72eb59e14e96a3a10cec2f43f29379bb38b1031a6d550505f5db253a
  19. Image: nginx
  20. Image ID: docker-pullable://nginx@sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
  21. Port: <none>
  22. Host Port: <none>
  23. State: Running
  24. Started: Mon, 05 Jun 2023 15:29:09 +0800
  25. Ready: False
  26. Restart Count: 0
  27. Readiness: exec [cat /tmp/healthy] delay=0s timeout=1s period=10s #success=1 #failure=3
  28. Environment: <none>
  29. Mounts:
  30. /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-65zm9 (ro)
  31. Conditions:
  32. Type Status
  33. Initialized True
  34. Ready False
  35. ContainersReady False
  36. PodScheduled True
  37. Volumes:
  38. kube-api-access-65zm9:
  39. Type: Projected (a volume that contains injected data from multiple sources)
  40. TokenExpirationSeconds: 3607
  41. ConfigMapName: kube-root-ca.crt
  42. ConfigMapOptional: <nil>
  43. DownwardAPI: true
  44. QoS Class: BestEffort
  45. Node-Selectors: <none>
  46. Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
  47. node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
  48. Events:
  49. Type Reason Age From Message
  50. ---- ------ ---- ---- -------
  51. Normal Scheduled 4m51s default-scheduler Successfully assigned nsprobe/pod3 to vms12.rhce.cc
  52. Normal Pulled 4m50s kubelet Container image "nginx" already present on machine
  53. Normal Created 4m50s kubelet Created container c1
  54. Normal Started 4m50s kubelet Started container c1
  55. Warning Unhealthy 1s (x5 over 41s) kubelet Readiness probe failed: cat: /tmp/healthy: No such file or directory
  56. [root@vms10 probe]#

这里可以看到已经检测到pod3是不健康的。

步骤10:再次访问readsvc。

  1. ##########实操验证##########
  2. [root@vms10 probe]# curl -s 10.97.124.183
  3. 222
  4. [root@vms10 probe]# curl -s 10.97.124.183
  5. 111
  6. [root@vms10 probe]#

可以看到read svc已经不把svc转到pod3了。

步骤11:查看pod的状态。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl get pods
  3. NAME READY STATUS RESTARTS AGE
  4. pod1 1/1 Running 0 6m36s
  5. pod2 1/1 Running 0 6m20s
  6. pod3 0/1 Running 0 6m13s
  7. [root@vms10 probe]#

这里pod3的状态虽然是显示0/1,但是pod3里的容器依然是正常运行的。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl exec -it pod3 -- bash
  3. root@pod3:/# exit
  4. exit
  5. [root@vms10 probe]#

步骤12:删除这3个pod和readsvc。

  1. ##########实操验证##########
  2. [root@vms10 probe]# kubectl delete svc readsvc
  3. service "readsvc" deleted
  4. [root@vms10 probe]#
  5. [root@vms10 probe]# kubectl delete pod pod{1,2,3} --force
  6. warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  7. pod "pod1" force deleted
  8. pod "pod2" force deleted
  9. pod "pod3" force deleted
  10. [root@vms10 probe]#
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/247256
推荐阅读
相关标签
  

闽ICP备14008679号