2.10. 빌드에서 Red Hat 서브스크립션 사용

OpenShift Container Platform에서 권한이 있는 빌드를 실행하려면 다음 섹션을 사용합니다.

2.10.1. Red Hat Universal Base Image에 대한 이미지 스트림 태그 생성

빌드 내에서 Red Hat 서브스크립션을 사용하려면 UBI(Universal Base Image)를 참조하는 이미지 스트림 태그를 생성합니다.

클러스터의 모든 프로젝트에서 UBI를 사용할 수 있도록 하려면 openshift 네임스페이스에 이미지 스트림 태그를 추가합니다. 또는 UBI를 특정 프로젝트에서 사용할 수 있도록 하려면 해당 프로젝트에 이미지 스트림 태그를 추가합니다.

이미지 스트림 태그를 이러한 방식으로 사용할 때의 이점은 다른 사용자에게 가져오기 보안을 노출하지 않고 설치의 registry.redhat.io 자격 증명에 따라 UBI에 대한 액세스 권한을 부여할 수 있다는 점입니다. 이 방식은 각 개발자에게 각 프로젝트에서 registry.redhat.io 자격 증명을 사용하여 가져오기 보안을 설치하도록 요구하는 방식보다 편리합니다.

프로세스

  • openshift 네임스페이스에 ImageStreamTag를 생성하려면 모든 프로젝트의 개발자가 다음을 입력하면 됩니다.

    $ oc tag --source=docker registry.redhat.io/ubi8/ubi:latest ubi:latest -n openshift
    작은 정보

    또는 다음 YAML을 적용하여 openshift 네임스페이스에 ImageStreamTag 를 생성할 수 있습니다.

    apiVersion: image.openshift.io/v1
    kind: ImageStream
    metadata:
      name: ubi
      namespace: openshift
    spec:
      tags:
      - from:
          kind: DockerImage
          name: registry.redhat.io/ubi8/ubi:latest
        name: latest
        referencePolicy:
          type: Source
  • 단일 프로젝트에서 ImageStreamTag를 생성하려면 다음을 입력합니다.

    $ oc tag --source=docker registry.redhat.io/ubi8/ubi:latest ubi:latest
    작은 정보

    다음 YAML을 적용하여 단일 프로젝트에서 ImageStreamTag 를 생성할 수 있습니다.

    apiVersion: image.openshift.io/v1
    kind: ImageStream
    metadata:
      name: ubi
    spec:
      tags:
      - from:
          kind: DockerImage
          name: registry.redhat.io/ubi8/ubi:latest
        name: latest
        referencePolicy:
          type: Source

2.10.2. 서브스크립션 자격을 빌드 보안으로 추가

Red Hat 서브스크립션을 사용하여 콘텐츠를 설치하는 빌드에는 자격 키가 빌드 보안으로 포함되어야 합니다.

사전 요구 사항

서브스크립션을 통해 Red Hat 인타이틀먼트에 액세스할 수 있어야 합니다. 인타이틀먼트 보안은 Insights Operator에 의해 자동으로 생성됩니다.

작은 정보

RHEL(Red Hat Enterprise Linux) 7을 사용하여 인타이틀먼트 빌드를 수행하는 경우 yum 명령을 실행하기 전에 Dockerfile에 다음 지침이 있어야 합니다.

RUN rm /etc/rhsm-host

절차

  1. 빌드 구성의 Docker 전략에 빌드 볼륨으로 etc-pki-entitlement 보안을 추가합니다.

    strategy:
      dockerStrategy:
        from:
          kind: ImageStreamTag
          name: ubi:latest
        volumes:
        - name: etc-pki-entitlement
          mounts:
          - destinationPath: /etc/pki/entitlement
          source:
            type: Secret
            secret:
              secretName: etc-pki-entitlement

2.10.3. 서브스크립션 관리자를 사용한 빌드 실행

2.10.3.1. 서브스크립션 관리자를 사용하는 Docker 빌드

Docker 전략 빌드에서는 Subscription Manager를 사용하여 서브스크립션 콘텐츠를 설치할 수 있습니다.

사전 요구 사항

자격 키는 빌드 전략 볼륨으로 추가해야 합니다.

절차

다음을 예제 Dockerfile로 사용하여 서브스크립션 관리자를 통해 콘텐츠를 설치합니다.

