前序
上一篇文章介绍了 K8S 的 API 对象,这一篇将会在上一篇的基础了解上介绍一下 Pod 对象的健康检查功能。
上一篇文章地址:关于 K8S 的 API 对象,你了解多少? https://blog.51cto.com/ljtian/8255546
什么是 k8s 健康检查?
在 Kubernetes 中,对 Pod 的健康状态进行监测和评估非常重要。为了确保 Pod 正常运行,Kubernetes 提供了以下三种类型的健康检查:
- 存活探针 (Liveness Probe):存活探针用于确定 Pod 是否正在运行。如果存活探针失败,Kubernetes 将终止该容器,并根据容器的重启策略采取相应的操作。存活探针通常用于检测应用程序内部状态,例如检查应用程序是否处于死锁状态或无响应状态。
- 就绪探针 (Readiness Probe):就绪探针用于确定 Pod 是否已经准备好接收流量。如果就绪探针失败,该 Pod 将被从 Service 的 Endpoint 中移除,直到就绪探针再次成功为止。就绪探针通常用于确保应用程序已经初始化并且能够处理流量。
- 启动探针(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 控制页面上添加健康检查
通过镜像创建应用
查看生成 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 存活探针的相关配置。
看一下拓扑图
查看 pod 内部日志
后台服务器,一直收到关于 /ping 路由的请求,只要服务器状态正常的情况下这个请求会根据配置定时访问。
结束
时间比较短没有大篇幅的进行详细编写请见谅,需要生产使用时可以根据这个方向去检索相关内容。文中已给出了代码位置,可以根据需要自行查询详细且准确的内容。如果只是简单的使用可以查看 k8s 官方文档,文档地址为[https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/]