Files
website/content/zh/docs/reference/command-line-tools-reference/kubelet-authentication-authorization.md
T
SataQiu 9d37155a4b zh-trans: add docs/reference/command-line-tools-reference/kubelet-authentication-authorization.md (#13200)
* zh-trans: add docs/reference/command-line-tools-reference/kubelet-authentication-authorization.md

* Update kubelet-authentication-authorization.md
2019-03-15 08:36:59 -07:00

7.3 KiB
Raw Blame History

title
title
Kubelet 认证/授权

{{< toc >}}

概述

kubelet 的 HTTPS 端点公开了 API,可以访问不同敏感度的数据, 并允许您在节点和容器内执行不同权限级别的操作。

本文档介绍如何认证和授权访问 kubelet 的 HTTPS 端点。

Kubelet 认证

默认情况下,未被其他已配置的身份验证方法拒绝的对 kubelet 的 HTTPS 端点的请求将被视为匿名请求, 并提供一个 systemanonymous 用户名和一个 systemunauthenticated 用户组。

禁用匿名访问并向未经身份验证的请求发送 401 Unauthorized 响应:

  • 附带 --anonymous-auth=false 参数启动 kubelet

要为 kubelet 的 HTTPS 端点启用 X509 客户端证书身份验证,请执行以下操作:

  • 附带 --client-ca-file 参数启动 kubelet,提供 CA 包以验证客户端证书
  • 附带 --kubelet-client-certificate--kubelet-client-key 参数启动 apiserver
  • 查看 apiserver 认证文档以获取更多细节

启用 API bearer 令牌(包括服务帐户令牌)以用于对 kubelet 的 HTTPS 端点进行身份验证:

  • 确保 API 服务器启用了 authentication.k8s.io/v1beta1 API 组
  • 附带 --authentication-token-webhook--kubeconfig 参数启动 kubelet
  • kubelet 在配置的 API 服务器上调用 TokenReview API,以确定来自 bearer 令牌的用户信息

Kubelet 授权

任何成功经过身份验证的请求(包括匿名请求)都将得到授权。 默认授权模式是 AlwaysAllow,它允许所有请求。

有许多可能的原因来细分对 kubelet API 的访问:

  • 匿名身份验证被启用,但匿名用户调用 kubelet API 的能力应该受到限制
  • bearer 令牌验证被启用,但应限制任意 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 请求授权。

动词(verb)是根据传入请求的 HTTP 动词(verb)确定的:

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
all others 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