검색

9.2. 이미지 레지스트리 설정 구성

download PDF

image.config.openshift.io/cluster 사용자 지정 리소스 (CR)를 편집하여 이미지 레지스트리 설정을 구성할 수 있습니다. 레지스트리 변경 사항이 image.config.openshift.io/cluster CR에 적용되는 경우 MCO(Machine Config Operator)는 다음과 같은 순차적 작업을 수행합니다.

  1. 노드 차단
  2. CRI-O를 다시 시작하여 변경 사항 적용
  3. 노드 차단 해제

    참고

    MCO는 변경 사항을 감지하면 노드를 재시작하지 않습니다.

절차

  1. 다음과 같이 project.config.openshift.io/cluster 사용자 정의 리소스를 편집합니다.

    $ oc edit image.config.openshift.io/cluster

    다음은 image.config.openshift.io/cluster CR의 예입니다.

    apiVersion: config.openshift.io/v1
    kind: Image 1
    metadata:
      annotations:
        release.openshift.io/create-only: "true"
      creationTimestamp: "2019-05-17T13:44:26Z"
      generation: 1
      name: cluster
      resourceVersion: "8302"
      selfLink: /apis/config.openshift.io/v1/images/cluster
      uid: e34555da-78a9-11e9-b92b-06d6c7da38dc
    spec:
      allowedRegistriesForImport: 2
        - domainName: quay.io
          insecure: false
      additionalTrustedCA: 3
        name: myconfigmap
      registrySources: 4
        allowedRegistries:
        - example.com
        - quay.io
        - registry.redhat.io
        - image-registry.openshift-image-registry.svc:5000
        - reg1.io/myrepo/myapp:latest
        insecureRegistries:
        - insecure.com
    status:
      internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
    1
    Image: 이미지 처리 방법에 대한 클러스터 전체 정보가 들어 있습니다. 유일하게 유효한 정식 이름은 cluster입니다.
    2
    allowedRegistriesForImport: 일반 사용자가 이미지를 가져올 수 있는 컨테이너 이미지 레지스트리를 제한합니다. 이 목록은 유효한 이미지를 포함한다고 신뢰할 수 있으며 애플리케이션을 가져올 수 있도록 하려는 레지스트리로 설정합니다. 이미지를 생성할 권한이 있는 사용자 또는 API의 ImageStreamMappings는 이 정책의 영향을 받지 않습니다. 일반적으로 클러스터 관리자에게만 적절한 권한이 있습니다.
    3
    additionalTrustedCA: 이미지 스트림 가져오기, pod 이미지 가져오기, openshift-image-registry 풀스루 및 빌드 중에 신뢰해야 하는 추가 CA (인증 기관)가 포함된 구성 맵에 대한 참조입니다. 이 구성 맵의 네임스페이스는 openshift-config입니다. 구성 맵 형식에서는 신뢰할 추가 레지스트리 CA마다 레지스트리 호스트 이름을 키로 사용하고 PEM 인증서를 값으로 사용합니다.
    4
    registrySources: 빌드 및 pod 이미지에 액세스할 때 컨테이너 런타임에서 개별 레지스트리를 허용하는지 여부를 결정하는 구성이 포함되어 있습니다. allowedRegistries 매개변수 또는 blockedRegistries 매개변수 중 하나를 설정할 수 있지만 둘 다 설정할 수는 없습니다. 이미지 단축 이름을 사용하는 레지스트리를 허용하는 비보안 레지스트리 또는 레지스트리에 대한 액세스를 허용할지 여부를 정의할 수도 있습니다. 이 예에서는 사용할 수 있는 레지스트리를 정의하는 allowedRegistries 매개변수를 사용합니다. 비보안 레지스트리 insecure.com 도 허용됩니다. registrySources 매개변수에 내부 클러스터 레지스트리에 대한 구성이 포함되어 있지 않습니다.
    참고

    allowedRegistries 매개변수가 정의되면 명시적으로 나열되지 않은 경우 registry.redhat.io 및 quay.io 레지스트리 및 기본 OpenShift 이미지 레지스트리를 포함한 모든 레지스트리가 차단됩니다. 이 매개변수를 사용하는 경우 Pod 실패를 방지하기 위해 환경의 페이로드 이미지에서 필요한 registry.redhat.ioquay.io 레지스트리와 internalRegistryHostnameallowedRegistries 목록에 추가해야 합니다. registry.redhat.ioquay.io 레지스트리를 blockedRegistries 목록에 추가하지 마십시오.

    allowedRegistries, blockedRegistries 또는 insecureRegistries 매개변수를 사용하는 경우 레지스트리 내에서 개별 리포지토리를 지정할 수 있습니다. 예: reg1.io/myrepo/myapp:latest.

    가능한 보안 위험을 줄이려면 안전하지 않은 외부 레지스트리의 사용을 피해야합니다.

  2. 변경 사항이 적용되었는지 확인하려면 노드를 나열합니다.

    $ oc get nodes

    출력 예

    NAME                                         STATUS                     ROLES                  AGE   VERSION
    ip-10-0-137-182.us-east-2.compute.internal   Ready,SchedulingDisabled   worker                 65m   v1.25.4+77bec7a
    ip-10-0-139-120.us-east-2.compute.internal   Ready,SchedulingDisabled   control-plane          74m   v1.25.4+77bec7a
    ip-10-0-176-102.us-east-2.compute.internal   Ready                      control-plane          75m   v1.25.4+77bec7a
    ip-10-0-188-96.us-east-2.compute.internal    Ready                      worker                 65m   v1.25.4+77bec7a
    ip-10-0-200-59.us-east-2.compute.internal    Ready                      worker                 63m   v1.25.4+77bec7a
    ip-10-0-223-123.us-east-2.compute.internal   Ready                      control-plane          73m   v1.25.4+77bec7a

