使用gitlab-runner环境中的服务帐户令牌时,kubectl未经授权



我们正在通过kubernetes群集内的kubernetes执行者运行gitlab-runner实例(我们称其为kube01(。这些实例构建并部署到kubernetes群集,跑步者将获得一个环境变量KUBECONFIG(指向配置文件(,如下:

$ cat $KUBECONFIG
---
apiVersion: v1
clusters:
- name: gitlab-deploy
  cluster:
    server: https://KUBE01:6443
    certificate-authority-data: <CA_B64>
contexts:
- name: gitlab-deploy
  context:
    cluster: gitlab-deploy
    namespace: dev
    user: gitlab-deploy
current-context: gitlab-deploy
kind: Config
users:
- name: gitlab-deploy
  user:
    token: gitlab-deploy-token-<secret>

我们可以验证kubectl实际上正在使用上述gitlab-deploy上下文:

$ kubectl config current-context
gitlab-deploy

但是,试图实际影响kube01失败:

$ kubectl get pods
error: You must be logged in to the server (Unauthorized)

在我的机器上,我们可以验证命名空间和服务帐户令牌是正确的:

$ kubectl get sa/gitlab-deploy -o yaml --namespace dev
apiVersion: v1
kind: ServiceAccount
metadata:
  <snip metadata>
  name: gitlab-deploy
  namespace: dev
secrets:
- name: gitlab-deploy-token-<secret>

除了之外,我找不到有关此文件的任何文档,它应该只能使用,并且我发现有关此错误消息的所有论坛/堆栈交换问题都是不良的用户/通过组合;但据我所知,我的令牌,名称空间和群集都是正确的。

在对kuberneter身份验证文档进行了更详细的读取和一些反复试验之后,我发现了问题。

"秘密令牌"内部服务帐户对象不是我们用于服务帐户身份验证的实际秘密令牌;相反,它是一个指向秘密对象的指针,而秘密对象又具有真实的(承载(令牌。可以找到如下:

$ kubectl get secret gitlab-deploy-token-<secret> -o yaml
apiVersion: v1
data:
  ca.crt: <CA_B64>
  namespace: ZGV2
  token: <BEARER_TOKEN_B64>
kind: Secret
metadata:
  <snip metadata>
  name: gitlab-deploy-token-<secret>
  namespace: dev
type: kubernetes.io/service-account-token

当然,载体令牌是基本64,因为它是一个秘密。但奇怪的是,我们没有在KUBECONFIG文件中对基础64进行编码(就像我们使用CA一样(。因此,我们要做的就是找到上述载体令牌,将其从base64解码,然后将其添加为gitlab-deploy用户下的令牌。然后,身份验证有效。

最新更新