Kubelet 身份验证/授权

概述

Kubelet 的 HTTPS 端点公开了一些 API,这些 API 允许访问不同敏感度的数据,并允许你在节点上和容器内执行不同权限级别的操作。

本文档介绍了如何对 Kubelet 的 HTTPS 端点进行身份认证和授权。

Kubelet 身份认证

默认情况下,发往 Kubelet HTTPS 端点的请求,如果未被其他配置的身份认证方法拒绝,则会被视为匿名请求,并被赋予 system:anonymous 用户名和 system:unauthenticated 用户组。

若要禁用匿名访问并对未经认证的请求返回 401 Unauthorized 响应:

  • 启动 Kubelet 时添加 --anonymous-auth=false 标志。

若要启用对 Kubelet HTTPS 端点的 X509 客户端证书认证:

  • 启动 Kubelet 时添加 --client-ca-file 标志,并提供用于验证客户端证书的 CA 证书包。
  • 使用 --kubelet-client-certificate--kubelet-client-key 标志启动 API 服务器。
  • 更多详细信息,请参见 API 服务器身份认证文档

若要启用 API 持有者令牌(包括服务账户令牌)对 Kubelet HTTPS 端点进行身份认证:

  • 确保 API 服务器中启用了 authentication.k8s.io/v1 API 组。
  • 启动 Kubelet 时添加 --authentication-token-webhook--kubeconfig 标志。
  • Kubelet 会调用所配置的 API 服务器上的 TokenReview API,从而通过持有者令牌确定用户信息。

Kubelet 授权

任何成功完成身份认证的请求(包括匿名请求)随后都会进入授权阶段。默认的授权模式是 AlwaysAllow,它允许所有请求。

有许多理由需要对 Kubelet API 的访问权限进行细分:

  • 启用了匿名认证,但应限制匿名用户调用 Kubelet API 的能力。
  • 启用了持有者令牌认证,但应限制任意 API 用户(如服务账户)调用 Kubelet API 的能力。
  • 启用了客户端证书认证,但只应允许由配置的 CA 签名的部分客户端证书使用 Kubelet API。

若要细分对 Kubelet API 的访问权限,请将授权委托给 API 服务器:

  • 确保 API 服务器中启用了 authorization.k8s.io/v1 API 组。
  • 启动 Kubelet 时添加 --authorization-mode=Webhook--kubeconfig 标志。
  • Kubelet 会调用所配置的 API 服务器上的 SubjectAccessReview API,以确定每个请求是否被授权。

Kubelet 使用与 API 服务器相同的请求属性方法来授权 API 请求。

动词(verb)是由传入请求的 HTTP 动词确定的:

HTTP 动词请求动词
POSTcreate
GET, HEADget
PUTupdate
PATCHpatch
DELETEdelete

资源(resource)和子资源(subresource)是由传入请求的路径确定的:

Kubelet API资源子资源
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
/checkpoint/*nodescheckpoint
所有其他资源nodesproxy

警告

nodes/proxy 权限授予对所有其他 Kubelet API 的访问权限。这包括可用于在节点上运行的任何容器中执行命令的 API。

其中一些端点通过 HTTP GET 请求支持 Websocket 协议,这些请求使用 get 动词进行授权。这意味着对 nodes/proxyget 权限并非只读权限,它也授权在节点上运行的任何容器中执行命令。

命名空间(namespace)和 API 组(API group)属性始终为空字符串,资源名称始终为 Kubelet 的 Node API 对象名称。

在这种模式下运行时,请确保传递给 API 服务器的 --kubelet-client-certificate--kubelet-client-key 标志所标识的用户,具备以下属性的授权:

  • verb=*, resource=nodes, subresource=proxy
  • verb=*, resource=nodes, subresource=stats
  • verb=*, resource=nodes, subresource=log
  • verb=*, resource=nodes, subresource=spec
  • verb=*, resource=nodes, subresource=metrics

细粒度授权

特性状态: Kubernetes v1.36 [稳定版](默认启用)

在回退到 proxy 子资源之前,Kubelet 会先对 /pods/runningPods/configz/healthz 端点进行细粒度检查。资源和子资源根据传入请求的路径确定:

Kubelet API资源子资源
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/podsnodespods, proxy
/runningPods/nodespods, proxy
/healthznodeshealthz, proxy
/configznodesconfigz, proxy
所有其他资源nodesproxy

当启用 KubeletFineGrainedAuthz 特性门控时,请确保传递给 API 服务器的 --kubelet-client-certificate--kubelet-client-key 标志所标识的用户,具备以下属性的授权:

  • verb=*, resource=nodes, subresource=proxy
  • verb=*, resource=nodes, subresource=stats
  • verb=*, resource=nodes, subresource=log
  • verb=*, resource=nodes, subresource=metrics
  • verb=*, resource=nodes, subresource=configz
  • verb=*, resource=nodes, subresource=healthz
  • verb=*, resource=nodes, subresource=pods

如果使用了 RBAC 授权,启用此门控还会确保内置的 system:kubelet-api-admin 集群角色(ClusterRole)已更新,拥有访问上述所有子资源的权限。


最后修改时间:2026 年 2 月 19 日,下午 12:49 (PST): KEP-2862: KubeletFineGrainedAuthz 升级至稳定版 (a59c6bf261)