K8S 容器探针,高可用服务

298 阅读3分钟

K8s容器探针

容器探针主要用于检测容器是否处于运行状态和判断服务是否已经正常工作,主要分为livenessProbereadinessProbe

探针机制

应用在运行期间,可能因为某也意外情况致使程序挂掉。那么如何监控这些容器状态稳定性,保证服务在运行期间不会发生问题,发生问题后进行重启等机制,就成为了重中之重的事情,考虑到这点 kubernetes推出了活性探针机制

两种探针简介

  • livenessProbe 存活探针

存活探针主要作用是,用指定的方式进入容器检测容器中的应用是否正常运行,如果检测失败,则认为容器不健康,那么 Kubelet 将根据 Pod 中设置的restartPolicy(重启策略)来判断,Pod是否要进行重启操作,如果容器配置中没有配置 livenessProbe 存活探针,Kubelet 将认为存活探针探测一直为成功状态。当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。

  • readinessProbe 就绪探针

用于判断容器中应用是否启动完成,当探测成功后才使 Pod 对外提供网络访问,设置容器 Ready 状态为 true,如果探测失败,则设置容器的 Ready 状态为 false。对于被 Service 管理的 Pod,Service 与 Pod、EndPoint 的关联关系也将基于 Pod 是否为 Ready 状态进行设置,如果 Pod 运行过程中 Ready 状态变为 false,则系统自动从 Service 关联的 EndPoint 列表中移除,如果 Pod 恢复为 Ready 状态。将再会被加回 Endpoint 列表。通过这种机制就能防止将流量转发到不可用的 Pod 上。当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除

探针探测方式与结果

  • exec

通过执行shell命令的方式,判断退出状态码是否是0,为0则是成功,下面是案例,判断文件是否存在

livenessProbe:
  exec:
    command:
      - cat
      - /tmp/healthy
  • tcp

通过TCP请求的方式,是否能建立tcp连接,案例如下

livenessProbe:
  tcpSocket:
    port: 80
  • httpGet

通过发起http的get请求,判断状态码是否在200和400之间,如果在则容器是健康的

livenessProbe:
  httpGet:
    path: /
    port: 8080

探针的相关属性

  • initialDelaySeconds: Pod 启动后首次进行检查的等待时间,单位“秒”
  • periodSeconds: 检查的间隔时间,默认为 10s,单位“秒”
  • timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为 1s,单位“秒”。
  • successThreshold:探针检测失败后认为成功的最小连接成功次数,默认为 1s,在 Liveness 探针中必须为 1s,最小值为 1s
  • failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3s,最小值为 1s。

完整案例

apiVersion: v1
kind: Namespace
metadata:
  name: k8s-springboot
---
apiVersion: v1
kind: Service
metadata:
  name: k8s-springboot-demo-service
  namespace: k8s-springboot
spec:
  type: ClusterIP
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  selector:
    app: k8s-springboot-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-springboot-demo
  namespace: k8s-springboot
spec:
  selector:
    matchLabels:
      app: k8s-springboot-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: k8s-springboot-demo
    spec:
      containers:
        - name: k8s-springboot-demo
          image: huzhihui/springboot:1.0.0
          ports:
            - containerPort: 8080
          livenessProbe:
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
            timeoutSeconds: 1
          readinessProbe:
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
            timeoutSeconds: 1

测试可能出现的结果

image.png