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 |
---|---|
POST | create |
GET, HEAD | get |
PUT | update |
PATCH | patch |
DELETE | delete |
Resource 和 subresource 由传入请求的路径确定
Kubelet API | resource | subresource |
---|---|---|
/stats/* | nodes | stats |
/metrics/* | nodes | metrics |
/logs/* | nodes | log |
/spec/* | nodes | spec |
/checkpoint/* | nodes | checkpoint |
所有其他 | nodes | proxy |
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 API | resource | subresource |
---|---|---|
/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 |
启用 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 的权限进行了更新。