7.5 实现基于探针对pod中的访问的健康状态检查

1.pod的声明周期

取值 描述
Pending Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间,
Running Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
Succeeded Pod 中的所有容器都已成功终止,并且不会再重启。
Failed Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
Unknown 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

2.容器的状态

Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的阶段一样。
旦调度器将 Pod 分派给某个节点,kubelet 就通过 容器运行时 开始为 Pod 创建容器。 容器的状态有三种:Waiting(等待)、Running(运行中)和 Terminated(已终止)
每种状态都有特定的含义:

  • Waiting (等待)
    如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作:例如,从某个容器镜像 仓库拉取容器镜像,或者向容器应用 Secret 数据等等。 当你使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,你也会看到一个 Reason 字段,其中给出了容器处于等待状态的原因。
  • Running(运行中)
    Running 状态表明容器正在执行状态并且没有问题发生。 如果配置了 postStart 回调,那么该回调已经执行且已完成。 如果你使用 kubectl 来查询包含 Running 状态的容器的 Pod 时,你也会看到 关于容器进入 Running 状态的信息。
  • Terminated(已终止)
    处于 Terminated 状态的容器已经开始执行并且或者正常结束或者因为某些原因失败。 如果你使用 kubectl 来查询包含 Terminated 状态的容器的 Pod 时,你会看到 容器进入此状态的原因、退出代码以及容器执行期间的起止时间。
    如果容器配置了 preStop 回调,则该回调会在容器进入 Terminated 状态之前执行。

3.容器探针

  • ExecAction: 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
  • TCPSocketAction: 对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction: 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

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

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

针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:

  • livenessProbe:指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success。

  • readinessProbe:指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。

  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其 重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success。

3.1 配置探针

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

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

3.2 探针配置实例

HTTPGetAction

# yaml
root@k8-deploy:~/k8s-yaml/probe# cat HTTPGetAction.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels: #rs or deployment
      app: ng-deploy-80
    #matchExpressions:
    #  - {key: app, operator: In, values: [ng-deploy-80,ng-rs-81]}
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx:1.21.1
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /index.html
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 3
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /index.html
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 3
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3

---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80 
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30082
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80

# 创建
root@k8-deploy:~/k8s-yaml/probe# kubectl apply -f HTTPGetAction.yaml 
deployment.apps/nginx-deployment created

root@k8-deploy:~/k8s-yaml/probe# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7c4dbc5c76-w4j8c   1/1     Running   0          7s

# 验证
root@k8-deploy:~/k8s-yaml/probe# kubectl get ep
NAME           ENDPOINTS                                               AGE
kubernetes     192.168.2.11:6443,192.168.2.12:6443,192.168.2.13:6443   33d
ng-deploy-80   10.100.172.231:80                                       17s

root@k8-deploy:~/k8s-yaml/probe# kubectl get svc
NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.0.0.1      <none>        443/TCP        33d
ng-deploy-80   NodePort    10.0.104.36   <none>        80:30082/TCP   21s

root@k8-deploy:~/k8s-yaml/probe# curl -I 192.168.2.17:30082
HTTP/1.1 200 OK
Server: nginx/1.21.1
Date: Thu, 21 Oct 2021 10:08:57 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 06 Jul 2021 14:59:17 GMT
Connection: keep-alive
ETag: "60e46fc5-264"
Accept-Ranges: bytes

TCPSocketAction

# 创建yaml
root@k8-deploy:~/k8s-yaml/probe# cat TCPSocketAction.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels: #rs or deployment
      app: ng-deploy-80
    #matchExpressions:
    #  - {key: app, operator: In, values: [ng-deploy-80,ng-rs-81]}
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx:1.21.1
        ports:
        - containerPort: 80
        livenessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 3
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3

        readinessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 3
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
      
---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80 
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30083
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80

# 创建
root@k8-deploy:~/k8s-yaml/probe# kubectl apply -f TCPSocketAction.yaml 
deployment.apps/nginx-deployment created

# 验证
root@k8-deploy:~/k8s-yaml/probe# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7584b6d9f4-c6zxf   1/1     Running   0          8s

root@k8-deploy:~/k8s-yaml/probe# kubectl get svc
NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.0.0.1      <none>        443/TCP        33d
ng-deploy-80   NodePort    10.0.167.50   <none>        80:30083/TCP   16s

root@k8-deploy:~/k8s-yaml/probe# kubectl get ep
NAME           ENDPOINTS                                               AGE
kubernetes     192.168.2.11:6443,192.168.2.12:6443,192.168.2.13:6443   33d
ng-deploy-80   10.100.172.232:80                                       93s

ExecAction

# 编写yaml
root@k8-deploy:~/k8s-yaml/probe# cat ExecAction.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
spec:
  replicas: 1
  selector:
    matchLabels: #rs or deployment
      app: redis-deploy-6379
    #matchExpressions:
    #  - {key: app, operator: In, values: [redis-deploy-6379,ng-rs-81]}
  template:
    metadata:
      labels:
        app: redis-deploy-6379
    spec:
      containers:
      - name: redis-deploy-6379
        image: redis
        ports:
        - containerPort: 6379
        readinessProbe:
          exec:
            command:
            - /usr/local/bin/redis-cli
            - quit
          initialDelaySeconds: 5
          periodSeconds: 3
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3

        livenessProbe:
          exec:
            command:
            - /usr/local/bin/redis-cli
            - quit
          initialDelaySeconds: 5
          periodSeconds: 3
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
        readinessProbe:
          exec:
            command:
            - /usr/local/bin/redis-cli
            - quit
          initialDelaySeconds: 5
          periodSeconds: 3
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
---
apiVersion: v1
kind: Service
metadata:
  name: redis-deploy-6379 
spec:
  ports:
  - name: http
    port: 6379
    targetPort: 6379
    nodePort: 40016
    protocol: TCP
  type: NodePort
  selector:
    app: redis-deploy-6379

# 创建
root@k8-deploy:~/k8s-yaml/probe# kubectl apply -f ExecAction.yaml 
deployment.apps/redis-deployment created

# 验证
root@k8-deploy:~/k8s-yaml/probe# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
redis-deployment-775c65c67c-dwp7r   1/1     Running   0          2m12s

root@k8-deploy:~/k8s-yaml/probe# kubectl describe pod redis-deployment-775c65c67c-dwp7r
...
    Liveness:       exec [/usr/local/bin/redis-cli quit] delay=5s timeout=5s period=3s #success=1 #failure=3
    Readiness:      exec [/usr/local/bin/redis-cli quit] delay=5s timeout=5s period=3s #success=1 #failure=3
...
上一篇:Dashboard UI


下一篇:pytest+yaml+allure接口自动化测试框架05.处理response