「Kubernetes Objects」- Pod,探针

  CREATED BY JENKINSBOT

Liveness Probe

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

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

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

下面的例子展示了一个基本的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%EF%BC%89

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%EF%BC%89

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%EF%BC%89
Pod生命周期的相关文档(https://kubernetes.io/docs/concepts/workloadspods/pod-lifecycle%EF%BC%89
初始化容器的相关文档(在v1.6及之后的版本中相对稳定)(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/%EF%BC%89