kubelet 认证/鉴权
概述
kubelet 的 HTTPS 端点公开了一些 API,这些 API 可以访问敏感度不同的数据, 并允许你在节点上和容器内以不同级别的权限执行操作。
本文档介绍了如何对 kubelet 的 HTTPS 端点的访问进行认证和鉴权。
kubelet 身份认证
默认情况下,未被已配置的其他身份认证方法拒绝的对 kubelet 的 HTTPS 端点的请求会被视为匿名请求,
并被赋予 system:anonymous 用户名和 system:unauthenticated 组。
要禁用匿名访问并向未经身份认证的请求发送 401 Unauthorized 响应,请执行以下操作:
- 带
--anonymous-auth=false标志启动 kubelet
要对 kubelet 的 HTTPS 端点启用 X509 客户端证书认证:
- 带
--client-ca-file标志启动 kubelet,提供一个 CA 证书包以供验证客户端证书 - 带
--kubelet-client-certificate和--kubelet-client-key标志启动 API 服务器 - 有关更多详细信息,请参见 API 服务器身份认证文档
要启用 API 持有者令牌(包括服务账号令牌)以对 kubelet 的 HTTPS 端点进行身份认证,请执行以下操作:
- 确保在 API 服务器中启用了
authentication.k8s.io/v1beta1API 组 - 带
--authentication-token-webhook和--kubeconfig标志启动 kubelet - kubelet 调用已配置的 API 服务器上的
TokenReviewAPI,以根据持有者令牌确定用户信息
kubelet 鉴权
任何成功通过身份认证的请求(包括匿名请求)之后都会被鉴权。
默认的鉴权模式为 AlwaysAllow,它允许所有请求。
细分对 kubelet API 的访问权限可能有多种原因:
- 启用了匿名身份认证,但是应限制匿名用户调用 kubelet API 的能力
- 启用了持有者令牌认证,但应限制任意 API 用户(如服务账号)调用 kubelet API 的能力
- 启用了客户端证书身份认证,但仅应允许已配置的 CA 签名的某些客户端证书使用 kubelet API
要细分对 kubelet API 的访问权限,请将鉴权委派给 API 服务器:
- 确保在 API 服务器中启用了
authorization.k8s.io/v1beta1API 组 - 带
--authorization-mode=Webhook和--kubeconfig标志启动 kubelet - kubelet 调用已配置的 API 服务器上的
SubjectAccessReviewAPI, 以确定每个请求是否得到鉴权
kubelet 使用与 API 服务器相同的请求属性方法对 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 对象的名称。
在此模式下运行时,请确保传递给 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.33 [beta] (enabled by default: 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,
确保其具备访问上述所有子资源的权限。