Kubelet 的 HTTPS 端点公开了一些 API,这些 API 允许访问不同敏感度的数据,并允许你在节点上和容器内执行不同权限级别的操作。
本文档介绍了如何对 Kubelet 的 HTTPS 端点进行身份认证和授权。
默认情况下,发往 Kubelet HTTPS 端点的请求,如果未被其他配置的身份认证方法拒绝,则会被视为匿名请求,并被赋予 system:anonymous 用户名和 system:unauthenticated 用户组。
若要禁用匿名访问并对未经认证的请求返回 401 Unauthorized 响应:
--anonymous-auth=false 标志。若要启用对 Kubelet HTTPS 端点的 X509 客户端证书认证:
--client-ca-file 标志,并提供用于验证客户端证书的 CA 证书包。--kubelet-client-certificate 和 --kubelet-client-key 标志启动 API 服务器。若要启用 API 持有者令牌(包括服务账户令牌)对 Kubelet HTTPS 端点进行身份认证:
authentication.k8s.io/v1 API 组。--authentication-token-webhook 和 --kubeconfig 标志。TokenReview API,从而通过持有者令牌确定用户信息。任何成功完成身份认证的请求(包括匿名请求)随后都会进入授权阶段。默认的授权模式是 AlwaysAllow,它允许所有请求。
有许多理由需要对 Kubelet API 的访问权限进行细分:
若要细分对 Kubelet API 的访问权限,请将授权委托给 API 服务器:
authorization.k8s.io/v1 API 组。--authorization-mode=Webhook 和 --kubeconfig 标志。SubjectAccessReview API,以确定每个请求是否被授权。Kubelet 使用与 API 服务器相同的请求属性方法来授权 API 请求。
动词(verb)是由传入请求的 HTTP 动词确定的:
| HTTP 动词 | 请求动词 |
|---|---|
| POST | create |
| GET, HEAD | get |
| PUT | update |
| PATCH | patch |
| DELETE | delete |
资源(resource)和子资源(subresource)是由传入请求的路径确定的:
| Kubelet API | 资源 | 子资源 |
|---|---|---|
| /stats/* | nodes | stats |
| /metrics/* | nodes | metrics |
| /logs/* | nodes | log |
| /spec/* | nodes | spec |
| /checkpoint/* | nodes | checkpoint |
| 所有其他资源 | nodes | proxy |
nodes/proxy 权限授予对所有其他 Kubelet API 的访问权限。这包括可用于在节点上运行的任何容器中执行命令的 API。
其中一些端点通过 HTTP GET 请求支持 Websocket 协议,这些请求使用 get 动词进行授权。这意味着对 nodes/proxy 的 get 权限并非只读权限,它也授权在节点上运行的任何容器中执行命令。
命名空间(namespace)和 API 组(API group)属性始终为空字符串,资源名称始终为 Kubelet 的 Node API 对象名称。
在这种模式下运行时,请确保传递给 API 服务器的 --kubelet-client-certificate 和 --kubelet-client-key 标志所标识的用户,具备以下属性的授权:
Kubernetes v1.36 [稳定版](默认启用)在回退到 proxy 子资源之前,Kubelet 会先对 /pods、/runningPods、/configz 和 /healthz 端点进行细粒度检查。资源和子资源根据传入请求的路径确定:
| 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 标志所标识的用户,具备以下属性的授权:
如果使用了 RBAC 授权,启用此门控还会确保内置的 system:kubelet-api-admin 集群角色(ClusterRole)已更新,拥有访问上述所有子资源的权限。