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
相关推荐
梁萌4 小时前
docker部署gitlab和gitlab runner
docker·eureka·gitlab
johnnyAndCode4 小时前
Idea 设置GitLab时使用账密,而不是token的配置方法
gitlab·idea
天外飞雨4 小时前
Gitlab使用
gitlab
BUTCHER51 天前
GitLab SSH 密钥配置
运维·ssh·gitlab
明月心9521 天前
GitLab使用
gitlab
明月心9522 天前
gitlab pull requets
gitlab
BUTCHER52 天前
GitLab基本设置
gitlab
张小凡vip2 天前
Kubernetes---gitlab的ci/cd发布基于k8s的项目示例参考
ci/cd·kubernetes·gitlab
cuijiecheng20184 天前
GitLab创建项目
gitlab
_运维那些事儿5 天前
GitLabCI/CD语法
linux·服务器·git·ci/cd·gitlab·运维开发·devops