代码编织梦想

probe :探测pod是否正常健康运行 --》监控
根据pod启动的不同阶段进行探测


探测方法
exec
到容器里运行一条命令,执行成功,说明pod是存活的。
grpc
使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC 健康检查。
httpGet
对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。
tcpSocket
访问pod里主程序开放的端口 --》nc,nmap,telnet等

[root@k8smaster ~]# yum install telnet -y
[root@k8smaster ~]# telnet www.baidu.com 80
Trying 14.119.104.189...
Connected to www.baidu.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
[root@k8smaster ~]# echo $?
0

[root@k8smaster ~]# yum install nc -y 
[root@k8smaster ~]# nc -z  www.baidu.com 80
[root@k8smaster ~]# echo $?
0
[root@k8smaster ~]# nc -z  www.baidu.com 8080
[root@k8smaster ~]# echo $?
1

探测结果

Success(成功)

Failure(失败)

Unknown(未知)


探针类型

livenessProbe
指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。
readinessProbe
指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。
startupProbe
指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器, 而容器依其重启策略进行重启。


配置存活探针

[root@k8smaster ~]# mkdir probe
[root@k8smaster ~]# cd probe

定义存活命令
[root@k8smaster probe]# wget https://k8s.io/examples/pods/probe/exec-liveness.yaml
--2023-03-28 11:13:17--  https://k8s.io/examples/pods/probe/exec-liveness.yaml
正在解析主机 k8s.io (k8s.io)... 34.107.204.206, 2600:1901:0:26f3::
正在连接 k8s.io (k8s.io)|34.107.204.206|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 301 Moved Permanently
位置:https://kubernetes.io/examples/pods/probe/exec-liveness.yaml [跟随至新的 URL]
--2023-03-28 11:13:18--  https://kubernetes.io/examples/pods/probe/exec-liveness.yaml
正在解析主机 kubernetes.io (kubernetes.io)... 147.75.40.148
正在连接 kubernetes.io (kubernetes.io)|147.75.40.148|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:396 [application/x-yaml]
正在保存至: “exec-liveness.yaml”

100%[===========================================================>] 396         --.-K/s 用时 0s      

2023-03-28 11:13:19 (84.0 MB/s) - 已保存 “exec-liveness.yaml” [396/396])

[root@k8smaster probe]# ls
exec-liveness.yaml

[root@k8smaster probe]# cat exec-liveness.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: registry.k8s.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 
[root@k8smaster probe]# kubectl apply -f exec-liveness.yaml 
pod/liveness-exec created
[root@k8smaster probe]# kubectl get pod
NAME            READY   STATUS              RESTARTS   AGE
liveness-exec   0/1     ContainerCreating   0          28s
[root@k8smaster probe]# kubectl get pod
NAME            READY   STATUS         RESTARTS   AGE
liveness-exec   0/1     ErrImagePull   0          33s

这里发现pod的状态是ErrImagePull,说明拉取不到镜像。

解决办法:修改image

[root@k8smaster probe]# vim exec-liveness.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness

    image: busybox  # 修改为 image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

[root@k8smaster probe]# kubectl delete -f exec-liveness.yaml 
pod "liveness-exec" deleted
[root@k8smaster probe]# kubectl apply -f exec-liveness.yaml 
pod/liveness-exec created
[root@k8smaster probe]# kubectl get pod
NAME            READY   STATUS              RESTARTS   AGE
liveness-exec   0/1     ContainerCreating   0          8s
[root@k8smaster probe]# kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
liveness-exec   1/1     Running   0          37s
[root@k8smaster probe]# kubectl get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP              NODE       NOMINATED NODE   READINESS GATES
liveness-exec   1/1     Running   0          65s   10.244.249.26   k8snode1   <none>           <none>

查看 Pod 的事件

[root@k8smaster probe]# kubectl describe pod liveness-exec
Events:
  Type     Reason     Age                 From               Message
  ----     ------     ----                ----               -------
  Normal   Scheduled  119s                default-scheduler  Successfully assigned default/liveness-exec to k8snode1
  Normal   Pulled     101s                kubelet            Successfully pulled image "busybox" in 17.001214974s
  Warning  Unhealthy  57s (x3 over 67s)   kubelet            Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
  Normal   Killing    57s                 kubelet            Container liveness failed liveness probe, will be restarted
  Normal   Pulling    27s (x2 over 118s)  kubelet            Pulling image "busybox"
  Normal   Created    12s (x2 over 101s)  kubelet            Created container liveness
  Normal   Pulled     12s                 kubelet            Successfully pulled image "busybox" in 15.5761624s
  Normal   Started    11s (x2 over 101s)  kubelet            Started container liveness
[root@k8smaster probe]# kubectl get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE     IP              NODE       NOMINATED NODE   READINESS GATES
liveness-exec   1/1     Running  
2          3m40s   10.244.249.26   k8snode1   <none>           <none>

一旦失败的容器恢复为运行状态,RESTARTS 计数器就会增加 1


