「Kubernetes-Objects」- Pod,探针

Liveness Probe

如何确保当 Pod 中运行的应用程序进入失败状态时, Kubernetes 会自动重启 Pod?

可以使用存活探针。如果探针失败,那么 kubelet 会自动重启 pod。探针是 Pod.spec 的一部分,可以添加到 containers 字段中。pod 中的每个容器都可以拥有一个存活探针。

探针可以有三种类型:
1)它可以是容器内部运行的命令;
2)也可以是一个 HTTP 请求,指向容器内由网络服务提供的特定路径;
3)或者是更通用的 TCP 探针。

HTTP Probe

下面的例子展示了一个基本的 HTTP 探针:

apiversion: v1
kind: Pod
metadata
  name: liveness-nginx
spec:
  - containers
    name: veness
    image: nginx
    livenessProbe:
      httpGet:
        path: /
        port: 80

Kubernetes 容器探针的相关文档 https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes

Readiness Probe

虽然 LivenessProbe 能够指示 Pod 启动和运行的状态,但是如何确保在应用程序准备好服务请求之后再接受访问?

可以向 pod 规格添加就绪探针。与存活探针类似,就绪探针也有三种类型(具体信息请参阅相关文档)。

下面是一个简单的例子,其中就绪探针在 nginx Dockerl 映像的单个 pod 上运行。就绪探针向端口 80 发送了一个 HTTP 的请求:

apiversion: v1
kind: Pod
metadata:
  name: readiness-nginx
spec:
  containers:
	- name: readiness
	  image: nginx
	  readinessProbe:
		httpGet:
		  path: /
		  port: 80

虽然上面介绍的就绪探针与 1.2 节中所介绍的存活探针相同,但一般情况下两者是不一样的,因为它们旨在提供应用程序不同方面的信息。存活探针负责查看应用程序进程是否处于活动状态,但是应用程序可能并没有准备好接收请求。而就绪探针负责检査应用程序是否可以正确服务请求。因此、只有当通过就绪探针的检査,podオ能成为服务(请参阅 5.1 节)的一部分。

请参阅 Kubernetes 容器探针的相关文档(https://kubernetes.io/docs/conceptsworkloads/pods/pod-lifecycle/#container-probes)

Adding Liveness and Readiness Probes to Your Deployments

如何自动检查应用是否健康,且在不健康的时候让 Kubernetes 做相应的处理?

为了通知 Kubernetes 应用的状况,可以添加存活探针和就绪探针,如下所示。首先定义一个部署清单文件:

# foo.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata
  name: webserver
spec:
  replicas: 1
  template:
    metadata:
      name: webserver
    spec:
      containers:
        - name: nginx
          image: nginx:stable
          containerPort: 80
          # 在 pod 规格中的 containers 一节中定义存活探针和就绪探针。请参阅上述介的例子(请参阅 112 节和 11.3 节),并向部署 pod 模板的容器规格中添加如下内容:
          livenessProbe:
            initialDelaySecond: 2
            periodSeconds: 10
            httpGet
          readinessProbe:
            initialDelaySecond: 2
            periodSeconds: 10
            httpGet:
            path: 2
            port: 80

现在启动部署并检査探针:

# kubectl create -f foo.yaml

# kubectl get pods

# kubectl describe pod/webserver-4288715076-dk9c7

为了确认 pod 内的容器是否健康、是否可以接受访问,Kubernetes 提供了系列的健康检査机制。在 Kubernetes 里,健康检査称为探针,定义在「容器」一级,而非 pod 一级,它由两个不同的组成部分:

每个工作节点上的 kubelet 使用规格中的 livenessProbe 指令决定什么时候重启容器。这些存活探针可以帮助应付突发问题或死锁。

一套 pod 的服务负载平衡使用 readinessProbe 指令决定是否 Pod 准备好并可以接受访问了。如果没有准备好,就从服务器的访问点池中将该 pod 排除在外。请注意只有当所有容器都谁备就绪,pod 才会被当成准备就绪。

至于何时该选用哪种探针,应当根据容器的行为进行选择:

如果在探测失败的时候,容器可以并且应该被杀掉重启,那么请使用存活探针,并将 restartPolicy 设置为 Always 或 OnFailure。

如果想在 pod 准备就绪之后再接受访问,那么可以使用就绪探针。

请注意后者的情况下,就绪探针也起到了存活探针的作用。

配置存活探针与就绪探针(https://kubernetes.io/docs/asks/configure-podcontainer/configure-liveness-readiness-probes)
Pod 生命周期的相关文档(https://kubernetes.io/docs/concepts/workloadspods/pod-lifecycle)
初始化容器的相关文档(在 v1.6 及之后的版本中相对稳定)(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)