Kubernetes kubectl在gitlab runner环境中使用服务帐户令牌时未经授权
我们通过kubernetes集群中的kubernetes执行器运行Kubernetes kubectl在gitlab runner环境中使用服务帐户令牌时未经授权,kubernetes,gitlab-ci-runner,Kubernetes,Gitlab Ci Runner,我们通过kubernetes集群中的kubernetes执行器运行gitlab runner实例(我们称之为KUBE01)。这些实例构建并部署到kubernetes集群,并为运行者提供一个环境变量KUBECONFIG(指向配置文件),如下所示: $ cat $KUBECONFIG --- apiVersion: v1 clusters: - name: gitlab-deploy cluster: server: https://KUBE01:6443 certificate
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 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
但是,试图实际影响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>
$kubectl获取sa/gitlab部署-o yaml——名称空间开发
版本:v1
种类:服务帐户
元数据:
名称:gitlab部署
名称空间:dev
秘密:
-名称:gitlab部署令牌-
我找不到任何关于这个的文档,除了它应该可以正常工作之外,我发现的关于这个错误消息的所有论坛/堆栈交换问题都是错误的用户/过程组合;但据我所知,我的令牌、名称空间和集群都是正确的。在更详细地阅读和一些尝试和错误之后,我发现了这个问题 服务帐户对象中的“秘密令牌”不是我们用于服务帐户身份验证的实际秘密令牌;相反,它是指向秘密对象的指针,而秘密对象又持有真实(承载)令牌。具体如下:
$ 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 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
$kubectl获取秘密gitlab部署令牌--o yaml
版本:v1
数据:
ca.crt:
名称空间:ZGV2
代币:
种类:秘密
元数据:
名称:gitlab部署令牌-
名称空间:dev
类型:kubernetes.io/service-account-token
当然,承载令牌是base64编码的,因为它是一个秘密;但奇怪的是,我们没有在KUBECONFIG
文件中对其进行base64编码(比如CA)。因此,我们要做的是找到上面的承载令牌,从base64解码它,并将它作为我们的令牌添加到gitlab deploy
user下。然后,身份验证工作