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 的请求, 来确定该请求是否被允许
参考文档