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

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

前序

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

什么是 k8s 健康检查?

在 Kubernetes 中,对 Pod 的健康状态进行监测和评估非常重要。为了确保 Pod 正常运行,Kubernetes 提供了以下三种类型的健康检查:
  1. 存活探针 (Liveness Probe):存活探针用于确定 Pod 是否正在运行。如果存活探针失败,Kubernetes 将终止该容器,并根据容器的重启策略采取相应的操作。存活探针通常用于检测应用程序内部状态,例如检查应用程序是否处于死锁状态或无响应状态。
  1. 就绪探针 (Readiness Probe):就绪探针用于确定 Pod 是否已经准备好接收流量。如果就绪探针失败,该 Pod 将被从 Service 的 Endpoint 中移除,直到就绪探针再次成功为止。就绪探针通常用于确保应用程序已经初始化并且能够处理流量。
  1. 启动探针(Startup Probe): 启动探针用于确定应用是否启动完成,如果在 failureThreshold*periodSeconds 周期内未就绪,则会应用进程会被重启。
这些探针可以通过以下探活方式进行配置:
  • HTTP 方式:Kubernetes 可以定期发送 HTTP 请求到容器中的指定端点,并根据返回的状态码和响应内容来判断容器的健康状态。
  • TCP 方式:Kubernetes 可以通过尝试建立 TCP 连接来检查容器的健康状态。
  • Exec 方式:Kubernetes 可以在容器内部执行特定的命令,并根据命令的返回状态来判断容器的健康状态。
通过配置这些健康检查,Kubernetes 可以及时发现并处理不健康的 Pod,从而提高整个集群的可靠性和稳定性

从代码中查看

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 控制页面上添加健康检查

通过镜像创建应用

notion image
notion image
notion image
notion image

查看生成 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 存活探针的相关配置。

看一下拓扑图

notion image

查看 pod 内部日志

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

结束

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

资源来源