Kubernetes RBAC 无法升级连接:Forbidden (user=system:anonymous, verb=create, resource=nodes, subresource=proxy)

Kubernetes RBAC unable to upgrade connection: Forbidden (user=system:anonymous, verb=create, resource=nodes, subresource=proxy)

我是 运行 启用了 RBAC 的 Kubernetes 1.6.2。我创建了一个用户 kube-admin,它具有以下集群角色绑定

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: k8s-admin
subjects:
- kind: User
  name: kube-admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

当我尝试 kubectl exec 进入 运行 pod 时,出现以下错误。

kubectl -n kube-system exec -it kubernetes-dashboard-2396447444-1t9jk -- /bin/bash
error: unable to upgrade connection: Forbidden (user=system:anonymous, verb=create, resource=nodes, subresource=proxy)

我猜我缺少 ClusterRoleBinding 裁判,我缺少哪个角色?

kubectl 和 api 之间的连接正常,并且正在正确授权。

为了满足 exec 请求,api服务器联系 kubelet 运行 pod,而该连接是被禁止的。

您的 kubelet 配置为 authenticate/authorize 请求,并且 api 服务器未提供 kubelet 识别的身份验证信息。

api服务器向 kubelet 进行身份验证的方式是使用客户端证书和密钥,配置提供给 API 服务器的 --kubelet-client-certificate=... --kubelet-client-key=... 标志。

有关详细信息,请参阅 https://kubernetes.io/docs/admin/kubelet-authentication-authorization/#overview

我遇到了完全相同的错误,但对我来说,问题出在我的 kops 设置上。我想在这里分享我的结果,因为它可能会对将来的人有所帮助。

由于 kops v1.19.1 中存在一个错误,kubelet anonymousAuth 的配置必须显式设置为 false

我使用的是 kops 1.19 版,并将我的集群从 k8s v1.11 升级到 v1.19。升级后,当我尝试 运行 kubectl port-forwardkubectl logskubectl exechelm list 等时开始看到此错误。问题是kops 中的一个错误,没有设置 anonymousAuth 配置,或者将其设置为 true。由于 kops 中的这个错误,kubelet anonymousAuth 的配置必须明确设置为 false.

修复

编辑集群

$ kops edit cluster

在spec.kubelet.anonymousAuth下添加配置,即

spec:
  kubelet:
    anonymousAuth: false

更新集群

$ kops update cluster --yes

$ kops rolling-update cluster --yes

相关

PR that fixes the immediate issue

PR that fixes a related issue

Related kops docs