关于Kubernetes-v1.23.6-StartupProbe-启动探针的效果演示及说明
Posted on 2023-09-06 22:48 520_1351 阅读(243) 评论(0) 编辑 收藏 举报本文,还是以一个nginx为例,创建一个nginx-demo的pod ,并且引入启动探针StartupProbe, 探针选项,位于spec:下面的containers:下面,与image选项同级的位置
1、先看如下 nginx-demo.yaml 文件,内容如下:
[root@k8s-master qq-5201351]# cat nginx-demo.yaml apiVersion: v1 # api 文档版本 kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象 metadata: # Pod 相关的元数据,用于描述 Pod 的数据 name: nginx-demo # Pod 的名称 namespace: 'default' # 命名空间的配置 spec: # 期望 Pod 按照这里面的描述进行创建 containers: # 对于 Pod 中的容器描述 - name: nginx # 容器的名称 image: nginx:1.7.9 # 指定容器的镜像 imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的 startupProbe: # 应用启动探针配置 httpGet: # 探测方式,基于http请求探测 path: /api/path # http 请求路径 port: 80 # 请求端口 failureThreshold: 3 # 失败多少次才算真正失败 periodSeconds: 10 # 间隔时间 successThreshold: 1 # 多少次监测成功才算真正的成功 timeoutSeconds: 5 # 请求的超时时间 ports: - name: http # 端口名称 containerPort: 80 # 描述容器内要暴露什么端口 protocol: TCP # 描述该端口是基于哪种协议通信的 restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
2、可以看到引入了startupProbe 启动探针,然后根据yaml文件进行创建pod,(扩展一下,创建成功,如果将如下的create改成delete也可以删除相关的pod资源)
[root@k8s-master qq-5201351]# kubectl create -f nginx-demo.yaml pod/nginx-demo created [root@k8s-master qq-5201351]
3、可以等待一下,再进行观察 ,可以发现,状态虽然为Running ,但READY的个数为0
[root@k8s-master ~]# kubectl get po NAME READY STATUS RESTARTS AGE nginx-demo 0/1 ContainerCreating 0 61s [root@k8s-master ~]# kubectl get po NAME READY STATUS RESTARTS AGE nginx-demo 0/1 Running 0 81s
4、然后查看一下,相关的日志信息:kubectl describe po nginx-demo
Containers: nginx: Container ID: docker://edc7f3e13d076027acbbaf680b95dbe42c6d88ec8000500f1c9eca1f10eeb5fa Image: nginx:1.7.9 Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451 Port: 80/TCP Host Port: 0/TCP State: Terminated Reason: Completed Exit Code: 0 Started: Wed, 06 Sep 2023 21:55:00 +0800 Finished: Wed, 06 Sep 2023 21:55:30 +0800 Ready: False Restart Count: 4 Startup: http-get http://:80/api/path delay=0s timeout=5s period=10s #success=1 #failure=3 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9wjkx (ro) Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True
由此可以看出来,Container nginx failed startup probe
当然这里主要是因为笔者,在启动探针处,httpGet 了一个不存在的path , 如果将path的值改成:/index.html 就没有问题了
其他补充:对于探测的方式,有如下3种
ExecAction: 在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的
TCPSocketAction: 通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康
HTTPGetAction: 生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康
因此上方实验,如果是TCPSocket的方式,则可以写成如下样式:
startupProbe: # 应用启动探针配置 tcpSocket: # 探测方式,基于tcpSocket的方式探测 port: 80 # 请求端口 failureThreshold: 3 # 失败多少次才算真正失败 periodSeconds: 10 # 间隔时间 successThreshold: 1 # 多少次监测成功才算真正的成功 timeoutSeconds: 5 # 请求的超时时间
如果是基于命令的探测方式,可以按如下样式:
startupProbe: # 应用启动探针配置 exec: command: - sh - -c - "sleep 3;echo success > /inited" failureThreshold: 3 # 失败多少次才算真正失败 periodSeconds: 10 # 间隔时间 successThreshold: 1 # 多少次监测成功才算真正的成功 timeoutSeconds: 5 # 请求的超时时间
于是笔者,也尝试使用命令的探测方式,重新创建了一个pod,最后验证一下:kubectl describe pod nginx-demo
Containers: nginx: Container ID: docker://3ee7dad58bc0135637246d6cd66778de76434eac9acd7540aa4fc31c30fcbdc6 Image: nginx:1.7.9 Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451 Port: 80/TCP Host Port: 0/TCP State: Running Started: Wed, 06 Sep 2023 22:39:21 +0800 Ready: True Restart Count: 0 Startup: exec [sh -c sleep 3;echo success > /inited] delay=0s timeout=5s period=10s #success=1 #failure=3 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kjtwd (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-kjtwd: 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 2m1s default-scheduler Successfully assigned default/nginx-demo to k8s-node2 Normal Pulled 119s kubelet Container image "nginx:1.7.9" already present on machine Normal Created 119s kubelet Created container nginx Normal Started 119s kubelet Started container nginx
这样,我们还可以通过kubectl进行到容器,查看我们创建的文件:
[root@k8s-master ~]# kubectl exec -it nginx-demo -c nginx -- cat /inited success [root@k8s-master ~]#
尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/17683622.html
作者:一名卑微的IT民工
出处:https://www.cnblogs.com/5201351
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
由于博主的水平不高,文章没有高度、深度和广度,只是凑字数,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个卑微的IT民工!