云原生学习路线导航页(持续更新中)
本文是 kubernetes 的控制面组件 kubelet 系列文章第一篇,主要讲解了 kubelet是什么、核心功能、工作流程、架构设计。并且对kubelet架构的API接口层的主通信接口10250、cadvisor监控采集端口4194、只读API端口10255、健康检查端口10248分别进行了详细介绍
- 希望大家多多 点赞 关注 评论 收藏,作者会更有动力继续编写技术文章
功能模块 | 核心能力 | 相关组件 |
---|---|---|
Pod 生命周期管理 | 根据 PodSpec 创建/销毁容器,处理重启策略(Always/OnFailure/Never) | PodManager、ContainerRuntime |
容器健康监控 | 执行 Liveness/Readiness/Startup 探针,自动触发容器重启(失败时) | ProbeManager、StatusManager |
资源管理 | 监控 CPU/内存/磁盘使用,执行驱逐策略(当节点资源不足时) | EvictionManager、CAdvisor |
存储卷管理 | 挂载 PersistentVolume,处理 Secret/ConfigMap 注入 | VolumeManager |
网络配置 | 通过 CNI 插件为 Pod 分配 IP,维护网络命名空间 | NetworkPlugin |
节点状态报告 | 每 10 秒向 API Server 上报节点资源使用率及健康状态 | API Server |
镜像管理 | 自动拉取镜像,执行垃圾回收(超过磁盘阈值时按 LRU 策略清理) | ImageGC |
参考:https://kubernetes.feisky.xyz/concepts/components/kubelet#pod-guan-li
kubectl exec
)、端口转发等。--anonymous-auth=true
(不推荐)。https://:10250
可访问以下核心接口/metrics
:Prometheus 格式的 Kubelet 自身指标(如 goroutine 数量、请求延迟)。/metrics/cadvisor
:容器资源使用指标(CPU、内存、网络等),由 cAdvisor 提供。/metrics/resource
:Kubernetes 资源模型指标(如 kubelet_container_cpu_usage_seconds_total
)。/pods
:获取节点上所有 Pod 的详细信息(JSON 格式)。/containerLogs///
:查看容器日志(对应 kubectl logs
)。/exec///
:在容器内执行命令(对应 kubectl exec
)。/portForward//
:端口转发到容器(对应 kubectl port-forward
)。/healthz
:检查 Kubelet 是否健康(返回 200 OK
或错误码)。/configz
:获取 Kubelet 的当前配置(需启用 --enable-debugging-handlers=true
)。--rotate-certificates
支持证书轮换)。/var/lib/kubelet/pki
目录。apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kubelet-reader
rules:
- apiGroups: [""]
resources: ["nodes/metrics", "nodes/proxy", "nodes/log", "nodes/spec"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubelet-reader-binding
subjects:
- kind: ServiceAccount
name: prometheus
namespace: monitoring
roleRef:
kind: ClusterRole
name: kubelet-reader
apiGroup: rbac.authorization.k8s.io
kubectl proxy
(绕过 TLS 验证)kubectl proxy --port=8080 &
curl http://localhost:8080/api/v1/nodes/<node-name>/proxy/metrics/cadvisor
# 使用 ServiceAccount Token
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -k -H "Authorization: Bearer $TOKEN" https://<Node-IP>:10250/metrics/cadvisor
# 使用客户端证书(如 kubeconfig 中的证书)
curl --cert /path/to/client.crt --key /path/to/client.key --cacert /path/to/ca.crt https://<Node-IP>:10250/metrics
--anonymous-auth=false
。--rotate-certificates=true
提升密钥安全性。pkg/kubelet/server/server.go
(核心服务端实现)pkg/kubelet/server/auth.go
(认证鉴权逻辑)http://:4194/metrics
获取容器的 Prometheus 格式指标/metrics/cadvisor
端点暴露,访问地址为 https://:10250/metrics/cadvisor
。# 使用 kubectl 代理绕过 TLS 认证(仅测试环境)
kubectl proxy --port=8080 &
curl http://localhost:8080/api/v1/nodes/<node-name>/proxy/metrics/cadvisor
# 直接访问(需配置证书或 Token)
curl -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://<Node-IP>:10250/metrics/cadvisor
/metrics/cadvisor
获取的 Prometheus 格式数据片段:container_cpu_usage_seconds_total{container="nginx", namespace="default", pod="nginx-abc123"} 12345.67
container_memory_usage_bytes{container="nginx", namespace="default", pod="nginx-abc123"} 56789012
pkg/kubelet/cadvisor/cadvisor_linux.go
(平台相关实现)vendor/github.com/google/cadvisor/manager/manager.go
(核心逻辑)http://:10255
可访问以下关键端点:
/healthz
:检查 Kubelet 的健康状态,返回 200 OK
表示正常。/pods
:返回节点上所有 Pod 的清单(JSON 格式)。/metrics
:暴露 Prometheus 格式的监控指标(包括 cAdvisor 数据)。/metrics/cadvisor
:直接获取容器的详细资源使用指标(与 10250 端口的路径一致)。/spec
:返回节点的硬件和操作系统信息(如 CPU 核心数、内存大小等)。--read-only-port
被标记为废弃,未来可能移除。# kubelet -h | grep read-only-port
--read-only-port int32 The read-only port for the Kubelet to serve on with no authentication/authorization (set to 0 to disable) (default 10255) (DEPRECATED: This parameter should be set via the config file specified by the Kubelet's --config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information.)
# 编辑 Kubelet 配置文件(如 /etc/kubernetes/kubelet.conf)
KUBELET_ARGS="--read-only-port=10255"
# 或者通过 systemd 服务文件添加参数
ExecStart=/usr/bin/kubelet --read-only-port=10255 ...
curl http://<Node-IP>:10255/pods
curl http://<Node-IP>:10255/metrics
curl -v http://<Node-IP>:10255/healthz
# 使用 ServiceAccount Token 访问(需 RBAC 授权)
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -k -H "Authorization: Bearer $TOKEN" https://<Node-IP>:10250/metrics
特性 | 端口 10255 (只读) | 端口 10250 (读写) |
---|---|---|
协议 | HTTP(明文) | HTTPS(加密) |
认证 | 无 | 需证书或 Token |
功能 | 只读数据(如监控、Pod 列表) | 读写操作(如执行命令、日志访问) |
安全性 | 低 | 高 |
默认状态 | 新版本默认关闭 | 始终启用 |
--healthz-port
指定端口# 查看本地端口监听情况
# ss -tuln | grep 10248
tcp LISTEN 0 4096 127.0.0.1:10248 *:*
# curl http://localhost:10248/healthz
ok
127.0.0.1
,不暴露给外部网络。特性 | 端口 10248 (--healthz-port ) |
端口 10250(主 API 端口) |
---|---|---|
协议 | HTTP(明文) | HTTPS(加密) |
访问范围 | 仅本机(localhost ) |
外部网络(默认监听所有接口) |
功能 | 仅健康检查(/healthz ) |
全功能 API(Pod 管理、监控等) |
认证 | 无 | 强制证书/Token 认证 |
--healthz-port
参数状态与版本变化--healthz-port
参数已被标记为 废弃(DEPRECATED),Kubernetes 推荐通过 kubelet 配置文件(由 --config
指定)设置相关参数。