gitlab-runner 如何配置使用 Overwrite generated pod specifications

gitlab-runner 如何配置使用Overwrite generated pod specifications

说明

Overwrite generated pod specifications

此功能目前处于 Beta 阶段。我们强烈建议您先在测试 Kubernetes 集群上使用此功能,然后再将其用于生产集群。要使用此功能,您必须启用 FF_USE_ADVANCED_POD_SPEC_CONFIGURATION 功能标志。

要修改runner 管理端生成的 PodSpec,请使用 config.toml 文件中的 pod_spec 设置。

pod_spec 设置:

  • 覆盖并补全生成的 pod 规范的字段。
  • 覆盖 [runners.kubernetes] 下的 config.toml 中可能已设置的配置值。

你可以配置多个 pod_spec 设置:

  • name :定义 pod_spec 的名称。
  • patch_path :定义在生成最终 PodSpec 对象之前应用于该对象的更改的文件路径。该文件必须是 JSON 或 YAML 文件。
  • patch :一个 JSON 或 YAML 格式的字符串,描述在生成最终 PodSpec 对象之前必须应用于它的更改。
  • patch_type :runner用于将指定更改应用于 GitLab Runner 生成的 PodSpec 对象的策略。可接受的值包括 merge、json 和 strategic。

不能在同一个 pod_spec 配置中设置 patch_path 和 patch,否则会出错。

Merge patch strategy(不推荐)

合并补丁策略将键值替换应用于现有的 PodSpec。如果使用此策略,config.toml 中的 pod_spec 配置会覆盖最终 PodSpec 对象生成之前的值。因为这些值被完全覆盖,所以你应该谨慎使用此补丁策略。

如:

复制代码
concurrent = 1
check_interval = 1
log_level = "debug"
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = ""
  url = "https://gitlab.example.com"
  id = 0
  token = "__REDACTED__"
  token_obtained_at = 0001-01-01T00:00:00Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "kubernetes"
  shell = "bash"
  environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true", "CUSTOM_VAR=value"]
  [runners.kubernetes]
    image = "alpine"
    ...
    [[runners.kubernetes.pod_spec]]
      name = "build envvars"
      patch = '''
        containers:
        - env:
          - name: env1
            value: "value1"
          - name: env2
            value: "value2"
          name: build
      '''
      patch_type = "merge"

使用此配置,最终的 PodSpec 只有一个名为 build 的容器,其中包含两个环境变量 env1 和 env2。上面的示例导致相关的 CI 作业失败,原因如下:

  • helper 容器规范被移除。
  • build 容器规范丢失了 GitLab Runner 设置的所有必要配置。 为了防止作业失败,在此示例中,pod_spec 必须包含 GitLab Runner 生成的未修改的属性。

JSON patch strategy

JSON 补丁策略使用 JSON 补丁规范来控制 PodSpec 对象和数组的更新。不能在数组属性上使用此策略。

以下是使用 JSON 补丁策略的 pod_spec 配置示例。在此配置中,新的键值对被添加到现有的 nodeSelector 中。现有值不会被覆盖。

复制代码
concurrent = 1
check_interval = 1
log_level = "debug"
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = ""
  url = "https://gitlab.example.com"
  id = 0
  token = "__REDACTED__"
  token_obtained_at = 0001-01-01T00:00:00Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "kubernetes"
  shell = "bash"
  environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true", "CUSTOM_VAR=value"]
  [runners.kubernetes]
    image = "alpine"
    ...
    [[runners.kubernetes.pod_spec]]
      name = "val1 node"
      patch = '''
        { "op": "add", "path": "/nodeSelector", "value": { key1: "val1" } }
      '''
      patch_type = "json"

Strategic patch strategy

此策略性补丁策略使用应用于 PodSpec 对象每个字段的现有 patchStrategy。

以下是一个使用策略性补丁策略的 pod_spec 配置示例。在此配置中,资源请求设置为 build 容器。

复制代码
concurrent = 1
check_interval = 1
log_level = "debug"
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = ""
  url = "https://gitlab.example.com"
  id = 0
  token = "__REDACTED__"
  token_obtained_at = 0001-01-01T00:00:00Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "kubernetes"
  shell = "bash"
  environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true", "CUSTOM_VAR=value"]
  [runners.kubernetes]
    image = "alpine"
    ...
    [[runners.kubernetes.pod_spec]]
      name = "cpu request 500m"
      patch = '''
        containers:
        - name: build
          resources:
            requests:
              cpu: "500m"
      '''
      patch_type = "strategic"

