前序

上一篇文章介绍了 K8S 的 API 对象,这一篇将会在上一篇的基础了解上介绍一下 Pod 对象的健康检查功能。

上一篇文章地址:关于 K8S 的 API 对象,你了解多少? https://blog.51cto.com/ljtian/8255546


什么是 k8s 健康检查?

在 Kubernetes 中,对 Pod 的健康状态进行监测和评估非常重要。为了确保 Pod 正常运行,Kubernetes 提供了以下三种类型的健康检查:

  1. 存活探针 (Liveness Probe):存活探针用于确定 Pod 是否正在运行。如果存活探针失败,Kubernetes 将终止该容器,并根据容器的重启策略采取相应的操作。存活探针通常用于检测应用程序内部状态,例如检查应用程序是否处于死锁状态或无响应状态。
  2. 就绪探针 (Readiness Probe):就绪探针用于确定 Pod 是否已经准备好接收流量。如果就绪探针失败,该 Pod 将被从 Service 的 Endpoint 中移除,直到就绪探针再次成功为止。就绪探针通常用于确保应用程序已经初始化并且能够处理流量。
  3. 启动探针(Startup Probe): 启动探针用于确定应用是否启动完成,如果在 failureThreshold*periodSeconds 周期内未就绪,则会应用进程会被重启。

这些探针可以通过以下探活方式进行配置:

  • HTTP 方式:Kubernetes 可以定期发送 HTTP 请求到容器中的指定端点,并根据返回的状态码和响应内容来判断容器的健康状态。
  • TCP 方式:Kubernetes 可以通过尝试建立 TCP 连接来检查容器的健康状态。
  • Exec 方式:Kubernetes 可以在容器内部执行特定的命令,并根据命令的返回状态来判断容器的健康状态。

通过配置这些健康检查,Kubernetes 可以及时发现并处理不健康的 Pod,从而提高整个集群的可靠性和稳定性


从代码中查看

代码地址[https://github.com/kubernetes/kubernetes/blob/246d363ea4bab2ac99a938d0cee73d72fc44de45/staging/src/k8s.io/api/core/v1/types.go

Pod 定义

// Pod is a collection of containers that can run on a host. This resource is created
// by clients and scheduled onto hosts.
type Pod struct {
	metav1.TypeMeta `json:",inline"`
	// Standard object's metadata.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

	// Specification of the desired behavior of the pod.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
	// +optional
	Spec PodSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`

	// Most recently observed status of the pod.
	// This data may not be up to date.
	// Populated by the system.
	// Read-only.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
	// +optional
	Status PodStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

查看一个对象的特征主要查看其对象的 Spec 字段(上一篇文章有讲到。TypeMeta 和 Metadata 是通用属性,Spec 和 Status 是每个对象独有的

PodSpec

// PodSpec is a description of a pod.
type PodSpec struct {
	...
	// List of containers belonging to the pod.
	// Containers cannot currently be added or removed.
	// There must be at least one container in a Pod.
	// Cannot be updated.
	// +patchMergeKey=name
	// +patchStrategy=merge
	Containers []Container `json:"containers" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,2,rep,name=containers"`
	...
}

Container

// A single application container that you want to run within a pod.
type Container struct {
	...
	// Periodic probe of container liveness.
	// Container will be restarted if the probe fails.
	// Cannot be updated.
	// More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
	// +optional
	LivenessProbe *Probe `json:"livenessProbe,omitempty" protobuf:"bytes,10,opt,name=livenessProbe"`
	// Periodic probe of container service readiness.
	// Container will be removed from service endpoints if the probe fails.
	// Cannot be updated.
	// More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
	// +optional
	ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
	// StartupProbe indicates that the Pod has successfully initialized.
	// If specified, no other probes are executed until this completes successfully.
	// If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.
	// This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,
	// when it might take a long time to load data or warm a cache, than during steady-state operation.
	// This cannot be updated.
	// More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
	// +optional
	StartupProbe *Probe `json:"startupProbe,omitempty" protobuf:"bytes,22,opt,name=startupProbe"`
	// Actions that the management system should take in response to container lifecycle events.
	// Cannot be updated.
	// +optional
	...
}

在 web 控制页面上添加健康检查

通过镜像创建应用

关于 K8S pod 对象的健康检查使用描述_容器

关于 K8S pod 对象的健康检查使用描述_容器_02

关于 K8S pod 对象的健康检查使用描述_k8s_03

关于 K8S pod 对象的健康检查使用描述_k8s_04

查看生成 pod 的 yaml 文件

kind: Pod
apiVersion: v1
metadata:
	...
  name: http-server-gen-6bf89b6b57-bql57
  namespace: ljtian-test
 	...
spec:
  ...
  containers:
    - resources: {}
      name: http-server-gen
      livenessProbe:
        httpGet:
          path: /ping
          port: 8080
          scheme: HTTP
        timeoutSeconds: 1
        periodSeconds: 10
        successThreshold: 1
        failureThreshold: 5
  ...
status:
  phase: Running
  ...

删除其它干扰项,可以看到当前 pod 已经运行了起来且添加了 livenessProbe 存活探针的相关配置。

看一下拓扑图

关于 K8S pod 对象的健康检查使用描述_探针_05

查看 pod 内部日志

关于 K8S pod 对象的健康检查使用描述_k8s_06

后台服务器,一直收到关于 /ping 路由的请求,只要服务器状态正常的情况下这个请求会根据配置定时访问。

结束

时间比较短没有大篇幅的进行详细编写请见谅,需要生产使用时可以根据这个方向去检索相关内容。文中已给出了代码位置,可以根据需要自行查询详细且准确的内容。如果只是简单的使用可以查看 k8s 官方文档,文档地址为[https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/]


资源来源