FROM registry.redhat.io/ubi8/ubi:latest
RUN dnf search kernel-devel --showduplicates && \
        dnf install -y kernel-devel

2.10.4. Red Hat Satellite 서브스크립션을 사용하여 빌드 실행

2.10.4.1. 빌드에 Red Hat Satellite 구성 추가

Red Hat Satellite를 사용하여 콘텐츠를 설치하는 빌드에서는 Satellite 리포지토리에서 콘텐츠를 가져오기 위해 적절한 구성을 제공해야 합니다.

사전 요구 사항

  • Satellite 인스턴스에서 콘텐츠를 다운로드하는 yum 호환 리포지토리 구성 파일을 제공하거나 생성해야 합니다.

    리포지터리 구성 샘플

    [test-<name>]
    name=test-<number>
    baseurl = https://satellite.../content/dist/rhel/server/7/7Server/x86_64/os
    enabled=1
    gpgcheck=0
    sslverify=0
    sslclientkey = /etc/pki/entitlement/...-key.pem
    sslclientcert = /etc/pki/entitlement/....pem

절차

  1. Satellite 리포지토리 구성 파일이 포함된 ConfigMap을 생성합니다.

    $ oc create configmap yum-repos-d --from-file /path/to/satellite.repo
  2. Satellite 리포지토리 구성 및 인타이틀먼트 키를 빌드 볼륨으로 추가합니다.

    strategy:
      dockerStrategy:
        from:
          kind: ImageStreamTag
          name: ubi:latest
        volumes:
        - name: yum-repos-d
          mounts:
          - destinationPath: /etc/yum.repos.d
          source:
            type: ConfigMap
            configMap:
              name: yum-repos-d
        - name: etc-pki-entitlement
          mounts:
          - destinationPath: /etc/pki/entitlement
          source:
            type: Secret
            secret:
              secretName: etc-pki-entitlement

2.10.4.2. Red Hat Satellite 서브스크립션을 사용하는 Docker 빌드

Docker 전략 빌드에서는 Red Hat Satellite 리포지토리를 사용하여 서브스크립션 콘텐츠를 설치할 수 있습니다.

사전 요구 사항

  • 인타이틀먼트 키 및 Satellite 리포지토리 구성을 빌드 볼륨으로 추가했습니다.

절차

다음을 예제 Dockerfile로 사용하여 Satellite를 통해 콘텐츠를 설치합니다.

FROM registry.redhat.io/ubi8/ubi:latest
RUN dnf search kernel-devel --showduplicates && \
        dnf install -y kernel-devel

2.10.5. SharedSecret 오브젝트를 사용하여 권한이 있는 빌드 실행

다른 네임스페이스의 Secret 오브젝트에서 RHEL 인타이틀먼트를 안전하게 사용하는 하나의 네임스페이스에서 빌드를 구성하고 수행할 수 있습니다.

Build 오브젝트와 동일한 네임스페이스에서 서브스크립션 자격 증명으로 Secret 오브젝트를 생성하여 OpenShift 빌드의 RHEL 인타이틀먼트에 계속 액세스할 수 있습니다. 그러나 OpenShift Container Platform 4.10 이상에서는 OpenShift Container Platform 시스템 네임스페이스 중 하나에서 Secret 오브젝트에서 인증 정보 및 인증서에 액세스할 수 있습니다. Secret 오브젝트를 참조하는 SharedSecret CR(사용자 정의 리소스) 인스턴스의 CSI 볼륨 마운트를 사용하여 권한이 있는 빌드를 실행합니다.

이 절차에서는 OpenShift Container Platform 빌드에서 CSI 볼륨 마운트를 선언하는 데 사용할 수 있는 새로 도입된 Shared Resources CSI Driver 기능을 사용합니다. 또한 OpenShift Container Platform Insights Operator를 사용합니다.

중요

Shared Resources CSI Driver 및 Build CSI Volumes는 두 가지 기술 프리뷰 기능으로, Red Hat 제품 SLA(서비스 수준 계약)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

Shared Resources CSI Driver 및 Build CSI Volumes 기능은 현재 기술 프리뷰 기능의 하위 집합인 TechPreviewNoUpgrade 기능 세트에도 속합니다. 테스트 클러스터에서 TechPreviewNoUpgrade 기능 세트를 활성화하면 프로덕션 클러스터에서 기능을 비활성화한 상태에서 완전히 테스트할 수 있습니다. 이 기능 세트를 활성화하면 실행 취소할 수 없으며 마이너 버전 업데이트를 방지할 수 있습니다. 이 기능 세트는 프로덕션 클러스터에서는 권장되지 않습니다. 다음 "추가 리소스" 섹션의 "기능 게이트를 사용하여 기술 프리뷰 기능 활성화"를 참조하십시오.

