Gitlab runner 无法执行 helm list 命令

Gitlab runner not able to execute helm list command

我正在尝试为我的集群内 CICD 管道设置一个 gitlab kubernetes 代理和运行程序。 我的 gitlab.ci 是这样的:

stages:
  - deploy

deploy-new-images:
  stage: deploy
  image:
    name: alpine/helm:3.7.1
    entrypoint: [""]
  script:
    - helm list --all-namespaces
  tags:
    - staging
    - test

Gitlab 能够为此特定作业启动容器,但失败并出现以下错误:

Error: list: failed to list: secrets is forbidden: User "system:serviceaccount:gitlab:default" cannot list resource "secrets" in API group "" at the cluster scope

我的代理部署有一个名为 gitlab 的服务帐户。此服务帐户通过 ClusterRoleBinding 关联到默认的管理员 ClusterRole;它还通过 RoleBinding 资源与 Role 相关联。 该角色具有以下定义:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: "2022-04-14T15:27:27Z"
  labels:
    app: gitlab-agent
  name: gitlab-agent
  namespace: gitlab
  resourceVersion: "44732"
  uid: 0b09cabe-826f-4c7c-a864-3192e0c9ea42
rules:
- apiGroups:
  - ""
  resources:
  - '*'
  verbs:
  - '*'

另一方面,gitlab runner 是通过 Helm 使用以下值部署的:

  image: "gitlab/gitlab-runner:alpine-v14.9.0"
  imagePullPolicy: "Always"
  replicas: 5
  gitlabUrl: https://gitlab.com
  runnerRegistrationToken: "{{ vault_gitlab_runner_registration_token }}"
  unregisterRunners: true
  logLevel: "debug"
  rbac:
    create: true
    rules:
    - resources: ["*"]
      verbs: ["*"]
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["*"]
  clusterWideAccess: true
  metrics:
    enabled: false
  runners:
    executor: kubernetes
    locked: false
    tags: "staging,test"
    name: "test-staging-gitlab-runner"
    runUntagged: false
    config: |
      [[runners]]
        [runners.kubernetes]
          namespace = "gitlab"
          image = "ubuntu:20.04"

在我看来,agent 和 runner 都有足够的权限,但是 helm list 命令失败了。有什么想法吗?

简而言之: 在您的 gitlab-runner 值文件中,在 [runners.kubernetes] 下添加设置 service_account = "gitlab"

解释:实际执行job的pod不是gitlab-runnerpod,也不是gitlab agent pod。 Gitlab runner kubernetes executor 为每个作业生成一个新的 pod。这些pods设置服务账号名的地方在上面的设置

上面的错误消息显示 pod 运行 作业正在使用 gitlab 命名空间的默认服务帐户。此服务帐户没有(也不应该)具有所需的权限。

值文件中的 runners.config 部分最终出现在配置运行器的 config.toml 文件中。这是有关 kubernetes 执行程序 config.toml 的文档:https://docs.gitlab.com/runner/executors/kubernetes.html#other-configtoml-settings

这里是 Kubernetes executor interaction diagram