×

OpenShift Pipelines 启动的 Pod 的默认服务帐户是 `pipeline`。与 `pipeline` 服务帐户关联的安全上下文约束 (SCC) 是 `pipelines-scc`。`pipelines-scc` SCC 基于 `anyuid` SCC,其细微差别如下面的 YAML 规范中所定义。

示例 `pipelines-scc.yaml` 代码段
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
# ...
allowedCapabilities:
  - SETFCAP
# ...
fsGroup:
  type: MustRunAs
# ...

此外,作为 OpenShift Pipelines 的一部分提供的 `Buildah` 任务使用 `vfs` 作为默认存储驱动程序。

您可以配置 OpenShift Pipelines 为管道运行和任务运行创建的 Pod 的安全上下文。您可以进行以下更改:

  • 更改所有 Pod 的默认和最大 SCC

  • 更改为特定命名空间中创建的管道运行和任务运行的 Pod 的默认 SCC

  • 配置特定管道运行或任务运行以使用自定义 SCC 和服务帐户

运行 `buildah` 以确保所有镜像都能构建的最简单方法是在具有 `privileged` SCC 的 Pod 中以 root 用户身份运行它。有关使用更严格的安全设置运行 `buildah` 的说明,请参见 以非 root 用户身份构建容器镜像

配置 OpenShift Pipelines 创建的 Pod 的默认和最大 SCC

您可以为 OpenShift Pipelines 为任务运行和管道运行创建的所有 Pod 配置默认安全上下文约束 (SCC)。您还可以配置最大 SCC,这是可以在任何命名空间中为这些 Pod 配置的限制最小的 SCC。

步骤
  • 通过输入以下命令来编辑 `TektonConfig` 自定义资源 (CR):

    $ oc edit TektonConfig config

    在规范中设置默认和最大 SCC,如下例所示:

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonConfig
    metadata:
      name: config
    spec:
    #  ...
      platforms:
        openshift:
          scc:
            default: "restricted-v2" (1)
            maxAllowed: "privileged" (2)
    1 spec.platforms.openshift.scc.default 指定 OpenShift Pipelines 附加到用于工作负载的服务帐户 (SA) 的默认 SCC,默认情况下为 pipeline SA。此 SCC 用于所有 pipeline run 和 task run pod。
    2 spec.platforms.openshift.scc.maxAllowed 指定您可以为任何命名空间中的 pipeline run 和 task run pod 配置的限制最少的 SCC。当您在特定的 pipeline run 或 task run 中配置自定义 SA 和 SCC 时,此设置不适用。

配置命名空间中 pod 的 SCC

您可以为 OpenShift Pipelines 为您在特定命名空间中创建的 pipeline run 和 task run 创建的所有 pod 配置安全上下文约束 (SCC)。此 SCC 的限制不能小于您使用 TektonConfig CR 在 spec.platforms.openshift.scc.maxAllowed 说明中配置的最大 SCC。

步骤
  • 为命名空间设置 operator.tekton.dev/scc 注解,其值为 SCC 的名称。

    配置 OpenShift Pipelines pod 的 SCC 的示例命名空间注解
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test-namespace
      annotations:
        operator.tekton.dev/scc: nonroot

使用自定义 SCC 和自定义服务帐户运行 pipeline run 和 task run

当使用与默认 pipelines 服务帐户关联的 pipelines-scc 安全上下文约束 (SCC) 时,pipeline run 和 task run pod 可能会遇到超时。这是因为在默认的 pipelines-scc SCC 中,fsGroup.type 参数设置为 MustRunAs

有关 pod 超时的更多信息,请参阅 BZ#1995779

为了避免 pod 超时,您可以创建一个自定义 SCC,并将 fsGroup.type 参数设置为 RunAsAny,并将其与自定义服务帐户关联。

最佳实践是为 pipeline run 和 task run 使用自定义 SCC 和自定义服务帐户。这种方法允许更大的灵活性,并且在升级期间修改默认值时不会中断运行。

步骤
  1. 定义一个将 fsGroup.type 参数设置为 RunAsAny 的自定义 SCC

    示例:自定义 SCC
    apiVersion: security.openshift.io/v1
    kind: SecurityContextConstraints
    metadata:
      annotations:
        kubernetes.io/description: my-scc is a close replica of anyuid scc. pipelines-scc has fsGroup - RunAsAny.
      name: my-scc
    allowHostDirVolumePlugin: false
    allowHostIPC: false
    allowHostNetwork: false
    allowHostPID: false
    allowHostPorts: false
    allowPrivilegeEscalation: true
    allowPrivilegedContainer: false
    allowedCapabilities: null
    defaultAddCapabilities: null
    fsGroup:
      type: RunAsAny
    groups:
    - system:cluster-admins
    priority: 10
    readOnlyRootFilesystem: false
    requiredDropCapabilities:
    - MKNOD
    runAsUser:
      type: RunAsAny
    seLinuxContext:
      type: MustRunAs
    supplementalGroups:
      type: RunAsAny
    volumes:
    - configMap
    - downwardAPI
    - emptyDir
    - persistentVolumeClaim
    - projected
    - secret
  2. 创建自定义 SCC

    示例:创建 my-scc SCC
    $ oc create -f my-scc.yaml
  3. 创建一个自定义服务帐户

    示例:创建一个 fsgroup-runasany 服务帐户
    $ oc create serviceaccount fsgroup-runasany
  4. 将自定义 SCC 与自定义服务帐户关联

    示例:将 my-scc SCC 与 fsgroup-runasany 服务帐户关联
    $ oc adm policy add-scc-to-user my-scc -z fsgroup-runasany

    如果要将自定义服务帐户用于特权任务,则可以通过运行以下命令将 privileged SCC 与自定义服务帐户关联

    示例:将 privileged SCC 与 fsgroup-runasany 服务帐户关联
    $ oc adm policy add-scc-to-user privileged -z fsgroup-runasany
  5. 在 pipeline run 和 task run 中使用自定义服务帐户

    示例:包含 fsgroup-runasany 自定义服务帐户的 pipeline run YAML
    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      name: <pipeline-run-name>
    spec:
      pipelineRef:
        name: <pipeline-cluster-task-name>
      taskRunTemplate:
        serviceAccountName: 'fsgroup-runasany'
    示例:包含 fsgroup-runasany 自定义服务帐户的 task run YAML
    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: <task-run-name>
    spec:
      taskRef:
        name: <cluster-task-name>
      taskRunTemplate:
        serviceAccountName: 'fsgroup-runasany'