• Русский
  • Ошибка создания pod из-за ошибки конфигурации при использовании пользовательских образов в Tekton

    Описание проблемы

    В pipeline Tekton использование образов, предоставляемых продуктом, работает корректно, но при использовании пользовательских образов может возникать ошибка выполнения TaskRun.

    Проявление ошибки

    1. Выполнение TaskRun завершается с состоянием False, а причиной является CreateContainerConfigError:

      $ kubectl get taskruns -n ${namespace} ${taskrun_name}
      NAME                     SUCCEEDED   REASON                       STARTTIME   COMPLETIONTIME
      hello-c7pnj-run-script   False       CreateContainerConfigError   9m43s
    2. В событии TaskRun отображается сообщение об ошибке:

      Failed: Failed to create pod due to config error
    3. В соответствующих событиях pod отображается сообщение об ошибке:

      Failed: Error: container's runAsUser breaks non-root policy

    Анализ причины

    Подобные проблемы обычно вызваны двумя причинами:

    1. Сам образ содержит ошибки.
    2. Образ несовместим с конфигурацией Task.

    Устранение неполадок

    Если проблема возникает только при использовании пользовательских образов, рекомендуется выполнить следующие шаги для диагностики:

    1. Проверить, есть ли проблемы с самим образом:

      $ podman run -it --rm ${registry} ${cmd}
    2. Проверить совместимость конфигурации Task с образом:

      • Проверить, настроен ли Task с параметром runAsNonRoot: true.
      • Проверить, является ли пользователь по умолчанию в образе root или нечисловым пользователем.

    Пример конфигурации Task:

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: foo
    spec:
      steps:
        - name: bar
          securityContext:
            runAsNonRoot: true

    Пример конфигурации Containerfile:

    USER root

    Решение

    Вариант 1: Настроить сборку образа так, чтобы пользователь по умолчанию был не root

    Требования

    • Среда и права для пересборки образа.

    Шаги

    Обратитесь к Adjust Containerfile for Task-Compatible Custom Images для изменения конфигурации Containerfile.

    Вариант 2: Изменить конфигурацию выполнения TaskRun или PipelineRun

    Требования

    • Права на изменение TaskRun или PipelineRun.

    Шаги

    1. Добавить конфигурацию при отдельном запуске TaskRun:

      apiVersion: tekton.dev/v1
      kind: TaskRun
      metadata:
        name: foo
      spec:
        taskRef:
          name: foo
        podTemplate:
          securityContext:
            runAsUser: 65532
    2. Добавить конфигурацию при запуске PipelineRun:

      # Способ 1: Добавить конфигурацию для всех Tasks
      apiVersion: tekton.dev/v1
      kind: PipelineRun
      spec:
        taskRunTemplate:
          podTemplate:
            securityContext:
              runAsUser: 65532
      
      # Способ 2: Добавить конфигурацию для конкретных Tasks
      apiVersion: tekton.dev/v1
      kind: PipelineRun
      spec:
        taskRunSpecs:
          - pipelineTaskName: example-git-clone
            podTemplate:
              securityContext:
                runAsUser: 65532
                fsGroup: 65532

    Вариант 3: Изменить глобальную конфигурацию Tekton

    Требования

    • Права оператора кластера.
    • Права на изменение ресурса TektonConfig.
    • Внимание: эта конфигурация повлияет на все Tasks.

    Шаги

    1. Изменить ресурс TektonConfig: Увеличить конфигурацию spec.pipeline.default-pod-template следующим образом:

      apiVersion: config.tekton.dev/v1beta1
      kind: TektonConfig
      metadata:
        name: config
      spec:
        pipeline:
          default-pod-template: |
            securityContext:
              runAsUser: 65532
    2. Проверить, применена ли конфигурация:

      $ kubectl get configmap -n tekton-pipelines config-defaults -o yaml | grep 'default-pod-template: |' -A2
      
      # Ожидаемый вывод
      default-pod-template: |
        securityContext:
          runAsUser: 65532

    Вариант 4: Изменить определение Task

    Требования

    • Права на изменение Task.
    • Внимание: эта конфигурация повлияет на все TaskRun или PipelineRun, использующие этот Task.

    Шаги

    1. Способ 1: Удалить конфигурацию runAsNonRoot:

      apiVersion: tekton.dev/v1
      kind: Task
      metadata:
        name: foo
      spec:
        steps:
          - name: bar
            securityContext:
              # runAsNonRoot: true
    2. Способ 2: Добавить конфигурацию runAsUser:

      apiVersion: tekton.dev/v1
      kind: Task
      metadata:
        name: foo
      spec:
        steps:
          - name: bar
            securityContext:
              runAsNonRoot: true
              runAsUser: 65532

    Предотвращение ошибок

    1. Сборка образов

      • Предпочтительно использовать не root-пользователей при сборке образов.
      • Последовательно использовать UID 65532 как не root-пользователя.
      • Убедиться, что приложение может нормально работать под не root-пользователем.
    2. Конфигурация Task

      • Решать, включать ли runAsNonRoot в зависимости от требований безопасности.
      • При необходимости настраивать runAsUser соответствующим образом.
    3. Управление правами

      • Следовать принципу наименьших привилегий.
      • Планировать права доступа к каталогам заранее.
      • Регулярно пересматривать настройки прав.

    Связанный контент