定义一个存活态 HTTP 请求接口

[root@k8smaster probe]# wget https://k8s.io/examples/pods/probe/http-liveness.yaml
--2023-03-28 11:31:35--  https://k8s.io/examples/pods/probe/http-liveness.yaml
正在解析主机 k8s.io (k8s.io)... 34.107.204.206, 2600:1901:0:26f3::
正在连接 k8s.io (k8s.io)|34.107.204.206|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 301 Moved Permanently
位置:https://kubernetes.io/examples/pods/probe/http-liveness.yaml [跟随至新的 URL]
--2023-03-28 11:31:35--  https://kubernetes.io/examples/pods/probe/http-liveness.yaml
正在解析主机 kubernetes.io (kubernetes.io)... 147.75.40.148
正在连接 kubernetes.io (kubernetes.io)|147.75.40.148|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:389 [application/x-yaml]
正在保存至: “http-liveness.yaml”

100%[======================================================================>] 389         --.-K/s 用时 0s      

2023-03-28 11:31:36 (73.9 MB/s) - 已保存 “http-liveness.yaml” [389/389])

[root@k8smaster probe]# ls
exec-liveness.yaml  http-liveness.yaml

[root@k8smaster probe]# cat http-liveness.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: registry.k8s.io/liveness
    imagePullPolicy: IfNotPresent
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

[root@k8smaster probe]# kubectl get pod -o wide
NAME            READY   STATUS             RESTARTS   AGE   IP              NODE       NOMINATED NODE   READINESS GATES
liveness-http   0/1     ImagePullBackOff   0          39s   10.244.249.29   k8snode1   <none>           <none>

这里pod的状态是ImagePullBackOff;说明Pod卡顿在镜像拉取循环中

解决办法:如果有国外的云服务器,可以下载后传回本机,再用xftp上传到Linux里

[root@k8snode1 ~]# ls
liveness.tar
您在 /var/spool/mail/root 中有新邮件
[root@k8snode1 ~]# docker load -i liveness.tar 
5f70bf18a086: Loading layer [==================================================>]  1.024kB/1.024kB
6def2c1ad6bb: Loading layer [==================================================>]  4.389MB/4.389MB
Loaded image: registry.k8s.io/liveness:latest

[root@k8smaster probe]# kubectl  explain pod.spec.containers.imagePullPolicy
KIND:     Pod
VERSION:  v1

FIELD:    imagePullPolicy <string>

DESCRIPTION:
     Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always
     if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated.
     More info:
     https://kubernetes.io/docs/concepts/containers/images#updating-images

[root@k8smaster probe]# cat http-liveness.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: registry.k8s.io/liveness
    imagePullPolicy: IfNotPresent   # 本地有就不会去网上下载
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

[root@k8smaster probe]# kubectl delete -f http-liveness.yaml 
pod "liveness-http" deleted
[root@k8smaster probe]# kubectl apply -f http-liveness.yaml 
pod/liveness-http created
[root@k8smaster probe]# kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
liveness-http   1/1     Running   0          12s
[root@k8smaster probe]# kubectl get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP              NODE       NOMINATED NODE   READINESS GATES
liveness-http   1/1     Running   0          3s    10.244.249.31   k8snode1   <none>           <none>
[root@k8smaster probe]# curl 10.244.249.31:8080/healthz
ok[root@k8smaster probe]# curl 10.244.249.31:8080/healthz


定义TCP的存活探测
[root@k8smaster probe]# wget https://k8s.io/examples/pods/probe/tcp-liveness-readiness.yaml
--2023-03-28 11:52:00--  https://k8s.io/examples/pods/probe/tcp-liveness-readiness.yaml
正在解析主机 k8s.io (k8s.io)... 34.107.204.206, 2600:1901:0:26f3::
正在连接 k8s.io (k8s.io)|34.107.204.206|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 301 Moved Permanently
位置:https://kubernetes.io/examples/pods/probe/tcp-liveness-readiness.yaml [跟随至新的 URL]
--2023-03-28 11:52:01--  https://kubernetes.io/examples/pods/probe/tcp-liveness-readiness.yaml
正在解析主机 kubernetes.io (kubernetes.io)... 147.75.40.148
正在连接 kubernetes.io (kubernetes.io)|147.75.40.148|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:410 [application/x-yaml]
正在保存至: “tcp-liveness-readiness.yaml”

100%[======================================================================>] 410         --.-K/s 用时 0s      

2023-03-28 11:52:02 (42.6 MB/s) - 已保存 “tcp-liveness-readiness.yaml” [410/410])

[root@k8smaster probe]# ls
exec-liveness.yaml  http-liveness.yaml  tcp-liveness-readiness.yaml

