Kubelet 认证/鉴权

概述

Kubelet 的 HTTPS 端点暴露了 API,这些 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 Server 中启用了 authentication.k8s.io/v1beta1 API 组
  • 使用 --authentication-token-webhook--kubeconfig 标志启动 kubelet
  • kubelet 调用配置的 API Server 上的 TokenReview API,从持有者令牌中确定用户信息

Kubelet 授权

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

有许多可能的原因需要细分对 Kubelet API 的访问权限

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

要细分对 Kubelet API 的访问权限,可以将授权委托给 API Server

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

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

Verb(动词)由传入请求的 HTTP Verb 确定

HTTP Verb请求 Verb
POSTcreate
GET, HEADget
PUTupdate
PATCHpatch
DELETEdelete

Resource 和 subresource 由传入请求的路径确定

Kubelet APIresourcesubresource
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
/checkpoint/*nodescheckpoint
所有其他nodesproxy

Namespace 和 API group 属性始终为空字符串,resource name 始终是 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)

启用 Feature Gate KubeletFineGrainedAuthz 后,在回退到 /pods, /runningPods, /configz/healthz 端点的 proxy subresource 之前,kubelet 会执行细粒度检查。Resource 和 subresource 由传入请求的路径确定

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

启用 Feature Gate KubeletFineGrainedAuthz 后,请确保传递给 API Server 的 --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 使用访问上述所有 subresource 的权限进行了更新。

最后修改于 2025年3月19日 下午4:53 PST: 在 kubelet 授权中提及内置的 ClusterRole (5bfcf81227)