在 Kubernetes
中,kubelet
组件负责管理和运行每个节点上的容器。kubelet
组件包含一个名为 prober
的子组件,它是用于容器的健康检查的一部分。
prober
是 kubelet
组件的一部分,它负责执行容器的健康检查。健康检查是一种用于确定容器是否正常运行的机制。prober
会定期向容器发送健康检查请求,并根据容器的响应来确定其状态。
prober
支持多种健康检查方式,包括:
- HTTP 健康检查:向容器的指定端口发送
HTTP
请求,并根据响应的状态码判断容器的健康状态。 - TCP 健康检查:向容器的指定端口发送
TCP
连接请求,并根据连接是否成功判断容器的健康状态。 - Exec 健康检查:在容器内部执行指定的命令,并根据命令的执行结果判断容器的健康状态。
- gRPC 健康检查:与容器内的
gRPC
服务建立连接,并发送指定的gRPC
请求。根据服务端返回的响应,prober
可以确定服务是否正常运行
通过定期执行这些健康检查,prober
可以监测容器的运行状态,并及时采取相应的措施,如重启容器或报告容器的健康状态给Kubernetes
控制平面。
prober
1 | // pkg/kubelet/prober/prober.go |
1 | // pkg/kubelet/prober/prober_manager.go |
execProbe
1 | // pkg/probe/exec/exec.go |
tcpProbe
1 | // pkg/probe/tcp/tcp.go |
httpProbe
1 | // pkg/probe/http/http.go |
grpcProbe
1 | // pkg/probe/grpc/grpc.go |
启动入口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// pkg/kubelet/kubelet.go
// 初始化,NewMainKubelet省略了部分参数
func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,...) {
...
if kubeDeps.ProbeManager != nil {
klet.probeManager = kubeDeps.ProbeManager
} else {
klet.probeManager = prober.NewManager(
klet.statusManager,
klet.livenessManager,
klet.readinessManager,
klet.startupManager,
klet.runner,
kubeDeps.Recorder)
}
...
}
func (kl *Kubelet) SyncPod(ctx context.Context, updateType kubetypes.SyncPodType, pod, mirrorPod *v1.Pod, podStatus *kubecontainer.PodStatus) (isTerminal bool, err error) {
...
// 写入缓存,并启动probe workers
kl.probeManager.AddPod(pod)
...
}
1 | // pkg/kubelet/kubelet.go |
REF:
1.pkg/kubelet/prober/prober.go
2.pkg/kubelet/prober/prober_manager.go
3.pkg/kubelet/prober/worker.go
4.pkg/probe/exec/exec.go
5.pkg/probe/tcp/tcp.go
6.pkg/probe/http/http.go
7.pkg/probe/grpc/grpc.go
8.pkg/kubelet/kubelet.go