• Русский
  • Не удалось создать 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 или нечисловым user ID.

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

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

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

    USER root

    Решение

    Вариант 1: Изменить конфигурацию сборки образа, чтобы пользователь по умолчанию был non-root

    Предварительные требования

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

    Шаги

    См. Настроить Containerfile для пользовательских образов, совместимых с Task, чтобы изменить конфигурацию 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:

      # Method 1: Add configuration for all Tasks
      apiVersion: tekton.dev/v1
      kind: PipelineRun
      spec:
        taskRunTemplate:
          podTemplate:
            securityContext:
              runAsUser: 65532
      
      # Method 2: Add configuration for specific 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
      
      # Expected output
      default-pod-template: |
        securityContext:
          runAsUser: 65532

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

    Предварительные требования

    • Разрешения на изменение Task.
    • Примечание: эта конфигурация повлияет на все TaskRuns или PipelineRuns, которые используют этот 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. Сборка образов

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

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

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

    Связанное содержимое