Best practices

  • 在部署到生产环境之前,请在测试环境中测试添加的 pod_spec。

  • 确保 pod_spec 配置不会对 GitLab Runner 生成的规范产生负面影响。

  • 对于复杂的 pod 规范更新,请勿使用合并补丁策略。

  • 如果配置可用,请尽可能使用 config.toml。例如,以下配置会将 GitLab Runner 设置的第一个环境变量替换为自定义 pod_spec 中设置的变量,而不是将环境变量添加到现有列表中。

    复制代码
    concurrent = 1
    check_interval = 1
    log_level = "debug"
    shutdown_timeout = 0
    
    [session_server]
      session_timeout = 1800
    
    [[runners]]
      name = ""
      url = "https://gitlab.example.com"
      id = 0
      token = "__REDACTED__"
      token_obtained_at = 0001-01-01T00:00:00Z
      token_expires_at = 0001-01-01T00:00:00Z
      executor = "kubernetes"
      shell = "bash"
      environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true", "CUSTOM_VAR=value"]
      [runners.kubernetes]
        image = "alpine"
        ...
        [[runners.kubernetes.pod_spec]]
          name = "build envvars"
          patch = '''
            containers:
            - env:
              - name: env1
                value: "value1"
              name: build
          '''
          patch_type = "strategic"

patch

场景1:JSON patch strategy

复制代码
runners:
config: |
  [[runners]]
    environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true"]
    [runners.kubernetes]
      pull_policy = ["if-not-present"]
      namespace = "{{.Release.Namespace}}"
      privileged = true
      image = "alpine"
      [[runners.kubernetes.pod_spec]]
        name = "test_spec"
        patch = '''
          [
            {
              "op": "add",
              "path": "/containers/0/resources",
              "value": {
                "limits": {
                  "cpu": "800m"
                },
                "requests": {
                  "cpu": "600m"
                }
             }
           }
          ]
        '''
        patch_type = "json"

场景2:Strategic patch strategy

复制代码
runners:
config: |
  [[runners]]
    environment = ["FF_USE_ADVANCED_POD_SPEC_CONFIGURATION=true"]
    [runners.kubernetes]
      pull_policy = ["if-not-present"]
      namespace = "{{.Release.Namespace}}"
      privileged = true
      image = "alpine"
      [[runners.kubernetes.pod_spec]]
        name = "test_spec"
        patch = '''
          containers:
          - name: build
            resources:
              requests:
                cpu: "400m"
              limits:
                cpu: "700m"
        '''
        patch_type = "strategic"

patch_path

patch_path :定义在生成最终 PodSpec 对象之前应用于该对象的更改的文件路径。该文件必须是 JSON 或 YAML 文件。

创建文件

cat runner-pod-patches.yml

复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: runner-pod-patches
data:
  pod-patch.yaml: |
    [
      {
        "op": "add",
        "path": "/containers/0/resources",
        "value": {
          "limits": {
            "cpu": "500m"
          },
          "requests": {
            "cpu": "200m"
          }
        }
      }
    ]

kubectl apply -f runner-pod-patches.yml
相关推荐
我就是你毛毛哥1 天前
Docker 安装 GitLab
docker·容器·gitlab
雨声不在3 天前
gitlab中的repo删除特定commit
gitlab
vpk1124 天前
Docker Compose 部署 GitLab
docker·容器·gitlab
Irene19915 天前
什么是 DevOps
gitlab·devops
蓝天星空5 天前
GitLab上传项目到新的分支
gitlab
1candobetter8 天前
GitLab 项目创建与分支管理全流程
gitlab
林鸿群9 天前
Ubuntu 26.04 本地安装 GitLab CE 完整教程(非 Docker 方式)
linux·ubuntu·gitlab·私有部署·代码托管·ubuntu 26.04·omnibus
ascarl201010 天前
IDEA 一直弹 GitLab 登录,VS Code 却能正常 `git push`?问题排查记录
git·gitlab·intellij-idea
企鹅郁金香12 天前
Gitlab和Confluence和Svn的备份
svn·gitlab·confluence·gitlab备份·svn备份·confluence备份
barbyQAQ12 天前
GitLab CI/CD 基本用法指南
java·ci/cd·gitlab