9.2.1. 특정 레지스트리 추가

image.config.openshift.io/cluster 사용자 정의 리소스(CR)를 편집하여 이미지 가져오기 및 푸시 작업에 허용되는 레지스트리 목록을 추가할 수 있습니다. OpenShift Container Platform은 이 CR에 대한 변경 사항을 클러스터의 모든 노드에 적용합니다.

이미지를 풀하거나 푸시할 때 컨테이너 런타임은 image.config.openshift.io/cluster CR에서 registrySources 매개변수 아래에 나열된 레지스트리를 검색합니다. allowedRegistries 매개변수 아래에 레지스트리 목록을 생성한 경우 컨테이너 런타임은 해당 레지스트리만 검색합니다. 목록에 없는 레지스트리는 차단됩니다.

주의

allowedRegistries 매개변수가 정의되면 명시적으로 나열되지 않은 경우 registry.redhat.ioquay.io 레지스트리 및 기본 OpenShift 이미지 레지스트리를 포함한 모든 레지스트리가 차단됩니다. 이 매개변수를 사용하는 경우 Pod 실패를 방지하기 위해 사용자 환경의 페이로드 이미지에서 필요한 registry.redhat.ioquay.io 레지스트리와 internalRegistryHostnameallowedRegistries 목록에 추가합니다. 연결 해제된 클러스터의 경우 미러 레지스트리도 추가해야 합니다.

절차

  1. 다음과 같이 project.config.openshift.io/cluster CR을 편집합니다.

    $ oc edit image.config.openshift.io/cluster

    다음은 허용 목록을 포함한 image.config.openshift.io/cluster CR의 예입니다.

    apiVersion: config.openshift.io/v1
    kind: Image
    metadata:
      annotations:
        release.openshift.io/create-only: "true"
      creationTimestamp: "2019-05-17T13:44:26Z"
      generation: 1
      name: cluster
      resourceVersion: "8302"
      selfLink: /apis/config.openshift.io/v1/images/cluster
      uid: e34555da-78a9-11e9-b92b-06d6c7da38dc
    spec:
      registrySources: 1
        allowedRegistries: 2
        - example.com
        - quay.io
        - registry.redhat.io
        - reg1.io/myrepo/myapp:latest
        - image-registry.openshift-image-registry.svc:5000
    status:
      internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
    1
    빌드 및 pod 이미지에 액세스하는 경우 컨테이너 런타임에서 개별 레지스트리를 처리하는 방법을 결정할 구성이 포함되어 있습니다. 내부 클러스터 레지스트리에 대한 구성은 포함되어 있지 않습니다.
    2
    이미지 가져오기 및 푸시 작업에 사용할 레지스트리를 지정하고 선택적으로 해당 레지스트리의 리포지토리를 지정합니다. 다른 모든 레지스트리는 차단됩니다.
    참고

    allowedRegistries 매개변수 또는 blockedRegistries 매개변수 중 하나를 설정할 수 있지만 둘 다 설정할 수는 없습니다.

    MCO(Machine Config Operator)는 image.config.openshift.io/cluster 리소스를 통해 레지스트리에 대한 변경 사항을 확인합니다. MCO가 변경사항을 감지하면 노드를 비우고, 변경 사항을 적용한 다음 노드를 분리합니다. 노드가 Ready 상태가 되면 허용되는 레지스트리 목록을 사용하여 각 노드의 /etc/containers/policy.json 파일에서 이미지 서명 정책을 업데이트합니다.

검증

  • 다음 명령을 입력하여 노드 목록을 가져옵니다.

    $ oc get nodes

    출력 예

    NAME               STATUS   ROLES                  AGE   VERSION
    <node_name>        Ready    control-plane,master   37m   v1.27.8+4fab27b
    1. 다음 명령을 실행하여 노드에서 디버그 모드로 전환합니다.

      $ oc debug node/<node_name>
    2. 메시지가 표시되면 chroot /host 를 터미널에 입력합니다.

      sh-4.4# chroot /host
    3. 다음 명령을 입력하여 레지스트리가 정책 파일에 추가되었는지 확인합니다.

      sh-5.1# cat /etc/containers/policy.json | jq '.'

      다음 정책은 example.com, quay.io 및 registry.redhat.io 레지스트리의 이미지만 이미지 풀 및 푸시할 수 있음을 나타냅니다.

      예 9.1. 이미지 서명 정책 파일 예

      {
         "default":[
            {
               "type":"reject"
            }
         ],
         "transports":{
            "atomic":{
               "example.com":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "image-registry.openshift-image-registry.svc:5000":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "insecure.com":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "quay.io":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "reg4.io/myrepo/myapp:latest":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "registry.redhat.io":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ]
            },
            "docker":{
               "example.com":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "image-registry.openshift-image-registry.svc:5000":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "insecure.com":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "quay.io":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "reg4.io/myrepo/myapp:latest":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ],
               "registry.redhat.io":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ]
            },
            "docker-daemon":{
               "":[
                  {
                     "type":"insecureAcceptAnything"
                  }
               ]
            }
         }
      }