사전 요구 사항

  • 기능 게이트를 사용하여 설정된 TechPreviewNoUpgrade 기능을 활성화했습니다.
  • Insights Operator가 서브스크립션 인증 정보를 저장하는 Secret 오브젝트를 참조하는 SharedSecret CR(사용자 정의 리소스) 인스턴스가 있습니다.
  • 다음 작업을 수행할 수 있는 권한이 있어야 합니다.

    • 빌드 구성을 생성하고 빌드를 시작합니다.
    • oc get sharedsecrets 명령을 입력하고 비어 있지 않은 목록을 다시 가져와서 사용할 수 있는 SharedSecret CR 인스턴스를 검색합니다.
    • 네임스페이스에서 사용할 수 있는 빌더 서비스 계정이 지정된 SharedSecret CR 인스턴스를 사용할 수 있는지 확인합니다. 즉, 특정 SharedSecret>을 사용할 수 있는 oc adm policy를 실행하여 네임스페이스의 빌더 서비스 계정이 나열되는지 확인할 수 있습니다.
참고

이 목록에 있는 마지막 두 사전 요구 사항이 모두 충족, 설정 또는 설정하도록 사용자에게 필요한 역할 기반 액세스 제어(RBAC)를 요청하여 SharedSecret CR 인스턴스를 검색하고 서비스 계정이 SharedSecret CR 인스턴스를 사용할 수 있도록 합니다.

