Kubelet的认证和授权

kubelet 与 kube-apiserver 之间的通信是双向的, kubelet 既需要访问 kube-apiserver 获取分配到自己节点上的 pod 信息, kube-apiserver 也需要主动访问 kubelet 拉取日志, 状态, 监控数据等信息, 所以对两个组件来说, 认证是双向的, kube-apiserver 需要持有 kubelet 的客户端证书, 以完成 kubelet 对自己身份的校验; kubelet 也需要持有 kube-apiserver 的客户端证书, 完成 kube-apiserver 对自己身份的认证.

Kubelet 的认证

默认情况下, 对 kubelet 的 https 请求, 如果没有被配置的其他身份验证拒绝的话, 则被视为匿名请求, 并为这个请求赋予system:anonymous用户名和system:unauthenticated用户组

禁用匿名访问

如需要禁用匿名访问, 可以在启动 kubelet Daemon 时加入--anonymous-auth=false配置, 当有匿名访问时, 将回复401 Unauthorized响应未认证的请求

开启 X509 认证

  • kubelet 启动时添加--client-ca-file参数, 并指定签发客户端证书的 ca 根证书所在路径
  • kube-apiserver 启动时添加--kubelet-client-certificate--kubelet-client-key参数, 并分别为其指定由 kubelet ca 根证书签发的客户端证书和秘钥

Kubelet 的授权

任何被成功认证的请求(包括匿名请求)都将被授权. 默认的授权模式为AlwaysAllow, 即允许所有类型的请求

细分对 kubelet API 访问权限的原因

  • 匿名访问启用时, 应限制其调用 kubelet API 的能力
  • 客户端证书身份认证启用时, 只允许配置 CA 签名的客户端证书使用 kubelet API

细分权限

  • 确保authorization.k8s.io/v1beta1该 API Group 在 kube-apiserver 中是被启动的状态
  • 在 kubelet Daemon 启动参数中, 确保配置了--authorization-mode=Webhook--kubeconfig两个参数

kubelet 在接收到每个请求后, 会向指定的 kube-apiserver 发起 SubjectAccessReview API 的请求, 来确定该请求是否被允许


参考文档