zoukankan      html  css  js  c++  java
  • 【七】Kubernetes 探针介绍

    一、探针概述

    探针是有 kubelet 对容器执行的定期诊断,并不是由 Master 节点发起的探测,而是由每一个 Node 所在的 kubelet 进行探测,这样可以减轻 Master 节点系统负载压力。

    kubelet 要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。一共有三种类型的处理程序:

    • ExecAction: 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功,非 0 都属于不成功。

    • TCPSocketAction: 对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。

    • HTTPGetAction: 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

    每次探测都将获得以下三种结果之一:

    • Success(成功):容器通过了诊断。
    • Failure(失败):容器未通过诊断。
    • Unknown(未知):诊断失败,因此不会采取任何行动。

    两种探针方式:

    liveness Probe:是一个存活探测器,会随着 Pod 生命周期一直循环检测。探测容器是否正在运行,如果存活探测失败,则 kubelet 会杀死容器,然后根据其容器的重启策略来对容器进行操作,默认为 Always,则 Pod 进行重启。

    readiness Probe:是一个就绪探测器,检测 Pod 是否到达就绪状态,只有达到就绪状态了才可以对外提供服务,当一个 Pod 内的所有容器都准备好了,才能把这个 Pod 看作就绪了。

    readiness Probe 应用场景:

    就绪探针可以应用在 Service 后端的 Pod 探测上,在 Pod 还没有准备好的时候,会从 Service 的负载均衡器中剔除。

    二、探针实例测试

    2.1 就绪探针 - HTTP Get

    readiness-httpget.yaml如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: readiness-httpget   # Pod 名称
      namespace: test           # Pod 所在的命名空间
    spec:
      containers:
      - name: readiness-httpget-container       # 容器名称
        image: hub.test.com/library/mynginx:v1  # 镜像地址
        imagePullPolicy: IfNotPresent           # 镜像下载策略
        readinessProbe:             # 就绪探测
          httpGet:                  # 检测方案
            path: /index1.html      # 检测路径
            port: 80                # 检测端口
          initialDelaySeconds: 3    # 启动后多少秒开始第一次检测
          periodSeconds: 3          # 每次间隔检测时间
    

    实际就是检测:http://localhost/index1.html,是否正常。

    创建 Pod

    [root@k8s-master01 ~]# kubectl create -f readiness-httpget.yaml 
    pod/readiness-httpget created
    

    查看 Pod 状态

    image-20210603163935025

    虽然已经 Running 了,但是还没就绪状态,因为我们这个容器没有index1.html这个页面。

    查看该 Pod 的详细详细

    [root@k8s-master01 ~]# kubectl describe pod readiness-httpget -n test
    ...
    Events:
      Type     Reason     Age                  From               Message
      ----     ------     ----                 ----               -------
      Normal   Scheduled  5m11s                default-scheduler  Successfully assigned test/readiness-httpget to k8s-node01
      Normal   Pulled     5m10s                kubelet            Container image "hub.test.com/library/mynginx:v1" already present on machine
      Normal   Created    5m10s                kubelet            Created container readiness-httpget-container
      Normal   Started    5m10s                kubelet            Started container readiness-httpget-container
      Warning  Unhealthy  8s (x100 over 5m5s)  kubelet            Readiness probe failed: HTTP probe failed with statuscode: 404
    

    image-20210603164320813

    提示就绪检测找不到该页面,返回状态码 404。

    接下来进入该容器手动创建index1.html页面

    [root@k8s-master01 ~]# kubectl exec readiness-httpget -n test -it -- /bin/bash
    root@readiness-httpget:/# cd /usr/share/nginx/html/
    root@readiness-httpget:/usr/share/nginx/html# ls
    50x.html  index.html
    root@readiness-httpget:/usr/share/nginx/html# touch index1.html 
    root@readiness-httpget:/usr/share/nginx/html# exit
    

    再次查看 Pod 状态已经就绪状态了

    image-20210603164938219

    2.2 存活探针 - exec

    liveness-exec.yaml文件如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: liveness-exec       # Pod 名称
      namespace: test           # Pod 所在的命名空间
    spec:
      containers:
      - name: liveness-exec-container               # 容器名称
        image: hub.test.com/library/busybox:latest  # 镜像地址
        imagePullPolicy: IfNotPresent               # 镜像下载策略
        command: ["/bin/sh","-c","touch /tmp/live; sleep 60; rm -rf /tmp/live; sleep 3600"]
        # 创建 live 文件,休眠60秒,删除 live 文件,再休眠 1 分钟。
        livenessProbe:              # 存活探测
          exec:                     # 检测方案
            command: ["test","-e","/tmp/live"]  # 检测该文件是否存在,返回值 0 成功,非 0 失败
          initialDelaySeconds: 3    # 启动后多少秒开始第一次检测
          periodSeconds: 3          # 每次间隔检测时间
    

    创建 Pod

    [root@k8s-master01 ~]# kubectl create -f liveness-exec.yaml 
    pod/liveness-exec created
    

    查看 Pod 状态,加上-w实时查看

    [root@k8s-master01 ~]# kubectl get pod -n test -w
    

    image-20210603171543754

    从上图可以看到 RESTARTS 已经重启一次了,它会循环重启,因为重新创建 Pod 到时候 /tmp/live 就会被创建,但是 60 秒后又被删除。

    2.3 存活探针 - HTTPGet

    liveness-httpgat.yaml文件如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: liveness-httpgat    # Pod 名称
      namespace: test           # Pod 所在的命名空间
    spec:
      containers:
      - name: liveness-httpgat-container            # 容器名称
        image: hub.test.com/library/mynginx:v1      # 镜像地址
        imagePullPolicy: IfNotPresent               # 镜像下载策略
        ports:
        - name: http
          containerPort: 80
        livenessProbe:              # 存活探测
          httpGet:                  # 检测方案
            port: http
            path: /index.html
          initialDelaySeconds: 3    # 启动后多少秒开始第一次检测
          periodSeconds: 3          # 每次间隔检测时间
          timeoutSeconds: 10        # 探测的超时时间
    

    创建 Pod

    [root@k8s-master01 ~]# kubectl create -f liveness-httpget.yaml 
    pod/liveness-httpgat created
    

    查看 Pod 状态,此时是正常的

    [root@k8s-master01 ~]# kubectl get pod -n test
    NAME                               READY   STATUS    RESTARTS   AGE
    hpa-nginx-deploy-9f8676f85-5fk6c   1/1     Running   0          12m
    liveness-httpgat                   1/1     Running   0          30s
    

    现在将 nginx 容器里面的 index.html 文件给删除

    [root@k8s-master01 ~]# kubectl exec liveness-httpgat -n test -it -- rm -rf /usr/share/nginx/html/index.html
    

    image-20210603173503627

    重启次数变为 1 ,由于 liveness没有检测到 index.html 文件,则会删掉主容器,主容器一旦被删除 Pod 也会进行重启。

    2.4 存活探针 - TCP

    liveness-tcp.yaml文件如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: liveness-tcp        # Pod 名称
      namespace: test           # Pod 所在的命名空间
    spec:
      containers:
      - name: liveness-tcp-container                # 容器名称
        image: hub.test.com/library/mynginx:v1      # 镜像地址
        imagePullPolicy: IfNotPresent               # 镜像下载策略
        livenessProbe:                # 存活探测
          tcpSocket:                  # 检测方案
            port: 8080                # 检测端口
          initialDelaySeconds: 3      # 启动后多少秒开始第一次检测
          periodSeconds: 3            # 每次间隔检测时间
    

    创建 Pod

    [root@k8s-master01 ~]# kubectl create -f liveness-tcp.yaml 
    pod/liveness-tcp created
    

    查看 Pod 状态,此时由于 nginx 端口为 80,所以检测不到 8080 端口,会一直重启。

    image-20210603174704209

    2.5 就绪探针+存活探针 - HTTPGet

    live-readi-httpgat.yaml文件如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: live-readi-httpgat    # Pod 名称
      namespace: test             # Pod 所在的命名空间
    spec:
      containers:
      - name: live-readi-httpgat-container          # 容器名称
        image: hub.test.com/library/mynginx:v1      # 镜像地址
        imagePullPolicy: IfNotPresent               # 镜像下载策略
        ports:
        - name: http
          containerPort: 80         # 容器端口
        readinessProbe:             # 就绪探测
          httpGet:                  # 检测方案
            path: /index1.html      # 检测路径
            port: 80                # 检测端口
          initialDelaySeconds: 3    
          periodSeconds: 3          
        livenessProbe:              # 存活探测
          httpGet:                  # 检测方案
            port: http              # 检测协议
            path: /index.html       # 检测路径
          initialDelaySeconds: 3    # 启动后多少秒开始第一次检测
          periodSeconds: 3          # 每次间隔检测时间
          timeoutSeconds: 10        # 探测的超时时间
    

    创建 Pod

    [root@k8s-master01 ~]# kubectl create -f live-read-httpget.yaml 
    pod/live-readi-httpgat created
    

    查看 Pod 状态

    image-20210603175600770

    虽然是 Running 状态,但是还没 Read,因为就绪探针没有检测到index1.html这个文件存在。

    进入容器手动创建测试

    [root@k8s-master01 ~]# kubectl exec live-readi-httpgat -n test -it -- /bin/bash
    root@live-readi-httpgat:/# cd /usr/share/nginx/html/
    root@live-readi-httpgat:/usr/share/nginx/html# touch index1.html
    

    再次查看 Pod 状态,现在已经就绪状态

    image-20210603175930057

    我们再测试liveness探针,删除 index.html 文件

    [root@k8s-master01 ~]# kubectl exec live-readi-httpgat -n test -it -- rm -rf /usr/share/nginx/html/index.html
    

    可以看到 Pod 重启 1 次,又回到未就绪状态了,因为重启完后默认是没有index1.html 文件的

    image-20210603180317721

    三、配置补充

    使用启动探测器保护慢启动容器

    有时候,会有一些现有的应用程序在启动时需要较多的初始化时间。 要不影响对引起探测死锁的快速响应,这种情况下,设置存活探测参数是要技巧的。 技巧就是使用一个命令来设置启动探测,针对HTTP 或者 TCP 检测,可以通过设置 failureThreshold * periodSeconds 参数来保证有足够长的时间应对糟糕情况下的启动时间。

    实例:

    startupProbe:
      httpGet:
        path: /test
        port: liveness-port
      failureThreshold: 30
      periodSeconds: 10
    

    应用程序可以有最多 5 分钟(30 * 10 = 300s) 的时间来完成它的启动。

    还有很多配置字段,可以使用这些字段精确的控制存活和就绪检测的行为:

    • initialDelaySeconds:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。
    • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
    • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
    • successThreshold:探测器在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。
    • failureThreshold:当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。


    作者:神奇二进制
    文章出处:https://www.cnblogs.com/l-hh/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
    文章如有叙述不当的地方,欢迎指正。如果觉得文章对你有帮助,可以精神上的支持 [推荐] 或者 [关注我] ,一起交流,共同进步!

  • 相关阅读:
    开发脚本自动部署及监控
    内存进程与软件包安装
    Linux常用指令
    网络协议
    Python基础(二)
    python基础(一)
    shell编程
    正则与sed,grep,awk三剑客
    网络配置和元字符
    nginx
  • 原文地址:https://www.cnblogs.com/l-hh/p/14848256.html
Copyright © 2011-2022 走看看