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标志启动 apiserver - 有关更多详细信息,请参阅 apiserver 身份验证文档
要启用 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 使用与 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 |
| 所有其他 | 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
上次修改时间:2023 年 12 月 29 日下午 9:47 PST:修复过时的链接/锚点 (bcc55ae7c9)