참고

클러스터에서 registrySources.insecureRegistries 매개변수를 사용하는 경우 비보안 레지스트리가 허용 목록에 포함되어 있는지 확인합니다.

예를 들면 다음과 같습니다.

spec:
  registrySources:
    insecureRegistries:
    - insecure.com
    allowedRegistries:
    - example.com
    - quay.io
    - registry.redhat.io
    - insecure.com
    - image-registry.openshift-image-registry.svc:5000

9.2.2. 특정 레지스트리 차단

image.config.openshift.io/cluster CR(사용자 정의 리소스)을 편집하여 레지스트리 내의 모든 레지스트리를 차단할 수 있습니다. OpenShift Container Platform은 이 CR에 대한 변경 사항을 클러스터의 모든 노드에 적용합니다.

이미지를 풀하거나 푸시할 때 컨테이너 런타임은 image.config.openshift.io/cluster CR에서 registrySources 매개변수 아래에 나열된 레지스트리를 검색합니다. blockedRegistries 매개변수 아래에 레지스트리 목록을 생성한 경우 컨테이너 런타임에서 해당 레지스트리를 검색하지 않습니다. 다른 모든 레지스트리는 허용됩니다.

주의

Pod 실패를 방지하려면 사용자 환경의 페이로드 이미지에서 필요한 registry.redhat.ioquay.io 레지스트리를 blockedRegistries 목록에 추가하지 마십시오.

절차

  1. 다음과 같이 project.config.openshift.io/cluster CR을 편집합니다.

    $ oc edit image.config.openshift.io/cluster

    다음은 차단 목록이 포함된 image.config.openshift.io/cluster 리소스의 예입니다.

    apiVersion: config.openshift.io/v1
    kind: Image
    metadata:
      annotations:
        release.openshift.io/create-only: "true"
      creationTimestamp: "2019-05-17T13:44:26Z"
      generation: 1
      name: cluster
      resourceVersion: "8302"
      selfLink: /apis/config.openshift.io/v1/images/cluster
      uid: e34555da-78a9-11e9-b92b-06d6c7da38dc
    spec:
      registrySources: 1
        blockedRegistries: 2
        - untrusted.com
        - reg1.io/myrepo/myapp:latest
    status:
      internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
    1
    빌드 및 pod 이미지에 액세스하는 경우 컨테이너 런타임에서 개별 레지스트리를 처리하는 방법을 결정할 구성이 포함되어 있습니다. 내부 클러스터 레지스트리에 대한 구성은 포함되어 있지 않습니다.
    2
    이미지 가져오기 및 푸시 작업에 사용해서는 안 되는 레지스트리를 지정하고 선택적으로 해당 레지스트리에서 리포지토리를 지정합니다. 다른 모든 레지스트리는 허용됩니다.
    참고

    blockedRegistries 레지스트리 또는 allowedRegistries 레지스트리 중 하나를 설정할 수 있지만 둘 다 설정할 수는 없습니다.

    MCO(Machine Config Operator)는 image.config.openshift.io/cluster 리소스를 통해 레지스트리에 대한 변경 사항을 확인합니다. MCO가 변경사항을 감지하면 노드를 비우고, 변경 사항을 적용한 다음 노드를 분리합니다. 노드가 Ready 상태가 되면 차단된 레지스트리에 대한 변경이 각 노드의 /etc/containers/registries.conf 파일에 표시됩니다.

검증

  • 다음 명령을 입력하여 노드 목록을 가져옵니다.

    $ oc get nodes

    출력 예

    NAME                STATUS   ROLES                  AGE   VERSION
    <node_name>         Ready    control-plane,master   37m   v1.27.8+4fab27b
    1. 다음 명령을 실행하여 노드에서 디버그 모드로 전환합니다.

      $ oc debug node/<node_name>
    2. 메시지가 표시되면 chroot /host 를 터미널에 입력합니다.

      sh-4.4# chroot /host
    3. 다음 명령을 입력하여 레지스트리가 정책 파일에 추가되었는지 확인합니다.

      sh-5.1# cat etc/containers/registries.conf

      다음 예에서는 untrusted.com 레지스트리의 이미지가 이미지 풀 및 푸시를 위해 비활성화되어 있음을 나타냅니다.

      출력 예

      unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
      
      [[registry]]
        prefix = ""
        location = "untrusted.com"
        blocked = true

9.2.2.1. 페이로드 레지스트리 차단

미러링 구성에서 ICSP( ImageContentSourcePolicy ) 오브젝트를 사용하여 연결이 끊긴 환경의 업스트림 페이로드 레지스트리를 차단할 수 있습니다. 다음 예제 절차에서는 quay.io/openshift- payload 페이로드 레지스트리를 차단하는 방법을 보여줍니다.

절차

  1. ICSP( ImageContentSourcePolicy ) 오브젝트를 사용하여 미러 구성을 생성하여 인스턴스의 레지스트리에 페이로드를 미러링합니다. 다음 예제 ICSP 파일은 internal-mirror.io/openshift-payload 를 미러링합니다.

    apiVersion: operator.openshift.io/v1alpha1
    kind: ImageContentSourcePolicy
    metadata:
      name: my-icsp
    spec:
      repositoryDigestMirrors:
      - mirrors:
        - internal-mirror.io/openshift-payload
        source: quay.io/openshift-payload
  2. 오브젝트가 노드에 배포된 후 /etc/containers/registries.conf 파일을 확인하여 미러 구성이 설정되었는지 확인합니다.

    출력 예

    [[registry]]
      prefix = ""
      location = "quay.io/openshift-payload"
      mirror-by-digest-only = true
    
    [[registry.mirror]]
      location = "internal-mirror.io/openshift-payload"

  3. 다음 명령을 사용하여 image.config.openshift.io 사용자 정의 리소스 파일을 편집합니다.

    $ oc edit image.config.openshift.io cluster
  4. 페이로드 레지스트리를 차단하려면 image.config.openshift.io 사용자 정의 리소스 파일에 다음 구성을 추가합니다.

    spec:
      registrySource:
        blockedRegistries:
         - quay.io/openshift-payload

검증

  • 노드에서 /etc/containers/registries.conf 파일을 확인하여 업스트림 페이로드 레지스트리가 차단되었는지 확인합니다.

    출력 예

    [[registry]]
      prefix = ""
      location = "quay.io/openshift-payload"
      blocked = true
      mirror-by-digest-only = true
    
    [[registry.mirror]]
      location = "internal-mirror.io/openshift-payload"

9.2.3. 안전하지 않은 레지스트리 허용

image.config.openshift.io/cluster 사용자 정의 리소스(CR)를 편집하여 비보안 레지스트리를 추가하거나 선택적으로 레지스트리 내에 개별 저장소를 추가할 수 있습니다. OpenShift Container Platform은 이 CR에 대한 변경 사항을 클러스터의 모든 노드에 적용합니다.

유효한 SSL 인증서를 사용하지 않거나 HTTPS 연결이 필요하지 않은 레지스트리는 안전하지 않은 레지스트리로 간주됩니다.

주의

가능한 보안 위험을 줄이려면 안전하지 않은 외부 레지스트리의 사용을 피해야합니다.

절차

  1. 다음과 같이 project.config.openshift.io/cluster CR을 편집합니다.

    $ oc edit image.config.openshift.io/cluster

    다음은 안전하지 않은 레지스트리 목록이있는 image.config.openshift.io/cluster CR의 예입니다.

    apiVersion: config.openshift.io/v1
    kind: Image
    metadata:
      annotations:
        release.openshift.io/create-only: "true"
      creationTimestamp: "2019-05-17T13:44:26Z"
      generation: 1
      name: cluster
      resourceVersion: "8302"
      selfLink: /apis/config.openshift.io/v1/images/cluster
      uid: e34555da-78a9-11e9-b92b-06d6c7da38dc
    spec:
      registrySources: 1
        insecureRegistries: 2
        - insecure.com
        - reg4.io/myrepo/myapp:latest
        allowedRegistries:
        - example.com
        - quay.io
        - registry.redhat.io
        - insecure.com 3
        - reg4.io/myrepo/myapp:latest
        - image-registry.openshift-image-registry.svc:5000
    status:
      internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
    1
    빌드 및 pod 이미지에 액세스하는 경우 컨테이너 런타임에서 개별 레지스트리를 처리하는 방법을 결정할 구성이 포함되어 있습니다. 내부 클러스터 레지스트리에 대한 구성은 포함되어 있지 않습니다.
    2
    안전하지 않은 레지스트리를 지정합니다. 해당 레지스트리에 리포지토리를 지정할 수 있습니다.
    3
    안전하지 않은 모든 레지스트리가 allowedRegistries 목록에 포함되어 있는지 확인합니다.
    참고

    allowedRegistries 매개변수가 정의되면 명시적으로 나열되지 않은 경우 registry.redhat.io 및 quay.io 레지스트리 및 기본 OpenShift 이미지 레지스트리를 포함한 모든 레지스트리가 차단됩니다. 이 매개변수를 사용하면 Pod 실패를 방지하기 위해 사용자 환경의 페이로드 이미지에서 필요한 registry.redhat.ioquay.io 레지스트리와 internalRegistryHostname 을 포함하여 모든 레지스트리를 allowedRegistries 목록에 추가합니다. 연결 해제된 클러스터의 경우 미러 레지스트리도 추가해야 합니다.

    MCO(Machine Config Operator)는 레지스트리에 대한 변경 사항이 있는지 image.config.openshift.io/clusterCR를 감시하고 변경 사항이 탐지되면 노드를 비우고 차단을 해제합니다. 노드가 Ready 상태가 되면 안전하지 않고 차단된 레지스트리에 대한 변경이 각 노드의 /etc/containers/registries.conf 파일에 표시됩니다.

검증

  • 레지스트리가 정책 파일에 추가되었는지 확인하려면 노드에서 다음 명령을 사용하십시오.

    $ cat /etc/containers/registries.conf

    다음 예는 insecure.com 레지스트리의 이미지가 안전하지 않으며, 이미지 풀 및 푸시가 허용된다는 것을 나타냅니다.

    출력 예

    unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
    
    [[registry]]
      prefix = ""
      location = "insecure.com"
      insecure = true

9.2.4. 이미지의 단축 이름을 허용하는 레지스트리 추가

image.config.openshift.io/cluster 사용자 정의 리소스(CR)를 편집하여 이미지의 단축 이름을 검색하기 위해 레지스트리를 추가할 수 있습니다. OpenShift Container Platform은 이 CR에 대한 변경 사항을 클러스터의 모든 노드에 적용합니다.

이미지 단축 이름을 사용하면 가져오기 사양에 정규화된 도메인 이름을 포함하지 않고도 이미지를 검색할 수 있습니다. 예를 들어 registry.access.redhat.com/rhe7/etcd 대신 rhel7/etcd를 사용할 수 있습니다.

전체 경로를 사용하지 않는 경우 단축 이름을 사용할 수 있습니다. 예를 들어, 클러스터가 DNS가 자주 변경되는 여러 내부 레지스트리를 참조하는 경우 각 변경에 따라 풀 사양에서 정규화된 도메인 이름을 업데이트해야 합니다. 이 경우 이미지 단축 이름을 사용하는 것이 유용할 수 있습니다.

이미지를 풀하거나 푸시할 때 컨테이너 런타임은 image.config.openshift.io/cluster CR에서 registrySources 매개변수 아래에 나열된 레지스트리를 검색합니다. containerRuntimeSearchRegistries 매개변수 아래에 레지스트리 목록을 생성한 경우, 단축 이름으로 이미지를 가져오면 컨테이너 런타임에서 해당 레지스트리를 검색합니다.

주의

공용 레지스트리에 인증이 필요한 경우 이미지가 배포되지 않을 수 있으므로 공용 레지스트리에서 이미지 단축 이름을 사용하는 것이 좋습니다. 공용 레지스트리와 함께 정규화된 이미지 이름을 사용합니다.

Red Hat 내부 또는 개인 레지스트리는 일반적으로 이미지의 단축 이름을 사용할 수 있습니다.

containerRuntimeSearchRegistries 매개변수( registry.redhat.io,docker.ioquay.io 레지스트리 포함) 아래에 공용 레지스트리를 나열하는 경우 목록의 모든 레지스트리에 인증 정보를 노출하고 네트워크 및 레지스트리 공격이 발생할 위험이 있습니다. 글로벌 풀 시크릿에 정의된 대로 이미지를 가져오기 위해 하나의 풀 시크릿만 있을 수 있으므로 해당 시크릿은 해당 목록의 모든 레지스트리에 대해 인증하는 데 사용됩니다. 따라서 목록에 공용 레지스트리를 포함하는 경우 보안 위험이 발생합니다.

각 공개 레지스트리에 다른 인증 정보가 필요하고 클러스터에 글로벌 풀 시크릿의 공개 레지스트리가 나열되지 않는 경우 containerRuntimeSearchRegistries 매개변수 아래에 여러 개의 공용 레지스트리를 나열할 수 없습니다.

인증이 필요한 퍼블릭 레지스트리의 경우 레지스트리에 글로벌 풀 시크릿에 저장된 인증 정보가 있는 경우에만 이미지의 단축 이름을 사용할 수 있습니다.

MCO(Machine Config Operator)는 image.config.openshift.io/cluster 리소스를 통해 레지스트리에 대한 변경 사항을 확인합니다. MCO가 변경사항을 감지하면 노드를 비우고, 변경 사항을 적용한 다음 노드를 분리합니다. 노드가 Ready 상태가 된 후 containerRuntimeSearchRegistries 매개변수가 추가되면 MCO가 나열된 레지스트리를 사용하여 각 노드에 /etc/containers/registries.conf.d 디렉터리에 파일을 생성합니다. 파일은 /etc/containers/registries.conf 파일의 정규화되지 않은 검색 레지스트리 목록을 덮어씁니다. 정규화되지 않은 검색 레지스트리의 기본 목록으로 돌아갈 수 없습니다.

containerRuntimeSearchRegistries 매개변수는 Podman 및 CRI-O 컨테이너 엔진에서만 작동합니다. 목록의 레지스트리는 빌드 및 이미지 스트림에서 아닌 Pod 사양에서만 사용할 수 있습니다.

절차

  1. 다음과 같이 project.config.openshift.io/cluster CR을 편집합니다.

    $ oc edit image.config.openshift.io/cluster

    다음은 image.config.openshift.io/cluster CR의 예입니다.

    apiVersion: config.openshift.io/v1
    kind: Image
    metadata:
      annotations:
        release.openshift.io/create-only: "true"
      creationTimestamp: "2019-05-17T13:44:26Z"
      generation: 1
      name: cluster
      resourceVersion: "8302"
      selfLink: /apis/config.openshift.io/v1/images/cluster
      uid: e34555da-78a9-11e9-b92b-06d6c7da38dc
    spec:
      allowedRegistriesForImport:
        - domainName: quay.io
          insecure: false
      additionalTrustedCA:
        name: myconfigmap
      registrySources:
        containerRuntimeSearchRegistries: 1
        - reg1.io
        - reg2.io
        - reg3.io
        allowedRegistries: 2
        - example.com
        - quay.io
        - registry.redhat.io
        - reg1.io
        - reg2.io
        - reg3.io
        - image-registry.openshift-image-registry.svc:5000
    ...
    status:
      internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
    1
    이미지 단축 이름으로 사용할 레지스트리를 지정합니다. 가능한 보안 위험을 줄이기 위해 내부 또는 개인 레지스트리만 있는 이미지의 단축 이름을 사용해야 합니다.
    2
    containerRuntimeSearchRegistries에 나열된 모든 레지스트리가 allowedRegistries 목록에 포함되어 있는지 확인합니다.
    참고

    allowedRegistries 매개변수가 정의되면 명시적으로 나열되지 않은 경우 registry.redhat.ioquay.io 레지스트리 및 기본 OpenShift 이미지 레지스트리를 포함한 모든 레지스트리가 차단됩니다. 이 매개변수를 사용하는 경우 Pod 실패를 방지하기 위해 사용자 환경의 페이로드 이미지에서 필요한 registry.redhat.ioquay.io 레지스트리와 internalRegistryHostnameallowedRegistries 목록에 포함한 모든 레지스트리를 추가합니다. 연결 해제된 클러스터의 경우 미러 레지스트리도 추가해야 합니다.

검증

  • 다음 명령을 입력하여 노드 목록을 가져옵니다.

    $ oc get nodes

    출력 예

    NAME                STATUS   ROLES                  AGE   VERSION
    <node_name>         Ready    control-plane,master   37m   v1.27.8+4fab27b
    1. 다음 명령을 실행하여 노드에서 디버그 모드로 전환합니다.

      $ oc debug node/<node_name>
    2. 메시지가 표시되면 chroot /host 를 터미널에 입력합니다.

      sh-4.4# chroot /host
    3. 다음 명령을 입력하여 레지스트리가 정책 파일에 추가되었는지 확인합니다.

      sh-5.1# cat /etc/containers/registries.conf.d/01-image-searchRegistries.conf

      출력 예

      unqualified-search-registries = ['reg1.io', 'reg2.io', 'reg3.io']

9.2.5. 이미지 레지스트리 액세스를 위한 추가 신뢰 저장소 구성

image.config.openshift.io/cluster 사용자 지정 리소스에는 이미지 레지스트리 액세스 중에 신뢰할 수 있는 추가 인증 기관이 포함된 구성 맵에 대한 참조가 포함될 수 있습니다.

사전 요구 사항

  • 인증 기관(CA)은 PEM으로 인코딩되어야 합니다.

절차

openshift-config 네임 스페이스에 구성 맵을 만들고 image.config.openshift.io 사용자 지정 리소스에서 AdditionalTrustedCA의 해당 이름을 사용하여 외부 레지스트리에 연결할 때 신뢰할 수있는 추가 CA를 제공할 수 있습니다.

구성 맵 키는 이 CA가 신뢰할 수있는 포트가 있는 레지스트리의 호스트 이름이며 PEM 인증서 콘텐츠는 신뢰할 수 있는 각 추가 레지스트리 CA의 값입니다.

이미지 레지스트리 CA 구성 맵의 예

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-registry-ca
data:
  registry.example.com: |
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
  registry-with-port.example.com..5000: | 1
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----

1
레지스트리에 registry-with-port.example.com:5000 같은 포트가 있는 경우 :..로 교체되어야 합니다.

다음 절차에 따라 추가 CA를 구성할 수 있습니다.

  1. 추가 CA를 구성하려면 다음을 실행합니다.

    $ oc create configmap registry-config --from-file=<external_registry_address>=ca.crt -n openshift-config
    $ oc edit image.config.openshift.io cluster
    spec:
      additionalTrustedCA:
        name: registry-config

9.2.6. 이미지 레지스트리 저장소 미러링 설정

컨테이너 레지스트리 저장소 미러링을 설정하면 다음을 수행할 수 있습니다.

  • 소스 이미지 레지스트리의 저장소에서 이미지를 가져오기 위해 요청을 리디렉션하고 미러링된 이미지 레지스트리의 저장소에서 이를 해석하도록 OpenShift Container Platform 클러스터를 설정합니다.
  • 하나의 미러가 다운된 경우 다른 미러를 사용할 수 있도록 각 대상 저장소에 대해 여러 미러링된 저장소를 확인합니다.

다음은 OpenShift Container Platform의 저장소 미러링의 몇 가지 속성입니다.

  • 이미지 풀은 레지스트리 다운타임에 탄력적으로 대처할 수 있습니다.
  • 연결이 끊긴 환경의 클러스터는 중요한 위치(예: quay.io)에서 이미지를 가져오고 회사 방화벽 뒤의 레지스트리에서 요청된 이미지를 제공하도록 할 수 있습니다.
  • 이미지 가져오기 요청이 있으면 특정한 레지스트리 순서로 가져오기를 시도하며 일반적으로 영구 레지스트리는 마지막으로 시도합니다.
  • 입력한 미러링 정보는 OpenShift Container Platform 클러스터의 모든 노드에서 /etc/containers/registries.conf 파일에 추가됩니다.
  • 노드가 소스 저장소에서 이미지를 요청하면 요청된 컨텐츠를 찾을 때 까지 미러링된 각 저장소를 차례로 시도합니다. 모든 미러가 실패하면 클러스터는 소스 저장소를 시도합니다. 성공하면 이미지를 노드로 가져올 수 있습니다.

저장소 미러링은 다음과 같은 방법으로 설정할 수 있습니다.

  • OpenShift Container Platform 설치 시

    OpenShift Container Platform에 필요한 컨테이너 이미지를 가져온 다음 해당 이미지를 회사 방화벽 뒤에 배치하면 연결이 끊긴 환경에 있는 데이터 센터에 OpenShift Container Platform을 설치할 수 있습니다.

  • OpenShift Container Platform 설치 후

    OpenShift Container Platform 설치 시 미러링을 설정하지 않고 ImageContentSourcePolicy 개체를 사용하여 나중에 설정할 수 있습니다.

다음 절차에서는 다음을 식별하는 ImageContentSourcePolicy 오브젝트를 생성하는 사후 설치 미러 구성을 제공합니다.

  • 미러링하려는 컨테이너 이미지 저장소의 소스
  • 소스 저장소에서 요청된 컨텐츠를 제공하는 각 미러 저장소에 대한 개별 항목
참고

ImageContentSourcePolicy 개체가 있는 클러스터에 대한 글로벌 풀 시크릿만 구성할 수 있습니다. 프로젝트에 풀 시크릿을 추가할 수 없습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. 미러링된 저장소를 설정합니다.

    • Red Hat Quay Repository Mirroring에 설명된대로 Red Hat Quay를 사용하여 미러링된 저장소를 설정합니다. Red Hat Quay를 사용하면 한 저장소에서 다른 저장소로 이미지를 복사하고 시간이 지남에 따라 해당 저장소를 반복해서 자동으로 동기화할 수 있습니다.
    • skopeo와 같은 툴을 사용하여 소스 디렉토리에서 미러링된 저장소로 이미지를 수동으로 복사합니다.

      예를 들어, Red Hat Enterprise Linux(RHEL) 7 또는 RHEL 8 시스템에 skopeo RPM 패키지를 설치한 후 다음 예와 같이 skopeo 명령을 사용합니다.

      $ skopeo copy \
      docker://registry.access.redhat.com/ubi8/ubi-minimal@sha256:5cfbaf45ca96806917830c183e9f37df2e913b187adb32e89fd83fa455ebaa6 \
      docker://example.io/example/ubi-minimal

      이 예제에는 example.io라는 컨테이너 이미지 레지스트리가 있으며, registry.access.redhat.com에서 ubi8/ubi-minimal 이미지를 복사할 example이라는 이미지 저장소가 있습니다. 레지스트리를 생성한 후 OpenShift Container Platform 클러스터를 설정하여 소스 저장소의 요청을 미러링된 저장소로 리디렉션할 수 있습니다.

  2. OpenShift Container Platform 클러스터에 로그인합니다.
  3. ImageContentSourcePolicy 파일(예: registryrepomirror.yaml)을 생성하고 소스 및 미러를 특정 레지스트리 및 저장소 쌍과 이미지로 교체합니다.

    apiVersion: operator.openshift.io/v1alpha1
    kind: ImageContentSourcePolicy
    metadata:
      name: ubi8repo
    spec:
      repositoryDigestMirrors:
      - mirrors:
        - example.io/example/ubi-minimal 1
        - example.com/example/ubi-minimal 2
        source: registry.access.redhat.com/ubi8/ubi-minimal 3
      - mirrors:
        - mirror.example.com/redhat
        source: registry.redhat.io/openshift4 4
      - mirrors:
        - mirror.example.com
        source: registry.redhat.io 5
      - mirrors:
        - mirror.example.net/image
        source: registry.example.com/example/myimage 6
      - mirrors:
        - mirror.example.net
        source: registry.example.com/example 7
      - mirrors:
        - mirror.example.net/registry-example-com
        source: registry.example.com 8
    1
    이미지 레지스트리 및 저장소의 이름을 가리킵니다.
    2
    각 대상 저장소에 대해 여러 미러 리포지토리를 나타냅니다. 하나의 미러가 다운된 경우 대상 저장소에서 다른 미러를 사용할 수 있습니다.
    3
    미러링된 컨텐츠를 포함하는 레지스트리 및 저장소를 가리킵니다.
    4
    해당 네임스페이스의 이미지를 사용하도록 레지스트리 내에서 네임스페이스를 구성할 수 있습니다. 레지스트리 도메인을 소스로 사용하는 경우 ImageContentSourcePolicy 리소스가 레지스트리의 모든 리포지토리에 적용됩니다.
    5
    레지스트리 이름을 구성하면 ImageContentSourcePolicy 리소스가 소스 레지스트리에서 미러 레지스트리로 모든 리포지토리에 적용됩니다.
    6
    mirror.example.net/image@sha256:…​ 이미지를 가져옵니다.
    7
    미러 mirror.example.net/myimage@sha256:…​ 에서 소스 레지스트리 네임스페이스의 myimage 이미지를 가져옵니다.
    8
    미러 레지스트리 mirror.example.net/registry-example-com/example/myimage@sha256:…​ 에서 이미지 registry.example.com/example/myimage를 가져옵니다. ImageContentSourcePolicy 리소스는 소스 레지스트리에서 미러 레지스트리 mirror.example.net/registry-example-com 으로 모든 리포지토리에 적용됩니다.
  4. ImageContentSourcePolicy 개체를 생성합니다.

    $ oc create -f registryrepomirror.yaml

    ImageContentSourcePolicy 개체가 생성된 후 새 설정이 각 노드에 배포된 클러스터는 소스 저장소에 대한 요청에 미러링된 저장소를 사용하기 시작합니다.

  5. 미러링된 설정이 적용되었는지 확인하려면 노드 중 하나에서 다음을 수행하십시오.

    1. 노드를 나열합니다.

      $ oc get node

      출력 예

      NAME                           STATUS                     ROLES    AGE  VERSION
      ip-10-0-137-44.ec2.internal    Ready                      worker   7m   v1.25.0
      ip-10-0-138-148.ec2.internal   Ready                      master   11m  v1.25.0
      ip-10-0-139-122.ec2.internal   Ready                      master   11m  v1.25.0
      ip-10-0-147-35.ec2.internal    Ready                      worker   7m   v1.25.0
      ip-10-0-153-12.ec2.internal    Ready                      worker   7m   v1.25.0
      ip-10-0-154-10.ec2.internal    Ready                      master   11m  v1.25.0

      Imagecontentsourcepolicy 리소스는 노드를 재시작하지 않습니다.

    2. 디버깅 프로세스를 시작하고 노드에 액세스합니다.

      $ oc debug node/ip-10-0-147-35.ec2.internal

      출력 예

      Starting pod/ip-10-0-147-35ec2internal-debug ...
      To use host binaries, run `chroot /host`

    3. 루트 디렉토리를 /host 로 변경합니다.

      sh-4.2# chroot /host
    4. /etc/containers/registries.conf 파일을 체크하여 변경 사항이 적용되었는지 확인합니다.

      sh-4.2# cat /etc/containers/registries.conf

      출력 예

      unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
      short-name-mode = ""
      
      [[registry]]
        prefix = ""
        location = "registry.access.redhat.com/ubi8/ubi-minimal"
        mirror-by-digest-only = true
      
        [[registry.mirror]]
          location = "example.io/example/ubi-minimal"
      
        [[registry.mirror]]
          location = "example.com/example/ubi-minimal"
      
      [[registry]]
        prefix = ""
        location = "registry.example.com"
        mirror-by-digest-only = true
      
        [[registry.mirror]]
          location = "mirror.example.net/registry-example-com"
      
      [[registry]]
        prefix = ""
        location = "registry.example.com/example"
        mirror-by-digest-only = true
      
        [[registry.mirror]]
          location = "mirror.example.net"
      
      [[registry]]
        prefix = ""
        location = "registry.example.com/example/myimage"
        mirror-by-digest-only = true
      
        [[registry.mirror]]
          location = "mirror.example.net/image"
      
      [[registry]]
        prefix = ""
        location = "registry.redhat.io"
        mirror-by-digest-only = true
      
        [[registry.mirror]]
          location = "mirror.example.com"
      
      [[registry]]
        prefix = ""
        location = "registry.redhat.io/openshift4"
        mirror-by-digest-only = true
      
        [[registry.mirror]]
          location = "mirror.example.com/redhat"

    5. 소스의 이미지 다이제스트를 노드로 가져와 실제로 미러링에 의해 해결되는지 확인합니다. ImageContentSourcePolicy 개체는 이미지 태그가 아닌 이미지 다이제스트만 지원합니다.

      sh-4.2# podman pull --log-level=debug registry.access.redhat.com/ubi8/ubi-minimal@sha256:5cfbaf45ca96806917830c183e9f37df2e913b187adb32e89fd83fa455ebaa6

저장소 미러링 문제 해결

저장소 미러링 절차가 설명대로 작동하지 않는 경우 저장소 미러링 작동 방법에 대한 다음 정보를 사용하여 문제를 해결하십시오.

  • 가져온 이미지는 첫 번째 작동 미러를 사용하여 공급합니다.
  • 주요 레지스트리는 다른 미러가 작동하지 않는 경우에만 사용됩니다.
  • 시스템 컨텍스트에서 Insecure 플래그가 폴백으로 사용됩니다.
  • /etc/containers/registries.conf 파일 형식이 최근에 변경되었습니다. 현재 버전은 TOML 형식의 버전 2입니다.

추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.