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
相关推荐
Thinbug1 天前
群晖Nas - Docker(ContainerManager)上安装GitLab
docker·容器·gitlab
今夕节度使1 天前
通过 VS Code 连接 GitLab 并上传项目
git·elasticsearch·gitlab
leblancAndSherry2 天前
Gitlab + Jenkins 实现 CICD
linux·运维·docker·kubernetes·gitlab·jenkins
星释3 天前
Yii2项目自动向GitLab上报Bug
前端·gitlab·bug·yii
星释5 天前
如何自动部署GitLab项目
gitlab
keson要进步5 天前
CICD实战(二)-----gitlab的安装与配置
linux·运维·gitlab
猫头虎6 天前
[特殊字符]解决 “IDEA 登录失败。不支持早于 14.0 的 GitLab 版本” 问题的几种方法
java·ide·网络协议·http·https·gitlab·intellij-idea
风早君6 天前
jenkins集成gitlab发布到远程服务器
服务器·gitlab·jenkins
大白要努力!8 天前
在 Android Studio 中使用 GitLab 添加图片到 README.md
android·gitlab·android studio