절차

  1. YAML 콘텐츠와 함께 oc apply 를 사용하여 SharedSecret CR 인스턴스를 사용하도록 빌더 서비스 계정 RBAC 권한을 부여합니다.

    참고

    현재 kubectloc 는 Pod 보안을 중심으로 하는 역할에 use 동사를 제한하는 특수 케이스 논리를 하드 코딩했습니다. 따라서 oc create role …​ 을 사용하여 SharedSecret CR 인스턴스를 사용하는 데 필요한 역할을 생성할 수 없습니다.

    YAML Role 오브젝트 정의를 사용하는 oc apply -f 명령의 예

    $ oc apply -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: shared-resource-my-share
      namespace: my-namespace
    rules:
      - apiGroups:
          - sharedresource.openshift.io
        resources:
          - sharedsecrets
        resourceNames:
          - my-share
        verbs:
          - use
    EOF

  2. oc 명령을 사용하여 역할과 연결된 RoleBinding 을 만듭니다.

    oc create rolebinding 명령 예

    $ oc create rolebinding shared-resource-my-share --role=shared-resource-my-share --serviceaccount=my-namespace:builder

  3. RHEL 인타이틀먼트에 액세스하는 BuildConfig 오브젝트를 생성합니다.

    YAML BuildConfig 오브젝트 정의 예

    apiVersion: build.openshift.io/v1
    kind: BuildConfig
    metadata:
      name: my-csi-bc
      namespace: my-csi-app-namespace
    spec:
      runPolicy: Serial
      source:
        dockerfile: |
          FROM registry.redhat.io/ubi8/ubi:latest
          RUN ls -la /etc/pki/entitlement
          RUN rm /etc/rhsm-host
          RUN yum repolist --disablerepo=*
          RUN subscription-manager repos --enable rhocp-4.9-for-rhel-8-x86_64-rpms
          RUN yum -y update
          RUN yum install -y openshift-clients.x86_64
      strategy:
        type: Docker
        dockerStrategy:
          volumes:
            - mounts:
                - destinationPath: "/etc/pki/entitlement"
              name: my-csi-shared-secret
              source:
                csi:
                  driver: csi.sharedresource.openshift.io
                  readOnly: true
                  volumeAttributes:
                    sharedSecret: my-share-bc
                type: CSI

  4. BuildConfig 오브젝트에서 빌드를 시작하고 oc 명령으로 로그를 따릅니다.

    oc start-build 명령 예

    $ oc start-build my-csi-bc -F

    예 2.1. oc start-build 명령의 출력 예

    참고

    다음 출력의 일부 섹션이 …​로 교체되었습니다.

    build.build.openshift.io/my-csi-bc-1 started
    Caching blobs under "/var/cache/blobs".
    
    Pulling image registry.redhat.io/ubi8/ubi:latest ...
    Trying to pull registry.redhat.io/ubi8/ubi:latest...
    Getting image source signatures
    Copying blob sha256:5dcbdc60ea6b60326f98e2b49d6ebcb7771df4b70c6297ddf2d7dede6692df6e
    Copying blob sha256:8671113e1c57d3106acaef2383f9bbfe1c45a26eacb03ec82786a494e15956c3
    Copying config sha256:b81e86a2cb9a001916dc4697d7ed4777a60f757f0b8dcc2c4d8df42f2f7edb3a
    Writing manifest to image destination
    Storing signatures
    Adding transient rw bind mount for /run/secrets/rhsm
    STEP 1/9: FROM registry.redhat.io/ubi8/ubi:latest
    STEP 2/9: RUN ls -la /etc/pki/entitlement
    total 360
    drwxrwxrwt. 2 root root 	80 Feb  3 20:28 .
    drwxr-xr-x. 10 root root	154 Jan 27 15:53 ..
    -rw-r--r--. 1 root root   3243 Feb  3 20:28 entitlement-key.pem
    -rw-r--r--. 1 root root 362540 Feb  3 20:28 entitlement.pem
    time="2022-02-03T20:28:32Z" level=warning msg="Adding metacopy option, configured globally"
    --> 1ef7c6d8c1a
    STEP 3/9: RUN rm /etc/rhsm-host
    time="2022-02-03T20:28:33Z" level=warning msg="Adding metacopy option, configured globally"
    --> b1c61f88b39
    STEP 4/9: RUN yum repolist --disablerepo=*
    Updating Subscription Management repositories.
    
    
    ...
    
    --> b067f1d63eb
    STEP 5/9: RUN subscription-manager repos --enable rhocp-4.9-for-rhel-8-x86_64-rpms
    Repository 'rhocp-4.9-for-rhel-8-x86_64-rpms' is enabled for this system.
    time="2022-02-03T20:28:40Z" level=warning msg="Adding metacopy option, configured globally"
    --> 03927607ebd
    STEP 6/9: RUN yum -y update
    Updating Subscription Management repositories.
    
    ...
    
    Upgraded:
      systemd-239-51.el8_5.3.x86_64      	systemd-libs-239-51.el8_5.3.x86_64
      systemd-pam-239-51.el8_5.3.x86_64
    Installed:
      diffutils-3.6-6.el8.x86_64           	libxkbcommon-0.9.1-1.el8.x86_64
      xkeyboard-config-2.28-1.el8.noarch
    
    Complete!
    time="2022-02-03T20:29:05Z" level=warning msg="Adding metacopy option, configured globally"
    --> db57e92ff63
    STEP 7/9: RUN yum install -y openshift-clients.x86_64
    Updating Subscription Management repositories.
    
    ...
    
    Installed:
      bash-completion-1:2.7-5.el8.noarch
      libpkgconf-1.4.2-1.el8.x86_64
      openshift-clients-4.9.0-202201211735.p0.g3f16530.assembly.stream.el8.x86_64
      pkgconf-1.4.2-1.el8.x86_64
      pkgconf-m4-1.4.2-1.el8.noarch
      pkgconf-pkg-config-1.4.2-1.el8.x86_64
    
    Complete!
    time="2022-02-03T20:29:19Z" level=warning msg="Adding metacopy option, configured globally"
    --> 609507b059e
    STEP 8/9: ENV "OPENSHIFT_BUILD_NAME"="my-csi-bc-1" "OPENSHIFT_BUILD_NAMESPACE"="my-csi-app-namespace"
    --> cab2da3efc4
    STEP 9/9: LABEL "io.openshift.build.name"="my-csi-bc-1" "io.openshift.build.namespace"="my-csi-app-namespace"
    COMMIT temp.builder.openshift.io/my-csi-app-namespace/my-csi-bc-1:edfe12ca
    --> 821b582320b
    Successfully tagged temp.builder.openshift.io/my-csi-app-namespace/my-csi-bc-1:edfe12ca
    821b582320b41f1d7bab4001395133f86fa9cc99cc0b2b64c5a53f2b6750db91
    Build complete, no image push requested

2.10.6. 추가 리소스