云原生学习门路导航页(连续更新中)
- kubernetes学习系列快捷链接
- Kubernetes架构原则和对象设计(一)
- Kubernetes架构原则和对象设计(二)
- Kubernetes架构原则和对象设计(三)
- Kubernetes控制平面组件:etcd(一)
- Kubernetes控制平面组件:etcd(二)
- Kubernetes控制平面组件:API Server详解(一)
- Kubernetes控制平面组件:API Server详解(二)
- Kubernetes控制平面组件:调度器Scheduler(一)
- Kubernetes控制平面组件:调度器Scheduler(二)
- Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
- Kubernetes控制平面组件:Controller Manager 之 NamespaceController 全方位讲解
本文是 kubernetes 的控制面组件 kubelet 系列文章第一篇,主要讲解了 kubelet是什么、核心功能、工作流程、架构设计。并且对kubelet架构的API接口层的主通信接口10250、cadvisor监控收罗端口4194、只读API端口10255、健康检查端口10248分别举行了详细介绍
- 希望各人多多 点赞 关注 评论 收藏,作者会更有动力继承编写技术文章
1.kubelet 简介
1.1.kubelet 是什么
- 前面kubernetes架构讲解时,对 kubelet 的初步熟悉:
- 每个节点上都会跑一个Kubelet,负责上报 节点状态,pod状态、pod资源利用情况等信息到ApiServer,由ApiServer写入etcd。
- 同时,Kubelet也会和apiserver交互,当发现 有pod被 Schedule 调度到本身所在node时,就会调用一系列标准接口,拉起pod的进程,并为之挂载网络和存储。
- kubelet通过对 容器运行时(CRI)、容器网络标准(CNI)、容器存储标准(CSI) 的调用,完成pod 容器、网络、存储 的管理
- Kubelet 是 Kubernetes 集群 工作节点 的核心署理组件
- 我们前面学习的 etcd、apiserver、scheduler、controller-manager等,都属于上级管理部门,负责 存储数据、举行决议、下发下令,不会直接参与干活
- Kubelet 是真正的worker,是Node的核心署理组件,它直接与节点上的容器运行时(如 Docker、containerd)交互,确保 Pod 及其容器按照集群控制平面下发的指令精确运行,是 Kubernetes 实现“节点自治”本领的关键模块
1.2.kubelet 的核心功能
功能模块核心本领相关组件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 1.3.kubelet核心工作流程
1.4.kubelet 的 pod事件泉源
参考:https://kubernetes.feisky.xyz/concepts/components/kubelet#pod-guan-li
- Kubelet 以 PodSpec 的方式工作。PodSpec 是描述一个 Pod 的 YAML 或 JSON 对象。 kubelet 采取一组通过各种机制提供的 PodSpecs(主要通过 apiserver),并确保这些 PodSpecs 中描述的 Pod 正常健康运行。
- 向 Kubelet 提供节点上须要运行的 Pod 清单的方法:
- 文件:启动参数 --config 指定的配置目次下的文件 (默认 / etc/kubernetes/manifests/)。该文件每 20 秒重新检查一次(可配置)。
- HTTP endpoint (URL):启动参数 --manifest-url 设置。每 20 秒检查一次这个端点(可配置)。
- API Server:通过 API Server 监听 etcd 目次,同步 Pod 清单。
- HTTP server:kubelet 侦听 HTTP 请求,并相应简单的 API 以提交新的 Pod 清单。
2.Kubelet 架构设计
- API 接口层
- kubelet API
- cAdvisor API
- 只读API
- 健康检查 API
- 核心功能层,可分为3个模块:
- 核心管理模块:PLEG、cAdvisor、GPUManager、OOMWatcher、ProbeManager、DiskSpaceManager、EvictionManager
- 运行时和谐模块:syncLoop、PodWorker
- 容器生命周期管理模块:StatusManager、VolumeManager、ImageGC、ContainerGC、ImageManager、CertificateManager
- CRI 接口层
- 容器执行引擎接口,作为grpc client 与真正的容器运行时(Dockershim/rkt/containerd)交互
3.kubelet API 接口层
3.1.kubelet API 主通信端口:10250
3.1.1.端口 10250 的核心作用
- Kubelet 的 10250 端口 是其默认的 HTTPS 主通信端口,负担以下核心功能:
- Pod 生命周期管理:吸收来自 API Server 的指令,创建、更新或删除 Pod。
- 资源监控数据暴露:提供容器和节点的性能指标(通过集成 cAdvisor)。
- 调试与运维接口:支持访问容器日志、执行下令(如 kubectl exec)、端口转发等。
- 节点状态上报:向 API Server 报告节点健康状态和资源容量。
3.1.2.协议与认证机制
- 协议:利用 HTTPS(TLS 加密),确保通信安全性。
- 认证方式:
- X.509 客户端证书:Kubelet 主动生成证书,由集群 CA 签发。
- Bearer Token:基于 ServiceAccount 的 JWT Token(需 RBAC 授权)。
- 匿名访问(默认关闭):需显式启用 --anonymous-auth=true(不推荐)。
3.1.3.关键 API 端点
- 通过 https://<Node-IP>:10250 可访问以下核心接口
3.1.3.1.监控与指标
- /metrics:Prometheus 格式的 Kubelet 自身指标(如 goroutine 数量、请求延迟)。
- /metrics/cadvisor:容器资源利用指标(CPU、内存、网络等),由 cAdvisor 提供。
- /metrics/resource:Kubernetes 资源模型指标(如 kubelet_container_cpu_usage_seconds_total)。
3.1.3.2.Pod 与容器操作**
- /pods:获取节点上所有 Pod 的详细信息(JSON 格式)。
- /containerLogs/<namespace>/<pod>/<container>:查看容器日志(对应 kubectl logs)。
- /exec/<namespace>/<pod>/<container>:在容器内执行下令(对应 kubectl exec)。
- /portForward/<namespace>/<pod>:端口转发到容器(对应 kubectl port-forward)。
3.1.3.3.调试与健康检查**
- /healthz:检查 Kubelet 是否健康(返回 200 OK 或错误码)。
- /configz:获取 Kubelet 的当前配置(需启用 --enable-debugging-handlers=true)。
3.1.4.安全配置
3.1.4.1.证书与 TLS
- Kubelet 证书:
- 由集群 CA 主动签发(若启用 --rotate-certificates 支持证书轮换)。
- 存储在节点上的 /var/lib/kubelet/pki 目次。
- 客户端访问:
- 利用集群 CA 证书验证 Kubelet 服务端身份。
- 客户端需提供有效证书或 Token 举行身份认证。
3.1.4.2.RBAC 授权
- 为监控工具或管理员配置最小权限的 RBAC 规则:
- 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
复制代码 3.1.5.访问方式示例
3.1.5.1.利用 kubectl proxy(绕过 TLS 验证)
- kubectl proxy --port=8080 &
- curl http://localhost:8080/api/v1/nodes/<node-name>/proxy/metrics/cadvisor
复制代码 3.1.5.2.直接访问(需证书或 Token)
- # 使用 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
复制代码 3.1.6.生产情况最佳实践
- 禁用匿名访问:确保 Kubelet 启动参数包含 --anonymous-auth=false。
- 启用证书轮换:配置 --rotate-certificates=true 提拔密钥安全性。
- 限制网络访问:
- 通过防火墙规则仅允许 API Server 和监控系统访问 10250 端口。
- 利用 Kubernetes NetworkPolicy 限制 Pod 到 Kubelet 的通信。
- 源码位置:
- pkg/kubelet/server/server.go(核心折务端实现)
- pkg/kubelet/server/auth.go(认证鉴权逻辑)
3.2.cAdvisor资源监控数据收罗 端口:4194
3.2.1.cAdvisor 的作用
- cAdvisor 是一个开源的容器资源监控工具,集成在 Kubelet 中,用于实时网络节点和容器的资源利用数据,包括:
- CPU 利用率
- 内存利用量
- 文件系统(磁盘)利用情况
- 网络流量统计
- 容器的启动时间和运行状态等。
- 这些数据通过 REST API 暴露,供 Prometheus、Heapster 或其他监控系统收罗。
3.2.2.端口 4194 现已不支持
- 在 Kubernetes 早期版本(如 1.7 之前),cAdvisor 默认通过端口 4194 对外暴露监控数据。
- 用户可以直接访问 http://<Node-IP>:4194/metrics 获取容器的 Prometheus 格式指标
- 从 Kubernetes 1.12 开始,出于安全性和架构简化的考虑,Kubelet 默认不再单独监听 4194 端口,而是将 cAdvisor 的 API 集成到 Kubelet 的主 API 端口(默认 10250)中。具体变化包括:
- cAdvisor 数据路径合并:cAdvisor 的监控数据现在通过 Kubelet 的 /metrics/cadvisor 端点暴露,访问地点为 https://<Node-IP>:10250/metrics/cadvisor。
- 认证与授权:访问须要经过 Kubelet 的 TLS 认证(如利用 ServiceAccount Token 或客户端证书),避免未授权访问风险。
- 旧端口弃用:4194 端口默认关闭,若需启用需显式配置 Kubelet 参数(不推荐)。
3.2.3.通过 Kubelet 主端口(10250)访问 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(核心逻辑)
3.3.只读API 端口10255(状态查询)
3.3.1.端口 10255 的基本作用
- Kubelet 的 10255 端口 是一个 只读(Read-Only)HTTP 端口,主要用于暴露节点和 Pod 的监控数据及健康状态。它提供无需认证的访问,常用于以下场景:
- 资源监控:获取节点和容器的 CPU、内存、磁盘等指标。
- 健康检查:检查 Kubelet 和节点的工作状态。
- 调试与诊断:快速查看节点上运行的 Pod 列表或容器状态。
3.3.2.端口 10255 的暴露端点
- 通过 http://<Node-IP>:10255 可访问以下关键端点:
- /healthz:检查 Kubelet 的健康状态,返回 200 OK 表现正常。
- /pods:返回节点上所有 Pod 的清单(JSON 格式)。
- /metrics:暴露 Prometheus 格式的监控指标(包括 cAdvisor 数据)。
- /metrics/cadvisor:直接获取容器的详细资源利用指标(与 10250 端口的路径一致)。
- /spec:返回节点的硬件和操作系统信息(如 CPU 核心数、内存巨细等)。
3.3.3.只读端口10255已默认弃用
- 早期版本(如 Kubernetes 1.10 之前):
- 默认启用 10255 端口,供监控工具(如 Heapster)或管理员直接访问,无需认证。
- 安全改进(Kubernetes 1.10+):
- 由于无需认证的特性存在安全风险,Kubernetes 逐步弃用该端口:
- 1.10+ 版本:默认关闭 10255 端口,需显式启用。
- 1.18+ 版本:部门发行版(如 Kubeadm 部署的集群)完全禁用该端口。
- 1.20+ 版本:Kubelet 参数 --read-only-port 被标志为废弃,将来大概移除。
- 直接查看kubelet配置,可以看到确实已标志废弃
- # 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.)
复制代码 3.3.4.如何启用 10255 端口(不推荐)
- 若需临时启用(仅限测试情况),需配置 Kubelet 的启动参数:
- # 编辑 Kubelet 配置文件(如 /etc/kubernetes/kubelet.conf)
- KUBELET_ARGS="--read-only-port=10255"
- # 或者通过 systemd 服务文件添加参数
- ExecStart=/usr/bin/kubelet --read-only-port=10255 ...
复制代码 - 注意:启用后需确保节点防火墙限制对该端口的访问!
3.3.5.访问示例
- curl http://<Node-IP>:10255/pods
复制代码
- curl http://<Node-IP>:10255/metrics
复制代码
- curl -v http://<Node-IP>:10255/healthz
复制代码 3.3.6.利用 kubelet API 主通信端口 10250 更换 10255
- 默认的 Kubelet HTTPS 端口(10250)提供相同功能,但需认证:
- # 使用 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 列表)读写操作(如执行下令、日志访问)安全性低高默认状态新版本默认关闭始终启用 3.4.健康检查 /healthz 端口10248
3.4.1./healthz 端点简介
- /healthz 是 kubelet 的关键健康检查接口,用于指示其运行状态:
- 功能与用途
- 存活探针(Liveness Probe):供 kubelet 自身或外部系统(如 API Server)检查其是否正常运行。
- 健康状态反馈:返回 200 OK 表现健康,其他状态码(如 500)表现异常。
- 依赖项检查:某些配置下会验证 kubelet 依赖的组件(如容器运行时)是否可用。
- /healthz 端点的访问端口 默认10248
- 可以通过kubelet 参数 --healthz-port 指定端口
3.4.2./healthz 访问示例
- 相应为ok,则表现节点健康
- # 查看本地端口监听情况
- # ss -tuln | grep 10248
- tcp LISTEN 0 4096 127.0.0.1:10248 *:*
- # curl http://localhost:10248/healthz
- ok
复制代码 - 安全性设计
- 本地访问限制:默认仅监听 127.0.0.1,不暴露给外部网络。
- 无认证机制:由于仅限本机访问,无需额外认证。
3.4.3.10248 与主端口 10250 的区别
特性端口 10248 (--healthz-port)端口 10250(主 API 端口)协议HTTP(明文)HTTPS(加密)访问范围仅本机(localhost)外部网络(默认监听所有接口)功能仅健康检查(/healthz)全功能 API(Pod 管理、监控等)认证无逼迫证书/Token 认证 3.4.4.--healthz-port 参数状态与版本变化
- 弃用状态:
- --healthz-port 参数已被标志为 废弃(DEPRECATED),Kubernetes 推荐通过 kubelet 配置文件(由 --config 指定)设置相关参数。
- 弃用原因:
- Kubernetes 逐步淘汰下令行参数,转向同一的配置文件管理,以提高可维护性。
- 版本影响:
- 1.10+ 版本:开始推荐利用配置文件。
- 1.23+ 版本:部门发行版大概默认关闭该端口。
4.kubelet 核心功能层
- 请见:Kubernetes控制平面组件:Kubelet详解(二):核心功能层
- 本文主要讲解了 kubelet 架构中的核心功能层,包括核心管理模块的 PLEG、cAdvisor、GPUManager、OOMWatcher、ProbeManager、DiskSpaceManager、EvictionManager;运行时和谐模块的 syncLoop、PodWorker,以及容器生命周期管理模块的 StatusManager、VolumeManager、ImageGC、ContainerGC、ImageManager、CertificateManager,对每个组件都做了详细讲解
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |