CKA备考实验 | readiness probe

书籍来源:《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文件内容如下。

##########实操验证##########
[root@vms10 probe]# cat readiness.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: app 
  name: pod1
spec:
  containers:
  - name: c1
    image: nginx 
    imagePullPolicy: IfNotPresent 
    lifecycle: 
      postStart:
        exec:
          command: ["/bin/sh","-c","touch /tmp/healthy"]
    readinessProbe:
      exec:
        command:
        - cat 
        - /tmp/healthy 
[root@vms10 probe]#

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

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

##########实操验证##########
[root@vms10 probe]# kubectl apply -f readiness.yaml
pod/pod1 created
[root@vms10 probe]# sed 's/pod1/pod2/' readiness.yaml | kubectl apply -f -
pod/pod2 created
[root@vms10 probe]# sed 's/pod1/pod3/' readiness.yaml | kubectl apply -f -
pod/pod3 created
[root@vms10 probe]#

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

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

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

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

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

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

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

##########实操验证##########
[root@vms10 probe]# kubectl exec -it pod1 -- bash
root@pod1:/# echo 111 > /usr/share/nginx/html/index.html 
root@pod1:/# exit
exit
[root@vms10 probe]# kubectl exec -it pod2 -- bash
root@pod2:/# echo 222 > /usr/share/nginx/html/index.html
root@pod2:/# exit
exit
[root@vms10 probe]# kubectl exec -it pod3 -- bash
root@pod3:/# echo 333 > /usr/share/nginx/html/index.html
root@pod3:/# exit
exit
[root@vms10 probe]#

步骤6:获取readsvc的IP。

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

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

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

##########实操验证##########
[root@vms10 probe]# curl -s 10.97.124.183
222
[root@vms10 probe]# curl -s 10.97.124.183
333
[root@vms10 probe]# curl -s 10.97.124.183
111
[root@vms10 probe]#

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

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

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

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

##########实操验证##########
[root@vms10 probe]# kubectl describe pod pod3
Name:         pod3
Namespace:    nsprobe
Priority:     0
Node:         vms12.rhce.cc/192.168.1.112
Start Time:   Mon, 05 Jun 2023 15:29:08 +0800
Labels:       run=app
Annotations:  cni.projectcalico.org/containerID: 23902ece57adb5126f09c083608a4f6a6b6db951ffd90d696bc424cb5743cc82
              cni.projectcalico.org/podIP: 10.244.14.19/32
              cni.projectcalico.org/podIPs: 10.244.14.19/32
Status:       Running
IP:           10.244.14.19
IPs:
  IP:  10.244.14.19
Containers:
  c1:
    Container ID:   docker://d46c971d72eb59e14e96a3a10cec2f43f29379bb38b1031a6d550505f5db253a
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Mon, 05 Jun 2023 15:29:09 +0800
    Ready:          False
    Restart Count:  0
    Readiness:      exec [cat /tmp/healthy] delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-65zm9 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  kube-api-access-65zm9:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age               From               Message
  ----     ------     ----              ----               -------
  Normal   Scheduled  4m51s             default-scheduler  Successfully assigned nsprobe/pod3 to vms12.rhce.cc
  Normal   Pulled     4m50s             kubelet            Container image "nginx" already present on machine
  Normal   Created    4m50s             kubelet            Created container c1
  Normal   Started    4m50s             kubelet            Started container c1
  Warning  Unhealthy  1s (x5 over 41s)  kubelet            Readiness probe failed: cat: /tmp/healthy: No such file or directory
[root@vms10 probe]#

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

步骤10:再次访问readsvc。

##########实操验证##########
[root@vms10 probe]# curl -s 10.97.124.183
222
[root@vms10 probe]# curl -s 10.97.124.183
111
[root@vms10 probe]#

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

步骤11:查看pod的状态。

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

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

##########实操验证##########
[root@vms10 probe]# kubectl exec -it pod3 -- bash
root@pod3:/# exit
exit
[root@vms10 probe]#

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

##########实操验证##########
[root@vms10 probe]# kubectl delete svc readsvc
service "readsvc" deleted
[root@vms10 probe]# 
[root@vms10 probe]# kubectl delete pod pod{1,2,3} --force
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.
pod "pod1" force deleted
pod "pod2" force deleted
pod "pod3" force deleted
[root@vms10 probe]#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值