kubernetes系列七之探针

文章目录

  • pod探针的基本概念
    • pod状态
    • 更准确的判断Pod状态
    • 容器探针
    • 检测结果
  • 使用存活探针
    • 存活探针案例
    • liveness探针流程
    • 查看存活探针信息
    • 探针高级配置
    • 存活探针 - HTTP
    • 存活探针 -TCP
  • 就绪探针
    • 使用就绪探针
    • 存活探针和就绪探针对比
    • 创建http服务
    • 查看endpoint的状态
    • 查看故障后状态

pod探针的基本概念

pod状态

  • pod的状态信息在podstatus中定义,其中一个phase字段,就是我们熟悉的一些状态。
    kubernetes系列七之探针_第1张图片

更准确的判断Pod状态

  • Kubernetes借助探针(Probes)机制,探针可以会周期性的监测容器运行的状态,返回结果。
  • Liveness探针:存活探针。Liveness探针用户捕获容器的状态是否处于存活状态。如果探测失败,kubelet会根据重启策略尝试恢复容器。
  • Readiness探针:就绪探针。如果readiness探针探测失败,则kubelet认为该容器没有准备好对外提供服务,则endpointcontroller会从与pod匹配的所有服务的端点中删除该Pod的地址。

容器探针

  • Kubelet可以周期性的执行Container的诊断。为了执行诊断,kubelet调用Container实现的Handler,有三种Handler类型:
  • ExecAction:在容器内执行指定命令,如果命令退出时返回码为0(表示命令成功执行了),则认为诊断成功。
  • TCPSocketAction:对指定端口上的容器的Ip地址进行TCP检查。如果端口打开,则认为诊断成功。
  • HTTPGetAction: 对指定端口和路径上的容器IP地址执行HTTP Get请求。如果响应的状态码≥200且<400,则诊断认为是成功的。

检测结果

right
error
unkown
kubelet
容器_Success
容器_Failure
容器_Unknown

使用存活探针

存活探针案例

  • 本案例采用execaction模式的存活探针。
  • livenessProbe字段详细定义了存活探针,包括:
    Handler采用exec
    使用方式是运行cat /tmp/healthy命令

探测延迟和探测周期是5秒钟。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30;
 rm -rf /tmp/healthy; sleep 600
    image: busybox
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

liveness探针流程

kubernetes系列七之探针_第2张图片

查看存活探针信息

  • 使用describe命令查看pod信息
Events:
  Type     Reason     Age                From                Message
  ----     ------     ----               ----                -------
  Normal   Scheduled  92s                default-scheduler   Successfully assigned default/liveness-exec to k8s-node2
  Normal   Killing    47s                kubelet, k8s-node2  Container liveness failed liveness probe, will be restarted
  Warning  Unhealthy  47s (x3 over 57s)  kubelet, k8s-node2  Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
  Normal   Pulled     17s (x2 over 92s)  kubelet, k8s-node2  Successfully pulled image "busybox"
  Normal   Created    17s (x2 over 92s)  kubelet, k8s-node2  Created container liveness
  Normal   Pulling    17s (x2 over 92s)  kubelet, k8s-node2  Pulling image "busybox"
  Normal   Started    16s (x2 over 91s)  kubelet, k8s-node2  Started container liveness

探针高级配置

  • 在上一步骤中使用describe命令可以看到探针的一些策略。
Liveness:       exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3

Delay=5s表示探针在容器启动后5秒开始进行第一次探测。
Timeout=1s表示容器必须在1秒内反馈信息给探针,否则视为失败。
Period=5s表示每5秒探针进行一次探测。
#success=1表示探测连续成功1次,表示成功。
#failure=3表示探测连续失败3次,视为Pod处于failure状态,重启容器

  • 高级配置参数可以在配置参数时指定,以下为配置样例。实现的功能与之前配置的探针一致。
livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
      timeoutSeconds: 1
      successThreshold: 1
      successThreshold: 3

存活探针 - HTTP

  • HTTP方式的存活探针,通过get方法定期向容器发送http请求。方法中定义了请求路径、端口、请求头等信息。
  • 由于探针仅在返回码≥200,小于400的情况下返回正常,10秒后探针检测失败,kubelet会重启容器。

存活探针 -TCP

  • TCP探针检测能否建立连接。实验中部署一个telnet服务,探针探测23端口。
  • TCP探针参数与HTTP探针相似。
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
  labels:
    app: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu
    args:
    - /bin/sh
    - -c
    - apt-get update && apt-get -y install openbsd-inetd telnetd && /etc/init.d/openbsd-inetd start; sleep 30000
    livenessProbe:
      tcpSocket:
        port: 23
      initialDelaySeconds: 60
      periodSeconds: 20

就绪探针

使用就绪探针

在这里插入图片描述

  • Pod处于存活状态并不意味着可以提供服务,创建完成后通常需要进行诸如准备数据、安装和运行程序等步骤,才能对外提供服务。
  • Liveness探针指示Pod是否处于存活状态,readiness探针则可指示容器是否已经一切准备就绪,可以对外提供服务。

存活探针和就绪探针对比

  • 就绪探针与存活探针一致,可以使用ExecAction,TCPSocketAction,HTTPGetAction三种方法。
    就绪探针用于检测和显示Pod是否已经准备好对外提供业务。在实际使用场景中,就绪探针需要和业务绑定。
类型 就绪探针 存活探针
当pod未通过检测 等待 杀死pod,重启pod
服务 如果检测失败,则从endpoint中移除pod endpoint自动更新pod信息
作用 pod是否准备好服务 pod是否存活

创建http服务

  • 创建http的deployment和service,并在其中加入就绪探针,探测是否存在index.html文件
kind: Service
metadata:
  name: httpd-svc
spec:
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80
        readinessProbe:
          exec:
            command:
            - cat
            - /usr/local/apache2/htdocs/index.html
          initialDelaySeconds: 5
          periodSeconds: 5

查看endpoint的状态

Endpoints:         10.244.1.15:80,10.244.2.22:80,10.244.2.23:80
  • Pod状态如下:
NAME                                READY   STATUS    RESTARTS   AGE
httpd-deployment-859778b7b6-7wcbt   1/1     Running   0          9m42s
httpd-deployment-859778b7b6-p62mw   1/1     Running   0          9m42s
httpd-deployment-859778b7b6-zvpsg   1/1     Running   0          9m42s
  • 现在进入第一个容器,删除其中的index.html文件
[root@k8s-master probe]# kubectl exec -it httpd-deployment-859778b7b6-7wcbt /bin/sh
\# rm /usr/local/apache2/htdocs/index.html

查看故障后状态

  • 查看服务状态,endpoints如下,其中一个Pod的端口信息已被移除endpoint。
Endpoints:         10.244.1.15:80,10.244.2.23:80
  • Pod状态如下,可以看到第一个Pod处于notReady状态。
NAME                                READY   STATUS    RESTARTS   AGE
httpd-deployment-859778b7b6-7wcbt   0/1     Running   0          15m
httpd-deployment-859778b7b6-p62mw   1/1     Running   0          15m
httpd-deployment-859778b7b6-zvpsg   1/1     Running   0          15m
  • 通过查看该Pod的记录,可以看到没有通过就绪探针。
Warning  Unhealthy  102s (x24 over 3m37s)  kubelet, k8s-node1  Readiness probe failed: cat: /usr/local/apache2/htdocs/index.html: No such file or directory

你可能感兴趣的:(docker+k8s,kubernetes,java,docker)