[root@k8smaster probe]# kubectl apply -f tcp-liveness-readiness.yaml 
pod/goproxy created
[root@k8smaster probe]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
goproxy   0/1     Running   0          4s
15秒之后,通过看Pod事件来检测存活探针
[root@k8smaster probe]# kubectl describe pod goproxy
Name:         goproxy
Namespace:    default
Priority:     0
Node:         k8snode2/192.168.102.138
Start Time:   Wed, 29 Mar 2023 12:55:00 +0800
Labels:       app=goproxy
Annotations:  cni.projectcalico.org/podIP: 10.244.185.216/32
              cni.projectcalico.org/podIPs: 10.244.185.216/32
Status:       Running
IP:           10.244.185.216
IPs:
  IP:  10.244.185.216
Containers:
  goproxy:
    Container ID:   docker://622244978a3949b06a5682b2beda743d1e17e24a676aba0e77987d278a7cb8c5
    Image:          registry.k8s.io/goproxy:0.1
    Image ID:       docker://sha256:ca30c529755f98c53f660f86fe42f1b38f19ca6127c57aa6025afaf9a016742a
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 29 Mar 2023 12:55:01 +0800
    Ready:          True
    Restart Count:  0
    Liveness:       tcp-socket :8080 delay=15s timeout=1s period=20s #success=1 #failure=3
    Readiness:      tcp-socket :8080 delay=5s timeout=1s period=10s #success=1 #failure=3
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-r7hjj (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-r7hjj:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-r7hjj
    Optional:    false
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  30s   default-scheduler  Successfully assigned default/goproxy to k8snode2
  Normal  Pulled     30s   kubelet            Container image "registry.k8s.io/goproxy:0.1" already present on machine
  Normal  Created    30s   kubelet            Created container goproxy
  Normal  Started    30s   kubelet            Started container goproxy

注意:也会碰到Pod卡顿在镜像拉取循环中;需要自己去解决镜像下载问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_60271706/article/details/129831048

k8s - 容器探针(probe)_wang725的博客-爱代码爱编程_k8s probes

Configure Liveness and Readiness Probes 对线上业务来说,保证服务的正常稳定是重中之重,对故障服务的及时处理避免影响业务以及快速恢复一直是开发运维的难点。Kubernetes提供了健康检

k8s 存活探针livenessprobe_katy的小乖的博客-爱代码爱编程_livenessprobe

目录 为什么需要存活探针 k8s容器探测机制 http get tcp socket exec 给pod添加存活探针:livenessProbe 查看pod存活探针信息 livenessProbe描述  添加livenessProbe参数 为什么需要存活探针 如果没有探针,k8s无法知道应用是否还活着,只要进程还在运行,k8s则认为

从零开始入门 k8s | 可观测性:你的应用健康吗?-爱代码爱编程

作者 | 莫源 阿里巴巴技术专家 一、需求来源 首先来看一下,整个需求的来源:当把应用迁移到 Kubernetes 之后,要如何去保障应用的健康与稳定呢?其实很简单,可以从两个方面来进行增强: 首先是提高应用的可观测性

k8s - Container probe 容器探针-爱代码爱编程

探针是由每个Node上的kubelet定期执行的诊断 (这里复习下,每个Node上有一个kubelet和kube-proxy,kubelet用于管理pod等等组件 ) 通过kubelet调用container实现的handler来执行诊断,有三种类型的handler: cmd.如果命令以0执行完毕视为成功tcp.端口打开视为成功httpget.响应&g

K8s的LivenessProbe 和ReadinessProbe的启动顺序问题-爱代码爱编程

突然想到这个问题,幸好K8s的issue上有相关问题: Order of readiness probe and liveness probeLivenessProbe should start after ReadinessProbe Succeeded if ReadinessProbe is specifiedissue 27114 Liven

k8s配置http健康探针Probe-爱代码爱编程

apiVersion: apps/v1 kind: Deployment metadata: name: unioj-judger-deployment namespace: default spec: selector: matchLabels: app: unioj-judger replicas: 1 te

k8s—健康检查及可用性探针probe_道行长的博客-爱代码爱编程

由于监听端口不一定保证服务能活,所以需要健康检查和监控服务。 健康检查 探针种类 livenessprobe:健康状态检查,周期性检查服务是否存活,检查结果失败将会重启容器 readinessprobe:可用性检查,周期性检查服务是否可用,不可用将从 service 的 endpoints 移除 探针的检查方法: exec:执行命令后根据返回

k8s健康检查之 livenessprobe/readinessprobe_云原生社区的博客-爱代码爱编程

健康检查  一个pod启动了之后,它有可能还在做初始化,这就意味着在初始化的应用进程还不能接受网络流量,所以要去控制一下pod的状态,也就是我还没有就绪,我还不能够接受流量。 有些应用跑着跑着没有响应,出现大量的503,应用实例以及不能够正常工作了,是否需要帮你重启。 tcp stocket  查看某个端口,比如某个应用跑在80端口上面,你只需

k8s 之 readinessprobe(就绪探针)使用的迷惑_k8s readiness-爱代码爱编程

一、问题 当我们将某应用的新版本发布到 K8s 的时候,经常会出现这样一个场景: Pod 已经运行起来了(READY=1/1,STATUS=Running),但是 Pod 中的应用(例如:springboot)还在