我使用许多 Google 云服务。我工作的一些 Cloud Storage 存储桶位于项目 A 中,可以通过我自己的帐户访问,还有一些位于项目 B 中,我只能使用服务帐户访问。我激活了相应的服务帐户
gcloud auth activate-service-account --key-file mykey.json
在随后的登录过程中,我刚刚使用
gcloud config set account service_account
我还需要切换我的活动项目,为此我使用了命令
gcloud config set project project-B
服务帐户运行良好,允许我访问存储在 Google Cloud Storage 上的特定 bitbucket,但之后我需要使用 Argo 提交 kubernetes 工作流,所以我使用命令切换回我的帐户和项目
gcloud config set account my_account
gcloud config set project project-A
使用“gcloud auth list”我可以看到 my_account 是活跃的
ACTIVE ACCOUNT
service_account.iam.gserviceaccount.com
* my_account
但是当我尝试提交运行“kubectl -n default get services”时出现以下错误:
Error from server (Forbidden): services is forbidden: User "service_account.iam.gserviceaccount.com" cannot list resource "services" in API group "" in the namespace "default": Required "container.services.list" permission.
当我使用 my_namespace 而不是 default 时,我得到了同样的错误。我对此感到很困惑,因为像“gsutil ls”这样的 gcloud 命令的功能就像我在正确的帐户和项目中一样。为什么 kubernetes 仍然认为我在使用服务帐户,如何让它停止使用它以便我可以再次使用 kubernetes 做我需要做的事情?在激活服务帐户之前,我尝试运行的命令和管道运行良好。
原来我只需要跑
gcloud container clusters get-credentials mycluster
最初,我认为我还需要通过在
~/.kube/config
运行 get-credentials 命令时删除我的 kubeconfig 文件来解决这个问题,但正如评论中所指出的那样,结果证明 get-credentials 命令是所有必要的。在 gcloud 服务帐户处于活动状态时运行 argo 命令时,问题似乎特别浮出水面:该命令首先会失败,然后所有后续 kubectl 命令都会返回此权限错误。如果我切换到服务帐户,运行 gcloud 命令,然后切换回我的帐户,它不会影响 kubectl 的行为。