当我使用gcloud sdk在本地shell上运行一个简单命令时。
$ kubectl get pod
我收到了这样的错误:
来自服务器的错误(禁止):禁止使用pod:用户"客户端"无法列出群集范围内的窗格:未知用户"客户端"
相同的命令在GCP云shell和
的输出上运行良好$ gcloud auth list
符合预期:
Credentialed Accounts
ACTIVE ACCOUNT
* foo@bar.com
我也试图创建clusterrolebinding,但得到类似的错误。
答案 0 :(得分:20)
在群集设置中禁用旧版授权时会发生这种情况,因为您使用的客户端证书是旧版身份验证方法。所以看起来正在发生的事情是客户端身份验证成功但授权失败,正如预期的那样。 ("未知用户"在错误消息中,令人困惑的是,似乎意味着授权系统不知道用户,而不是认证系统。)
您可以使用
禁用客户端证书gcloud config unset container/use_client_certificate
然后使用
重新生成kubectl配置gcloud container clusters get-credentials my-cluster
或者,您只需在Google云端控制台的群集设置中重新启用旧版授权,或使用以下命令:
gcloud container clusters update [CLUSTER_NAME] --enable-legacy-authorization
答案 1 :(得分:6)
我知道此问题现已解决,但我想补充一些有关此问题可能发生的原因,因为它可能对遇到类似问题的人有用。
Kubernetes Engine用户可以使用Google OAuth2访问令牌对Kubernetes API进行身份验证,这意味着当用户创建新群集时,Kubernetes Engine会配置kubectl以向群集验证用户身份。
还可以使用传统方法对群集进行身份验证,包括使用群集证书和/或用户名和密码。这在gcloud config
。
gcloud的配置,例如Cloud Shell可能与其他地方的gcloud安装不同,例如在家庭工作站上。
在:
来自服务器的错误(禁止):禁止使用pod:用户"客户端"不能 在群集范围列出pod:未知用户"客户端"
错误表明gcloud config set container/use_client_certificate
设置为True
,即gcloud期望客户端群集证书对群集进行身份验证(这就是错误中的'客户端'消息指的是)。
正如@Yanwei所发现的那样,通过在glcoud配置中发出以下命令来取消设置container / use_client_certificate,结束了对旧版证书或凭证的需求,并防止出现错误消息:
gcloud config unset container/use_client_certificate
如果您在家庭工作站或其他地方使用旧版本的gcloud,则可能更有可能出现此类问题。
有关此here的一些信息。
答案 2 :(得分:1)
发现gcloud配置存在一些问题。这个命令解决了它:
gcloud config unset container/use_client_certificate
答案 3 :(得分:1)
除了设置
gcloud config unset container / use_client_certificate
还要确保没有将此env变量设置为True
CLOUDSDK_CONTAINER_USE_CLIENT_CERTIFICATE