Kubelet 认证/授权

概述

kubelet 的 HTTPS 端点公开了对不同敏感度数据进行访问的 API,并允许你在节点和容器中执行不同权限级别的操作。

本文档描述了如何认证和授权对 kubelet HTTPS 端点的访问。

Kubelet 认证

默认情况下,对 kubelet HTTPS 端点的请求,如果未被其他已配置的认证方法拒绝,则视为匿名请求,并获得用户名为 system:anonymous 和组 system:unauthenticated

禁用匿名访问并将 401 Unauthorized 响应发送给未经认证的请求:

  • 使用 --anonymous-auth=false 标志启动 kubelet。

启用 X509 客户端证书认证到 kubelet 的 HTTPS 端点:

  • 使用 --client-ca-file 标志启动 kubelet,提供 CA 证书包以验证客户端证书。
  • 使用 --kubelet-client-certificate--kubelet-client-key 标志启动 apiserver。
  • 有关更多详细信息,请参阅 apiserver 认证文档

启用 API 持有者令牌(包括服务帐户令牌)用于认证到 kubelet 的 HTTPS 端点:

  • 确保 API 服务器中启用了 authentication.k8s.io/v1beta1 API 组。
  • 使用 --authentication-token-webhook--kubeconfig 标志启动 kubelet。
  • kubelet 在配置的 API 服务器上调用 TokenReview API,以从持有者令牌中确定用户信息。

Kubelet 授权

任何成功认证的请求(包括匿名请求)都会被授权。默认的授权模式是 AlwaysAllow,它允许所有请求。

有许多可能的原因需要细分对 kubelet API 的访问:

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

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

  • 确保 API 服务器中启用了 authorization.k8s.io/v1beta1 API 组。
  • 使用 --authorization-mode=Webhook--kubeconfig 标志启动 kubelet。
  • kubelet 在配置的 API 服务器上调用 SubjectAccessReview API,以确定每个请求是否已授权。

kubelet 使用与 apiserver 相同的请求属性方法来授权 API 请求。

动词是从传入请求的 HTTP 动词中确定的

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

资源和子资源根据传入请求的路径确定:

Kubelet API资源子资源
/stats/*节点(nodes)stats
/metrics/*节点(nodes)metrics
/logs/*节点(nodes)log
/spec/*节点(nodes)spec
/checkpoint/*节点(nodes)checkpoint
所有其他节点(nodes)proxy

命名空间和 API 组属性始终为空字符串,资源名称始终是 kubelet 的 Node API 对象的名称。

以这种模式运行时,请确保通过 apiserver 传递的 --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.33 [beta] (默认启用:true)

当特性门控 KubeletFineGrainedAuthz 被启用时,kubelet 会在回退到 /pods/runningPods/configz/healthz 端点的 proxy 子资源之前执行细粒度检查。资源和子资源根据传入请求的路径确定:

Kubelet API资源子资源
/stats/*节点(nodes)stats
/metrics/*节点(nodes)metrics
/logs/*节点(nodes)log
/pods节点(nodes)pods, proxy
/runningPods/节点(nodes)pods, proxy
/healthz节点(nodes)healthz, proxy
/configz节点(nodes)configz, proxy
所有其他节点(nodes)proxy

当特性门控 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 权限已更新,可以访问上述所有子资源。

最后修改时间:2025 年 3 月 19 日太平洋标准时间下午 4:53:在 kubelet 授权中提及内置的 clusterrole (5bfcf81227)