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 动词 | 请求动词 |
---|---|
POST | create |
GET, HEAD | get |
PUT | update |
PATCH | patch |
DELETE | delete |
资源和子资源根据传入请求的路径确定:
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 权限已更新,可以访问上述所有子资源。