검색

클러스터 구성

download PDF
OpenShift Container Platform 3.11

OpenShift Container Platform 3.11 설치 및 구성

초록

OpenShift 설치 및 구성 항목은 사용자의 환경에서 OpenShift를 설치하고 구성하는 기본 사항을 다룹니다. OpenShift를 시작하고 실행하는 데 필요한 일회성 작업에 대해 이러한 주제를 사용하십시오.

1장. 개요

이 가이드에서는 설치 후 OpenShift Container Platform 클러스터에 사용할 수 있는 추가 구성 옵션에 대해 설명합니다.

2장. 레지스트리 설정

2.1. 내부 레지스트리 개요

2.1.1. 레지스트리 정보

OpenShift Container Platform은 소스 코드에서 컨테이너 이미지를 빌드하고 배포하며 라이프사이클을 관리할 수 있습니다. 이를 활성화하기 위해 OpenShift Container Platform은 OpenShift Container Platform 환경에 배포하여 이미지를 로컬로 관리할 수 있는 내부 통합 컨테이너 이미지 레지스트리 를 제공합니다.

2.1.2. 통합 또는 독립 실행형 레지스트리

전체 OpenShift Container Platform 클러스터를 처음 설치하는 동안 설치 프로세스 중에 레지스트리가 자동으로 배포되었을 수 있습니다. 레지스트리 구성이 없거나 레지스트리 구성을 추가로 사용자 지정하려면 기존 클러스터에 레지스트리 배포를 참조하십시오.

전체 OpenShift Container Platform 클러스터의 통합 일부로 실행하도록 배포할 수는 있지만 OpenShift Container Platform 레지스트리는 독립 실행형 컨테이너 이미지 레지스트리로 별도로 설치할 수 있습니다.

독립 실행형 레지스트리를 설치하려면 독립 실행형 레지스트리 설치를 따르십시오. 이 설치 경로는 레지스트리와 특수 웹 콘솔을 실행하는 올인원 클러스터를 배포합니다.

2.2. 기존 클러스터에 레지스트리 배포

2.2.1. 개요

OpenShift Container Platform 클러스터를 처음 설치하는 동안 통합 레지스트리가 자동으로 배포되지 않았거나 더 이상 성공적으로 실행되지 않고 기존 클러스터에 다시 배포해야 하는 경우 다음 섹션을 참조하십시오.

참고

독립 실행형 레지스트리 를 설치한 경우에는 이 주제가 필요하지 않습니다.

2.2.2. 레지스트리 호스트 이름 설정

레지스트리가 내부 및 외부 참조 모두에 대해 로 알려진 호스트 이름과 포트를 구성할 수 있습니다. 이렇게 하면 이미지 스트림은 이미지의 호스트 이름 기반 푸시 및 가져오기 사양을 제공하므로, 이미지 소비자가 레지스트리 서비스 IP의 변경 사항과 이미지 스트림과 참조를 이식할 수 있습니다.

클러스터 내에서 레지스트리를 참조하는 데 사용되는 호스트 이름을 설정하려면 마스터 구성 파일의 imagePolicyConfig 섹션에 internalRegistryHostname 을 설정합니다. 외부 호스트 이름은 동일한 위치에 externalRegistryHostname 값을 설정하여 제어됩니다.

이미지 정책 구성

imagePolicyConfig:
  internalRegistryHostname: docker-registry.default.svc.cluster.local:5000
  externalRegistryHostname: docker-registry.mycompany.com

레지스트리 자체는 동일한 내부 호스트 이름 값으로 구성해야 합니다. 이 작업은 레지스트리 배포 구성에서 REGISTRY_OPENSHIFT_SERVER_ADDR 환경 변수를 설정하거나 레지스트리 구성의 OpenShift 섹션에서 값을 설정하여 수행할 수 있습니다.

참고

레지스트리에 TLS를 활성화한 경우 서버 인증서에 레지스트리를 참조할 것으로 예상되는 호스트 이름이 포함되어야 합니다. 서버 인증서에 호스트 이름을 추가하는 방법은 레지스트리 보안을 참조하십시오.

2.2.3. 레지스트리 배포

통합 컨테이너 이미지 레지스트리를 배포하려면 클러스터 관리자 권한이 있는 사용자로 oc adm registry 명령을 사용합니다. 예를 들면 다음과 같습니다.

$ oc adm registry --config=/etc/origin/master/admin.kubeconfig \1
    --service-account=registry \2
    --images='registry.redhat.io/openshift3/ose-${component}:${version}' 3
1
--config클러스터 관리자의 CLI 구성 파일의 경로입니다.
2
--service-account 는 레지스트리의 포드를 실행하는 데 사용되는 서비스 계정입니다.
3
OpenShift Container Platform의 올바른 이미지를 가져오는 데 필요합니다. ${component}${version} 은 설치 중에 동적으로 교체됩니다.

그러면 docker-registry 라는 서비스와 배포 구성이 생성됩니다. 성공적으로 배포되면 docker-registry-1-cpty9 와 유사한 이름으로 포드가 생성됩니다.

레지스트리 생성 시 지정할 수 있는 전체 옵션 목록을 보려면 다음을 수행합니다.

$ oc adm registry --help

--fs-group 의 값은 레지스트리에서 사용하는 SCC에서 허용해야 합니다(일반적으로 restricted SCC).

2.2.4. 레지스트리를 DaemonSet으로 배포

oc adm registry 명령을 사용하여 --daemonset 옵션을 사용하여 레지스트리를 DaemonSet 으로 배포합니다.

DaemonSet은 노드가 생성될 때 지정된 Pod 복사본이 포함되어 있는지 확인합니다. 노드를 제거하면 Pod가 가비지 수집됩니다.

DaemonSet에 대한 자세한 내용은 Daemonsets 사용을 참조하십시오.

2.2.5. 레지스트리 컴퓨팅 리소스

기본적으로 레지스트리는 컴퓨팅 리소스 요청 또는 제한에 대한 설정 없이 생성됩니다. 프로덕션의 경우 레지스트리의 배포 구성을 업데이트하여 레지스트리의 리소스 요청 및 제한을 설정하는 것이 좋습니다. 그렇지 않으면 레지스트리 포드가 BestEffort 포드 로 간주됩니다.

요청 및 제한 구성에 대한 자세한 내용은 Compute Resources 를 참조하십시오.

2.2.6. 레지스트리 스토리지

레지스트리는 컨테이너 이미지와 메타데이터를 저장합니다. 레지스트리를 사용하여 포드를 배포하면 Pod가 종료되면 삭제된 임시 볼륨을 사용합니다. 누구나 레지스트리로 빌드 또는 푸시한 이미지가 사라집니다.

이 섹션에는 지원되는 레지스트리 스토리지 드라이버가 나열되어 있습니다. 자세한 내용은 컨테이너 이미지 레지스트리 설명서를 참조하십시오.

다음 목록에는 레지스트리의 구성 파일에서 구성해야 하는 스토리지 드라이버가 포함되어 있습니다.

일반 레지스트리 스토리지 구성 옵션이 지원됩니다. 자세한 내용은 컨테이너 이미지 레지스트리 설명서를 참조하십시오.

다음 스토리지 옵션은 파일 시스템 드라이버를 통해 구성해야 합니다.

참고

지원되는 영구 스토리지 드라이버에 대한 자세한 내용은 영구 스토리지 및 영구 스토리지 예제 구성을 참조하십시오.

2.2.6.1. 프로덕션 사용

프로덕션 용도 의 경우 원격 볼륨을 연결하거나 선택한 영구 스토리지 방법을 정의 및 사용합니다.

예를 들어 기존 영구 볼륨 클레임을 사용하려면 다음을 수행합니다.

$ oc set volume deploymentconfigs/docker-registry --add --name=registry-storage -t pvc \
     --claim-name=<pvc_name> --overwrite
중요

테스트 결과 RHEL NFS 서버를 컨테이너 이미지 레지스트리의 스토리지 백엔드로 사용하는 데 문제가 있는 것으로 표시됩니다. 여기에는 OpenShift Container Registry 및 Quay가 포함됩니다. 따라서 RHEL NFS 서버를 사용하여 핵심 서비스에서 사용하는 PV를 백업하는 것은 권장되지 않습니다.

마켓플레이스의 다른 NFS 구현에는 이러한 문제가 나타나지 않을 수 있습니다. 이러한 OpenShift 핵심 구성 요소에 대해 완료된 테스트에 대한 자세한 내용은 개별 NFS 구현 벤더에 문의하십시오.

2.2.6.1.1. Amazon S3을 스토리지 백엔드로 사용

내부 컨테이너 이미지 레지스트리와 함께 Amazon Simple Storage Service 스토리지를 사용하는 옵션도 있습니다. AWS 관리 콘솔을 통해 관리할 수 있는 보안 클라우드 스토리지입니다. 이를 사용하려면 레지스트리의 구성 파일을 수동으로 편집하여 레지스트리 포드에 마운트해야 합니다. 그러나 구성을 시작하기 전에 업스트림의 권장 단계를 확인합니다.

기본 YAML 구성 파일을 기본으로 사용하고 storage 섹션의 filesystem 항목을 다음과 같은 s3 항목으로 바꿉니다. 결과 스토리지 섹션은 다음과 같을 수 있습니다.

storage:
  cache:
    layerinfo: inmemory
  delete:
    enabled: true
  s3:
    accesskey: awsaccesskey 1
    secretkey: awssecretkey 2
    region: us-west-1
    regionendpoint: http://myobjects.local
    bucket: bucketname
    encrypt: true
    keyid: mykeyid
    secure: true
    v4auth: false
    chunksize: 5242880
    rootdirectory: /s3/object/name/prefix
1
을 Amazon 액세스 키로 바꿉니다.
2
을 Amazon 비밀 키로 바꿉니다.

모든 s3 구성 옵션은 업스트림 드라이버 참조 문서에 설명되어 있습니다.

레지스트리 구성을 재정의하면 구성 파일을 포드에 마운트하는 추가 단계를 거칩니다.

주의

레지스트리가 S3 스토리지 백엔드에서 실행되면 보고된 문제가 있습니다.

사용 중인 통합 레지스트리에서 지원하지 않는 S3 리전을 사용하려면 S3 드라이버 구성을 참조하십시오.

2.2.6.2. 비생산 사용

프로덕션 환경 이외의 용도의 경우 --mount-host=<path> 옵션을 사용하여 레지스트리에서 영구 스토리지에 사용할 디렉터리를 지정할 수 있습니다. 그런 다음 지정된 <path> 에 레지스트리 볼륨이 host-mount로 생성됩니다.

중요

mount -host 옵션은 레지스트리 컨테이너가 있는 노드의 디렉터리를 마운트합니다. docker-registry 배포 구성을 확장하는 경우 레지스트리 포드와 컨테이너가 서로 다른 노드에서 실행될 수 있으므로 각각 고유한 로컬 스토리지가 있는 두 개 이상의 레지스트리 컨테이너가 생성될 수 있습니다. 이로 인해 요청이 최종적으로 전달되는 컨테이너에 따라 동일한 이미지를 반복적으로 가져오는 요청이 항상 성공하지는 않을 수 있으므로 예측할 수 없는 동작이 발생합니다.

mount -host 옵션을 사용하려면 레지스트리 컨테이너를 권한 있는 모드로 실행해야 합니다. 이는 --mount-host 를 지정하면 자동으로 활성화됩니다. 그러나 일부 Pod가 기본적으로 권한 있는 컨테이너를 실행할 수 있는 것은 아닙니다. 이 옵션을 계속 사용하려면 레지스트리를 생성하고 설치 중에 생성된 레지스트리 서비스 계정을 사용하도록 지정합니다.

$ oc adm registry --service-account=registry \
    --config=/etc/origin/master/admin.kubeconfig \
    --images='registry.redhat.io/openshift3/ose-${component}:${version}' \ 1
    --mount-host=<path>
1
OpenShift Container Platform의 올바른 이미지를 가져오는 데 필요합니다. ${component}${version} 은 설치 중에 동적으로 교체됩니다.
중요

컨테이너 이미지 레지스트리 포드는 사용자 1001 로 실행됩니다. 이 사용자는 호스트 디렉터리에 쓸 수 있어야 합니다. 다음 명령을 사용하여 디렉터리 소유권을 사용자 ID 1001 로 변경해야 할 수 있습니다.

$ sudo chown 1001:root <path>

2.2.7. 레지스트리 콘솔 활성화

OpenShift Container Platform은 통합 레지스트리에 웹 기반 인터페이스를 제공합니다. 이 레지스트리 콘솔은 이미지 검색 및 관리를 위한 선택적 구성 요소입니다. 포드로 실행되는 상태 비저장 서비스로 배포됩니다.

참고

OpenShift Container Platform을 독립 실행형 레지스트리로 설치한 경우 레지스트리 콘솔은 이미 배포되어 설치 중에 자동으로 보호됩니다.

중요

Cockpit이 이미 실행 중인 경우 레지스트리 콘솔과 포트 충돌(기본적으로 9090)을 방지하려면 계속 진행하기 전에 Cockpit을 종료해야 합니다.

2.2.7.1. 레지스트리 콘솔 배포
중요
  1. default 프로젝트에 패스스루 경로를 만듭니다. 다음 단계에서 레지스트리 콘솔 애플리케이션을 생성할 때 이 작업이 필요합니다.

    $ oc create route passthrough --service registry-console \
        --port registry-console \
        -n default
  2. 레지스트리 콘솔 애플리케이션을 배포합니다. <openshift_oauth_url> 을 OpenShift Container Platform OAuth 공급자의 URL로 바꿉니다. 일반적으로 마스터입니다.

    $ oc new-app -n default --template=registry-console \
        -p OPENSHIFT_OAUTH_PROVIDER_URL="https://<openshift_oauth_url>:8443" \
        -p REGISTRY_HOST=$(oc get route docker-registry -n default --template='{{ .spec.host }}') \
        -p COCKPIT_KUBE_URL=$(oc get route registry-console -n default --template='https://{{ .spec.host }}')
    참고

    레지스트리 콘솔에 로그인하려고 할 때 리디렉션 URL이 잘못되면 oc get oauthclients 를 사용하여 OAuth 클라이언트를 확인합니다.

  3. 마지막으로 웹 브라우저를 사용하여 경로 URI를 사용하여 콘솔을 확인합니다.
2.2.7.2. 레지스트리 콘솔 보안

기본적으로 레지스트리 콘솔 배포의 단계에 따라 레지스트리 콘솔에서 자체 서명 TLS 인증서를 생성합니다. 자세한 내용은 레지스트리 콘솔 문제 해결을 참조하십시오.

다음 단계를 사용하여 조직의 서명 인증서를 보안 볼륨으로 추가합니다. 이는 인증서를 oc 클라이언트 호스트에서 사용할 수 있다고 가정합니다.

  1. 인증서와 키가 포함된 .cert 파일을 만듭니다. 다음과 같이 파일을 포맷합니다.

    • 서버 인증서 및 중간 인증 기관을 위한 하나 이상의 BEGIN CERTIFICATE 블록
    • BEGIN PRIVATE KEY 또는 키와 유사한 블록입니다. 키를 암호화할 수 없습니다

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

      -----BEGIN CERTIFICATE-----
      MIIDUzCCAjugAwIBAgIJAPXW+CuNYS6QMA0GCSqGSIb3DQEBCwUAMD8xKTAnBgNV
      BAoMIGI0OGE2NGNkNmMwNTQ1YThhZTgxOTEzZDE5YmJjMmRjMRIwEAYDVQQDDAls
      ...
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      MIIDUzCCAjugAwIBAgIJAPXW+CuNYS6QMA0GCSqGSIb3DQEBCwUAMD8xKTAnBgNV
      BAoMIGI0OGE2NGNkNmMwNTQ1YThhZTgxOTEzZDE5YmJjMmRjMRIwEAYDVQQDDAls
      ...
      -----END CERTIFICATE-----
      -----BEGIN PRIVATE KEY-----
      MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyOJ5garOYw0sm
      8TBCDSqQ/H1awGMzDYdB11xuHHsxYS2VepPMzMzryHR137I4dGFLhvdTvJUH8lUS
      ...
      -----END PRIVATE KEY-----
    • 보안 레지스트리에는 다음 SAN(주체 대체 이름) 목록이 포함되어야 합니다.

      • 두 개의 서비스 호스트 이름.

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

        docker-registry.default.svc.cluster.local
        docker-registry.default.svc
      • 서비스 IP 주소.

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

        172.30.124.220

        다음 명령을 사용하여 컨테이너 이미지 레지스트리 서비스 IP 주소를 가져옵니다.

        oc get service docker-registry --template='{{.spec.clusterIP}}'
      • 공개 호스트 이름.

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

        docker-registry-default.apps.example.com

        다음 명령을 사용하여 컨테이너 이미지 레지스트리 공개 호스트 이름을 가져옵니다.

        oc get route docker-registry --template '{{.spec.host}}'

        예를 들어 서버 인증서에는 다음과 유사한 SAN 세부 정보가 포함되어야 합니다.

        X509v3 Subject Alternative Name:
                       DNS:docker-registry-public.openshift.com, DNS:docker-registry.default.svc, DNS:docker-registry.default.svc.cluster.local, DNS:172.30.2.98, IP Address:172.30.2.98

        레지스트리 콘솔은 /etc/cockpit/ws-certs.d 디렉터리에서 인증서를 로드합니다. 마지막 파일에는 .cert 확장자가 알파벳순으로 사용됩니다. 따라서 .cert 파일에는 OpenSSL 스타일로 포맷된 PEM 블록이 2개 이상 포함되어야 합니다.

        인증서를 찾을 수 없는 경우, openssl 명령을 사용하여 자체 서명된 인증서가 생성되고 0-self-signed.cert 파일에 저장됩니다.

  2. 시크릿을 생성합니다.

    $ oc create secret generic console-secret \
        --from-file=/path/to/console.cert
  3. registry-console 배포 구성에 보안을 추가합니다.

    $ oc set volume dc/registry-console --add --type=secret \
        --secret-name=console-secret -m /etc/cockpit/ws-certs.d

    이렇게 하면 레지스트리 콘솔의 새 배포가 트리거되어 서명된 인증서가 포함됩니다.

2.2.7.3. 레지스트리 콘솔 문제 해결
2.2.7.3.1. 디버그 모드

레지스트리 콘솔 디버그 모드는 환경 변수를 사용하여 활성화됩니다. 다음 명령은 디버그 모드로 레지스트리 콘솔을 재배포합니다.

$ oc set env dc registry-console G_MESSAGES_DEBUG=cockpit-ws,cockpit-wrapper

디버그 모드를 활성화하면 더 자세한 로깅이 레지스트리 콘솔의 Pod 로그에 표시될 수 있습니다.

2.2.7.3.2. SSL 인증서 경로 표시

레지스트리 콘솔에서 사용 중인 인증서를 확인하려면 콘솔 포드 내부에서 명령을 실행할 수 있습니다.

  1. default 프로젝트의 Pod를 나열하고 레지스트리 콘솔의 Pod 이름을 찾습니다.

    $ oc get pods -n default
    NAME                       READY     STATUS    RESTARTS   AGE
    registry-console-1-rssrw   1/1       Running   0          1d
  2. 이전 명령에서 포드 이름을 사용하여 cockpit-ws 프로세스에서 사용 중인 인증서 경로를 가져옵니다. 이 예에서는 자동 생성 인증서를 사용하는 콘솔을 보여줍니다.

    $ oc exec registry-console-1-rssrw remotectl certificate
    certificate: /etc/cockpit/ws-certs.d/0-self-signed.cert

2.3. 레지스트리에 액세스

2.3.1. 로그 보기

컨테이너 이미지 레지스트리의 로그를 보려면 배포 구성과 함께 oc logs 명령을 사용합니다.

$ oc logs dc/docker-registry
2015-05-01T19:48:36.300593110Z time="2015-05-01T19:48:36Z" level=info msg="version=v2.0.0+unknown"
2015-05-01T19:48:36.303294724Z time="2015-05-01T19:48:36Z" level=info msg="redis not configured" instance.id=9ed6c43d-23ee-453f-9a4b-031fea646002
2015-05-01T19:48:36.303422845Z time="2015-05-01T19:48:36Z" level=info msg="using inmemory layerinfo cache" instance.id=9ed6c43d-23ee-453f-9a4b-031fea646002
2015-05-01T19:48:36.303433991Z time="2015-05-01T19:48:36Z" level=info msg="Using OpenShift Auth handler"
2015-05-01T19:48:36.303439084Z time="2015-05-01T19:48:36Z" level=info msg="listening on :5000" instance.id=9ed6c43d-23ee-453f-9a4b-031fea646002

2.3.2. 파일 스토리지

태그 및 이미지 메타데이터는 OpenShift Container Platform에 저장되지만 레지스트리는 /registry 의 레지스트리 컨테이너에 마운트된 볼륨에 계층 및 서명 데이터를 저장합니다. oc exec 는 권한 있는 컨테이너에서 작동하지 않으므로 레지스트리의 콘텐츠를 보려면 레지스트리 Pod의 컨테이너에 수동으로 SSH를 적용한 다음 컨테이너 자체에서 docker exec 를 실행해야 합니다.

  1. 현재 Pod를 나열하여 컨테이너 이미지 레지스트리의 포드 이름을 찾습니다.

    # oc get pods

    그런 다음 oc describe 를 사용하여 컨테이너를 실행하는 노드의 호스트 이름을 찾습니다.

    # oc describe pod <pod_name>
  2. 원하는 노드에 로그인합니다.

    # ssh node.example.com
  3. 노드 호스트의 default 프로젝트에서 실행 중인 컨테이너를 나열하고 컨테이너 이미지 레지스트리의 컨테이너 ID를 확인합니다.

    # docker ps --filter=name=registry_docker-registry.*_default_
  4. oc rsh 명령을 사용하여 레지스트리 콘텐츠를 나열합니다.

    # oc rsh dc/docker-registry find /registry
    /registry/docker
    /registry/docker/registry
    /registry/docker/registry/v2
    /registry/docker/registry/v2/blobs 1
    /registry/docker/registry/v2/blobs/sha256
    /registry/docker/registry/v2/blobs/sha256/ed
    /registry/docker/registry/v2/blobs/sha256/ed/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810
    /registry/docker/registry/v2/blobs/sha256/ed/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810/data 2
    /registry/docker/registry/v2/blobs/sha256/a3
    /registry/docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
    /registry/docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4/data
    /registry/docker/registry/v2/blobs/sha256/f7
    /registry/docker/registry/v2/blobs/sha256/f7/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845
    /registry/docker/registry/v2/blobs/sha256/f7/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845/data
    /registry/docker/registry/v2/repositories 3
    /registry/docker/registry/v2/repositories/p1
    /registry/docker/registry/v2/repositories/p1/pause 4
    /registry/docker/registry/v2/repositories/p1/pause/_manifests
    /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions
    /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256
    /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf
    /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures 5
    /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures/sha256
    /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures/sha256/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810
    /registry/docker/registry/v2/repositories/p1/pause/_manifests/revisions/sha256/e9a2ac6418981897b399d3709f1b4a6d2723cd38a4909215ce2752a5c068b1cf/signatures/sha256/ede17b139a271d6b1331ca3d83c648c24f92cece5f89d95ac6c34ce751111810/link 6
    /registry/docker/registry/v2/repositories/p1/pause/_uploads 7
    /registry/docker/registry/v2/repositories/p1/pause/_layers 8
    /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256
    /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
    /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4/link 9
    /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845
    /registry/docker/registry/v2/repositories/p1/pause/_layers/sha256/f72a00a23f01987b42cb26f259582bb33502bdb0fcf5011e03c60577c4284845/link
    1
    이 디렉터리는 모든 계층과 서명을 Blob으로 저장합니다.
    2
    이 파일에는 Blob의 내용이 포함되어 있습니다.
    3
    이 디렉터리는 모든 이미지 리포지토리를 저장합니다.
    4
    이 디렉터리는 단일 이미지 리포지토리 p1/pause 를 위한 것입니다.
    5
    이 디렉터리에는 특정 이미지 매니페스트 버전에 대한 서명이 포함되어 있습니다.
    6
    이 파일에는 서명 데이터가 포함된 Blob에 대한 참조가 포함되어 있습니다.
    7
    이 디렉터리에는 현재 지정된 리포지토리에 대해 업로드 및 스테이징된 모든 계층이 포함되어 있습니다.
    8
    이 디렉터리에는 이 리포지토리가 참조하는 모든 계층에 대한 링크가 포함되어 있습니다.
    9
    이 파일에는 이미지를 통해 이 리포지토리에 연결된 특정 계층에 대한 참조가 포함되어 있습니다.

2.3.3. 직접 레지스트리 액세스

고급 용도의 경우 레지스트리에 직접 액세스하여 docker 명령을 호출할 수 있습니다. 이를 통해 docker push 또는 docker pull과 같은 작업을 사용하여 통합 레지스트리에서 이미지를 직접 푸시 하거나 가져올 수 있습니다. 이렇게 하려면 docker login 명령을 사용하여 레지스트리에 로그인해야 합니다. 수행할 수있는 작업은 다음 섹션에 설명된대로 사용자 권한에 따라 달라집니다.

2.3.3.1. 사용자 요구 사항

직접 레지스트리에 액세스하려면 원하는 사용량에 따라 사용하는 사용자가 다음을 충족해야 합니다.

  • 직접 액세스하기 위해 선호하는 ID 공급자에 대한 일반 사용자가 있어야 합니다. 일반 사용자는 레지스트리에 로그인하는 데 필요한 액세스 토큰을 생성할 수 있습니다. system:admin 과 같은 시스템 사용자는 액세스 토큰을 가져올 수 없으므로 레지스트리에 직접 액세스할 수 없습니다.

    예를 들어 HTPASSWD 인증을 사용하는 경우 다음 명령을 사용하여 하나를 생성할 수 있습니다.

    # htpasswd /etc/origin/master/htpasswd <user_name>
  • 예를 들어 docker pull 명령을 사용하는 경우 이미지를 가져오려면 사용자에게 registry-viewer 역할이 있어야 합니다. 이 역할을 추가하려면 다음을 수행합니다.

    $ oc policy add-role-to-user registry-viewer <user_name>
  • 예를 들어 docker push 명령을 사용할 때 이미지를 작성하거나 푸시 하려면 사용자에게 registry-editor 역할이 있어야 합니다. 이 역할을 추가하려면 다음을 수행합니다.

    $ oc policy add-role-to-user registry-editor <user_name>

사용자 권한에 대한 자세한 내용은 역할 바인딩 관리를 참조하십시오.

2.3.3.2. 레지스트리에 로그인
참고

사용자가 직접 레지스트리에 액세스하는 데 필요한 사전 요구 사항을 충족하는지 확인합니다.

레지스트리에 직접 로그인하려면 다음을 수행합니다.

  1. 일반 사용자로 OpenShift Container Platform에 로그인했는지 확인하십시오.

    $ oc login
  2. 액세스 토큰을 사용하여 컨테이너 이미지 레지스트리에 로그인합니다.

    docker login -u openshift -p $(oc whoami -t) <registry_ip>:<port>
참고

사용자 이름에 모든 값을 전달할 수 있으며 토큰에는 필요한 모든 정보가 포함되어 있습니다. 콜론이 포함된 사용자 이름을 전달하면 로그인이 실패합니다.

2.3.3.3. 이미지 내보내기 및 가져오기

레지스트리에 로그인한 후 레지스트리에 대해 docker pull 및 docker push 작업을 수행할 수 있습니다.

중요

모든 이미지를 가져올 수 있지만 system:registry 역할이 추가된 경우 프로젝트의 레지스트리에만 이미지를 푸시할 수 있습니다.

다음 예제에서는 다음을 사용합니다.

구성 요소

<registry_ip>

172.30.124.220

<port>

5000

<project>

openshift

<image>

busybox

<tag>

생략됨 (기본값 latest)

  1. 모든 이미지를 가져옵니다.

    $ docker pull docker.io/busybox
  2. <registry_ip>:<port>/<project>/<image> 형식으로 새 이미지에 태그를 지정합니다. OpenShift Container Platform이 레지스트리에 이미지를 올바르게 배치하고 나중에 액세스할 수 있도록 프로젝트 이름이 이 풀 사양에 표시되어야 합니다.

    $ docker tag docker.io/busybox 172.30.124.220:5000/openshift/busybox
    참고

    일반 사용자에게는 지정된 프로젝트에 대한 system:image-builder 역할이 있어야 사용자가 이미지를 작성하거나 푸시할 수 있습니다. 그렇지 않으면 다음 단계의 docker push 가 실패합니다. 테스트를 위해 busybox 이미지를 푸시하는 새 프로젝트를 만들 수 있습니다.

  3. 새로 태그가 지정된 이미지를 레지스트리로 푸시합니다.

    $ docker push 172.30.124.220:5000/openshift/busybox
    ...
    cf2616975b4a: Image successfully pushed
    Digest: sha256:3662dd821983bc4326bee12caec61367e7fb6f6a3ee547cbaff98f77403cab55

2.3.4. 레지스트리 지표에 액세스

OpenShift Container 레지스트리는 Prometheus 메트릭에 대한 엔드 포인트를 제공합니다. Prometheus는 독립형 오픈 소스 시스템 모니터링 및 경고 툴킷입니다.

메트릭은 레지스트리 엔드 포인트의 /extensions/v2/metrics 경로에 표시됩니다. 그러나 이 경로를 먼저 활성화해야 합니다. 자세한 내용은 확장 레지스트리 구성을 참조하십시오.

다음은 지표 쿼리의 간단한 예입니다.

$ curl -s -u <user>:<secret> \ 1
    http://172.30.30.30:5000/extensions/v2/metrics | grep openshift | head -n 10

# HELP openshift_build_info A metric with a constant '1' value labeled by major, minor, git commit & git version from which OpenShift was built.
# TYPE openshift_build_info gauge
openshift_build_info{gitCommit="67275e1",gitVersion="v3.6.0-alpha.1+67275e1-803",major="3",minor="6+"} 1
# HELP openshift_registry_request_duration_seconds Request latency summary in microseconds for each operation
# TYPE openshift_registry_request_duration_seconds summary
openshift_registry_request_duration_seconds{name="test/origin-pod",operation="blobstore.create",quantile="0.5"} 0
openshift_registry_request_duration_seconds{name="test/origin-pod",operation="blobstore.create",quantile="0.9"} 0
openshift_registry_request_duration_seconds{name="test/origin-pod",operation="blobstore.create",quantile="0.99"} 0
openshift_registry_request_duration_seconds_sum{name="test/origin-pod",operation="blobstore.create"} 0
openshift_registry_request_duration_seconds_count{name="test/origin-pod",operation="blobstore.create"} 5
1
<user> 는 임의의 값이지만 <secret>레지스트리 구성에 지정된 값과 일치해야합니다.

지표에 액세스하는 또 다른 방법은 클러스터 역할을 사용하는 것입니다. 끝점을 활성화해야 하지만 <secret> 을 지정할 필요가 없습니다. 메트릭을 담당하는 구성 파일의 일부는 다음과 같아야합니다.

openshift:
  version: 1.0
  metrics:
    enabled: true
...

메트릭에 액세스할 클러스터 역할이 아직 없는 경우 클러스터 역할을 생성해야 합니다.

$ cat <<EOF |
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus-scraper
rules:
- apiGroups:
  - image.openshift.io
  resources:
  - registry/metrics
  verbs:
  - get
EOF
oc create -f -

이 역할을 사용자에게 추가하려면 다음 명령을 실행합니다.

$ oc adm policy add-cluster-role-to-user prometheus-scraper <username>

고급 쿼리 및 권장 시각화 프로그램은 업스트림 Prometheus 설명서 를 참조하십시오.

2.4. 레지스트리 보안 및 노출

2.4.1. 개요

기본적으로 OpenShift Container Platform 레지스트리는 TLS를 통해 트래픽을 제공하도록 클러스터 설치 중에 보호됩니다. 또한 서비스를 외부에 노출하기 위해 기본적으로 패스스루 경로가 생성됩니다.

어떠한 이유로 레지스트리가 보안 또는 노출되지 않은 경우 수동으로 이렇게 하는 방법에 대한 단계는 다음 섹션을 참조하십시오.

2.4.2. 수동으로 레지스트리 보안

TLS를 통해 트래픽을 제공하도록 레지스트리를 수동으로 보호하려면 다음을 수행합니다.

  1. 레지스트리를 배포합니다.
  2. 레지스트리의 서비스 IP 및 포트를 가져옵니다.

    $ oc get svc/docker-registry
    NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    docker-registry   ClusterIP   172.30.82.152   <none>        5000/TCP   1d
  3. 기존 서버 인증서를 사용하거나 지정된 CA에서 서명한 지정된 IP 및 호스트 이름에 유효한 키와 서버 인증서를 생성할 수 있습니다. 레지스트리 서비스 IP 및 docker-registry.default.svc.cluster.local 호스트 이름에 대한 서버 인증서를 생성하려면 Ansible 호스트 인벤토리 파일에 나열된 첫 번째 마스터(기본값 /etc/ansible/hosts )에서 다음 명령을 실행합니다.

    $ oc adm ca create-server-cert \
        --signer-cert=/etc/origin/master/ca.crt \
        --signer-key=/etc/origin/master/ca.key \
        --signer-serial=/etc/origin/master/ca.serial.txt \
        --hostnames='docker-registry.default.svc.cluster.local,docker-registry.default.svc,172.30.124.220' \
        --cert=/etc/secrets/registry.crt \
        --key=/etc/secrets/registry.key

    라우터가 외부에 노출되는 경우 --hostnames 플래그에 공용 경로 호스트 이름을 추가합니다.

    --hostnames='mydocker-registry.example.com,docker-registry.default.svc.cluster.local,172.30.124.220 \

    외부에서 액세스할 수 있도록 기본 인증서 업데이트에 대한 자세한 내용은 레지스트리 및 라우터 인증서 재배포 를 참조하십시오.

    참고

    oc adm ca create-server-cert 명령은 2년 동안 유효한 인증서를 생성합니다. 이는 --expire-days 옵션으로 변경할 수 있지만 보안상의 이유로 이 값보다 커지지 않는 것이 좋습니다.

  4. 레지스트리 인증서의 보안을 생성합니다.

    $ oc create secret generic registry-certificates \
        --from-file=/etc/secrets/registry.crt \
        --from-file=/etc/secrets/registry.key
  5. 레지스트리 Pod의 서비스 계정에 보안을 추가합니다( 기본 서비스 계정 포함).

    $ oc secrets link registry registry-certificates
    $ oc secrets link default  registry-certificates
    참고

    시크릿을 참조하는 서비스 계정에만 제한하는 것은 기본적으로 비활성화되어 있습니다. 즉, 마스터 구성 파일에서 serviceAccountConfig.limitSecretReferencesfalse (기본 설정)로 설정되면 서비스에 시크릿을 연결할 필요가 없습니다.

  6. docker-registry 서비스를 일시 중지합니다.

    $ oc rollout pause dc/docker-registry
  7. 레지스트리 배포 구성에 시크릿 볼륨을 추가합니다.

    $ oc set volume dc/docker-registry --add --type=secret \
        --secret-name=registry-certificates -m /etc/secrets
  8. 레지스트리 배포 구성에 다음 환경 변수를 추가하여 TLS를 활성화합니다.

    $ oc set env dc/docker-registry \
        REGISTRY_HTTP_TLS_CERTIFICATE=/etc/secrets/registry.crt \
        REGISTRY_HTTP_TLS_KEY=/etc/secrets/registry.key

    자세한 내용은 Docker 문서의 레지스트리 구성 섹션 을 참조하십시오.

  9. HTTP에서 HTTPS로 레지스트리의 활성 프로브에 사용된 스키마를 업데이트합니다.

    $ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{
        "name":"registry",
        "livenessProbe":  {"httpGet": {"scheme":"HTTPS"}}
      }]}}}}'
  10. 처음에 OpenShift Container Platform 3.2 이상에 레지스트리가 배포된 경우 레지스트리의 준비 상태 프로브에 사용된 체계를 HTTP에서 HTTPS로 업데이트합니다.

    $ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{
        "name":"registry",
        "readinessProbe":  {"httpGet": {"scheme":"HTTPS"}}
      }]}}}}'
  11. docker-registry 서비스를 다시 시작합니다.

    $ oc rollout resume dc/docker-registry
  12. 레지스트리가 TLS 모드에서 실행 중인지 확인합니다. 최신 docker-registry 배포가 완료될 때까지 기다린 후 레지스트리 컨테이너의 Docker 로그를 확인합니다. :5000, tls에서 수신 대기할 항목을 찾아야 합니다.

    $ oc logs dc/docker-registry | grep tls
    time="2015-05-27T05:05:53Z" level=info msg="listening on :5000, tls" instance.id=deeba528-c478-41f5-b751-dc48e4935fc2
  13. Docker 인증서 디렉터리에 CA 인증서를 복사합니다. 클러스터의 모든 노드에서 이 작업을 수행해야 합니다.

    $ dcertsdir=/etc/docker/certs.d
    $ destdir_addr=$dcertsdir/172.30.124.220:5000
    $ destdir_name=$dcertsdir/docker-registry.default.svc.cluster.local:5000
    
    $ sudo mkdir -p $destdir_addr $destdir_name
    $ sudo cp ca.crt $destdir_addr    1
    $ sudo cp ca.crt $destdir_name
    1
    ca.crt 파일은 마스터의 /etc/origin/master/ca.crt 의 사본입니다.
  14. 인증을 사용하는 경우 일부 버전의 docker 에서도 OS 수준에서 인증서를 신뢰하도록 클러스터를 구성해야 합니다.

    1. 인증서를 복사합니다.

      $ cp /etc/origin/master/ca.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt
    2. 다음을 실행합니다.

      $ update-ca-trust enable
  15. /etc/sysconfig/docker 파일에서 이 특정 레지스트리에 대해서만 --insecure-registry 옵션을 제거합니다. 그런 다음 데몬을 다시 로드하고 docker 서비스를 다시 시작하여 이 구성 변경을 반영합니다.

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
  16. docker 클라이언트 연결을 확인합니다. 레지스트리에서 docker push 를 실행하거나 레지스트리에서 docker pull 을 실행하면 성공해야 합니다. 레지스트리에 로그인 했는지 확인합니다.

    $ docker tag|push <registry/image> <internal_registry/project/image>

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

    $ docker pull busybox
    $ docker tag docker.io/busybox 172.30.124.220:5000/openshift/busybox
    $ docker push 172.30.124.220:5000/openshift/busybox
    ...
    cf2616975b4a: Image successfully pushed
    Digest: sha256:3662dd821983bc4326bee12caec61367e7fb6f6a3ee547cbaff98f77403cab55

2.4.3. 수동으로 보안 레지스트리 노출

OpenShift Container Platform 클러스터 내에서 OpenShift Container Platform 레지스트리에 로그인하는 대신 먼저 레지스트리를 보안한 다음 경로로 노출하여 외부에서 액세스할 수 있습니다. 이를 통해 라우팅 주소를 사용하여 클러스터 외부에서 레지스트리에 로그인하고 라우팅 호스트를 사용하여 이미지에 태그를 지정하거나 푸시할 수 있습니다.

  1. 다음 각 전제 조건 단계는 일반적인 클러스터 설치 중에 기본적으로 수행됩니다. 해당 노드가 없는 경우 수동으로 수행합니다.

  2. 초기 클러스터 설치 중에 레지스트리에 대해 기본적으로 passthrough 경로가 생성되어야 합니다.

    1. 경로가 있는지 확인합니다.

      $ oc get route/docker-registry -o yaml
      apiVersion: v1
      kind: Route
      metadata:
        name: docker-registry
      spec:
        host: <host> 1
        to:
          kind: Service
          name: docker-registry 2
        tls:
          termination: passthrough 3
      1
      경로의 호스트입니다. DNS를 통해 이 이름을 라우터의 IP 주소로 외부에서 확인할 수 있어야 합니다.
      2
      레지스트리의 서비스 이름입니다.
      3
      이 경로를 통과 경로로 지정합니다.
      참고

      보안 레지스트리 노출에도 재암호화 경로가 지원됩니다.

    2. 존재하지 않는 경우 레지스트리를 경로의 서비스로 지정하여 oc create route passthrough 명령을 통해 경로를 만듭니다. 기본적으로 생성된 경로의 이름은 서비스 이름과 동일합니다.

      1. docker-registry 서비스 세부 정보를 가져옵니다.

        $ oc get svc
        NAME              CLUSTER_IP       EXTERNAL_IP   PORT(S)                 SELECTOR                  AGE
        docker-registry   172.30.69.167    <none>        5000/TCP                docker-registry=default   4h
        kubernetes        172.30.0.1       <none>        443/TCP,53/UDP,53/TCP   <none>                    4h
        router            172.30.172.132   <none>        80/TCP                  router=router             4h
      2. 경로를 생성합니다.

        $ oc create route passthrough    \
            --service=docker-registry    \1
            --hostname=<host>
        route "docker-registry" created     2
        1
        레지스트리를 경로의 서비스로 지정합니다.
        2
        경로 이름은 서비스 이름과 동일합니다.
  3. 다음으로 호스트가 이미지를 푸시하고 가져올 수 있도록 호스트 시스템의 레지스트리에 사용되는 인증서를 신뢰해야 합니다. 레지스트리를 보호할 때 참조된 인증서가 생성되었습니다.

    $ sudo mkdir -p /etc/docker/certs.d/<host>
    $ sudo cp <ca_certificate_file> /etc/docker/certs.d/<host>
    $ sudo systemctl restart docker
  4. 레지스트리 보안 정보를 사용하여 레지스트리에 로그인합니다. 그러나 이번에는 서비스 IP가 아닌 경로에 사용된 호스트 이름을 가리킵니다. 보안 및 노출된 레지스트리에 로그인할 때 docker login 명령에서 레지스트리를 지정해야 합니다.

    # docker login -e user@company.com \
        -u f83j5h6 \
        -p Ju1PeM47R0B92Lk3AZp-bWJSck2F7aGCiZ66aFGZrs2 \
        <host>
  5. 이제 경로 호스트를 사용하여 이미지에 태그를 지정하고 내보낼 수 있습니다. 예를 들어 test 라는 프로젝트에서 busybox 이미지에 태그를 지정하고 푸시하려면 다음을 수행합니다.

    $ oc get imagestreams -n test
    NAME      DOCKER REPO   TAGS      UPDATED
    
    $ docker pull busybox
    $ docker tag busybox <host>/test/busybox
    $ docker push <host>/test/busybox
    The push refers to a repository [<host>/test/busybox] (len: 1)
    8c2e06607696: Image already exists
    6ce2e90b0bc7: Image successfully pushed
    cf2616975b4a: Image successfully pushed
    Digest: sha256:6c7e676d76921031532d7d9c0394d0da7c2906f4cb4c049904c4031147d8ca31
    
    $ docker pull <host>/test/busybox
    latest: Pulling from <host>/test/busybox
    cf2616975b4a: Already exists
    6ce2e90b0bc7: Already exists
    8c2e06607696: Already exists
    Digest: sha256:6c7e676d76921031532d7d9c0394d0da7c2906f4cb4c049904c4031147d8ca31
    Status: Image is up to date for <host>/test/busybox:latest
    
    $ oc get imagestreams -n test
    NAME      DOCKER REPO                       TAGS      UPDATED
    busybox   172.30.11.215:5000/test/busybox   latest    2 seconds ago
    참고

    이미지 스트림에는 경로 이름과 포트가 아닌 레지스트리 서비스의 IP 주소 및 포트가 있습니다. 자세한 내용은 oc get imagestreams 를 참조하십시오.

2.4.4. 수동으로 비보안 레지스트리 노출

레지스트리를 공개하기 위해 레지스트리를 보호하는 대신 비 프로덕션 OpenShift Container Platform 환경에 비보안 레지스트리를 노출하면 됩니다. 이를 통해 SSL 인증서를 사용하지 않고 레지스트리에 대한 외부 경로를 보유할 수 있습니다.

주의

비 프로덕션 환경만 외부 액세스에 비보안 레지스트리를 노출해야 합니다.

비보안 레지스트리를 공개하려면 다음을 수행합니다.

  1. 레지스트리를 공개합니다.

    # oc expose service docker-registry --hostname=<hostname> -n default

    이렇게 하면 다음 JSON 파일이 생성됩니다.

    apiVersion: v1
    kind: Route
    metadata:
      creationTimestamp: null
      labels:
        docker-registry: default
      name: docker-registry
    spec:
      host: registry.example.com
      port:
        targetPort: "5000"
      to:
        kind: Service
        name: docker-registry
    status: {}
  2. 경로가 성공적으로 생성되었는지 확인합니다.

    # oc get route
    NAME              HOST/PORT                    PATH      SERVICE           LABELS                    INSECURE POLICY   TLS TERMINATION
    docker-registry   registry.example.com            docker-registry   docker-registry=default
  3. 레지스트리의 상태를 확인합니다.

    $ curl -v http://registry.example.com/healthz

    HTTP 200/OK 메시지가 예상됩니다.

    레지스트리를 노출한 후 OPTIONS 항목에 포트 번호를 추가하여 /etc/sysconfig/docker 파일을 업데이트합니다. 예를 들면 다음과 같습니다.

    OPTIONS='--selinux-enabled --insecure-registry=172.30.0.0/16 --insecure-registry registry.example.com:80'
    중요

    위의 옵션은 로그인하려는 클라이언트에 추가해야 합니다.

    또한 Docker가 클라이언트에서 실행되고 있는지 확인합니다.

비보안 및 노출된 레지스트리에 로그인할docker login 명령에서 레지스트리를 지정해야 합니다. 예를 들면 다음과 같습니다.

# docker login -e user@company.com \
    -u f83j5h6 \
    -p Ju1PeM47R0B92Lk3AZp-bWJSck2F7aGCiZ66aFGZrs2 \
    <host>

2.5. 확장 레지스트리 구성

2.5.1. 레지스트리 IP 주소 유지 관리

OpenShift Container Platform은 서비스 IP 주소로 통합 레지스트리를 참조하므로 docker-registry 서비스를 삭제하고 다시 생성하는 경우 새 서비스에서 이전 IP 주소를 다시 사용하도록 정렬하여 완전히 투명한 전환을 보장할 수 있습니다. 새 IP 주소를 방지할 수 없는 경우 마스터만 재부팅하여 클러스터 중단을 최소화할 수 있습니다.

주소 다시 사용
IP 주소를 다시 사용하려면 기존 docker-registry 서비스의 IP 주소를 삭제하기 전에 저장하고 새로 할당된 IP 주소를 새 docker-registry 서비스에 저장된 IP 주소로 교체해야 합니다.
  1. 서비스에 대한 clusterIP 를 기록합니다.

    $ oc get svc/docker-registry -o yaml | grep clusterIP:
  2. 서비스를 삭제합니다.

    $ oc delete svc/docker-registry dc/docker-registry
  3. registry.yaml에서 레지스트리 정의를 생성하여 <options> 를 프로덕션 사용 섹션의 3단계에 사용된 항목으로 바꿉니다.

    $ oc adm registry <options> -o yaml > registry.yaml
  4. registry.yaml 을 편집하고, 여기에서 서비스를 찾은 다음, clusterIP 를 1단계에 명시된 주소로 변경합니다.
  5. 수정된 registry .yaml을 사용하여 레지스트리를 생성합니다.

    $ oc create -f registry.yaml
마스터 재부팅
IP 주소를 다시 사용할 수 없는 경우 이전 IP 주소가 포함된 가져오기 사양을 사용하는 작업이 실패합니다. 클러스터 중단을 최소화하려면 마스터를 재부팅해야 합니다.
# master-restart api
# master-restart controllers

이렇게 하면 이전 IP 주소를 포함하는 이전 레지스트리 URL이 캐시에서 지워집니다.

참고

Pod에 불필요한 다운타임이 발생하고 실제로 캐시를 지우지 않으므로 전체 클러스터를 재부팅하지 않는 것이 좋습니다.

2.5.2. 외부 레지스트리 검색 목록 구성

/etc/containers/registries.conf 파일을 사용하여 컨테이너 이미지를 검색할 Docker 레지스트리 목록을 생성할 수 있습니다.

/etc/containers/registries.conf 파일은 사용자가 myimage:latest 와 같은 이미지 단축 이름을 사용하여 이미지를 가져올 때 OpenShift Container Platform에서 검색해야 하는 레지스트리 서버 목록입니다. 검색 순서를 사용자 지정하고, 보안 및 비보안 레지스트리를 지정하고, 차단된 레지스트리 목록을 정의할 수 있습니다. OpenShift Container Platform은 차단된 목록의 레지스트리를 검색하거나 가져올 수 없습니다.

예를 들어 사용자가 myimage:latest 이미지를 가져오려는 경우 OpenShift Container Platform은 myimage:latest 를 찾을 때까지 목록에 표시되는 순서대로 레지스트리를 검색합니다.

레지스트리 검색 목록을 사용하면 OpenShift Container Platform 사용자가 다운로드할 수 있는 이미지 및 템플릿 세트를 큐레이션할 수 있습니다. 이러한 이미지를 하나 이상의 Docker 레지스트리에 배치하고 레지스트리를 목록에 추가한 다음 해당 이미지를 클러스터로 가져올 수 있습니다.

참고

레지스트리 검색 목록을 사용하는 경우 OpenShift Container Platform은 검색 목록에 없는 레지스트리에서 이미지를 가져오지 않습니다.

레지스트리 검색 목록을 구성하려면 다음을 수행합니다.

  1. 필요에 따라 /etc/containers/registries.conf 파일을 편집하여 다음 매개변수를 추가하거나 편집합니다.

    [registries.search] 1
    registries = ["reg1.example.com", "reg2.example.com"]
    
    [registries.insecure] 2
    registries = ["reg3.example.com"]
    
    [registries.block] 3
    registries = ['docker.io']
    1
    사용자가 SSL/TLS를 사용하여 이미지를 다운로드할 수 있는 보안 레지스트리를 지정합니다.
    2
    사용자가 TLS 없이 이미지를 다운로드할 수 있는 비보안 레지스트리를 지정합니다.
    3
    사용자가 이미지를 다운로드할 수 없는 레지스트리를 지정합니다.

2.5.3. 레지스트리 호스트 이름 설정

레지스트리가 내부 및 외부 참조 모두에 대해 로 알려진 호스트 이름과 포트를 구성할 수 있습니다. 이렇게 하면 이미지 스트림은 이미지의 호스트 이름 기반 푸시 및 가져오기 사양을 제공하므로, 이미지 소비자가 레지스트리 서비스 IP의 변경 사항과 이미지 스트림과 참조를 이식할 수 있습니다.

클러스터 내에서 레지스트리를 참조하는 데 사용되는 호스트 이름을 설정하려면 마스터 구성 파일의 imagePolicyConfig 섹션에 internalRegistryHostname 을 설정합니다. 외부 호스트 이름은 동일한 위치에 externalRegistryHostname 값을 설정하여 제어됩니다.

이미지 정책 구성

imagePolicyConfig:
  internalRegistryHostname: docker-registry.default.svc.cluster.local:5000
  externalRegistryHostname: docker-registry.mycompany.com

레지스트리 자체는 동일한 내부 호스트 이름 값으로 구성해야 합니다. 이 작업은 레지스트리 배포 구성에서 REGISTRY_OPENSHIFT_SERVER_ADDR 환경 변수를 설정하거나 레지스트리 구성의 OpenShift 섹션에서 값을 설정하여 수행할 수 있습니다.

참고

레지스트리에 TLS를 활성화한 경우 서버 인증서에 레지스트리를 참조할 것으로 예상되는 호스트 이름이 포함되어야 합니다. 서버 인증서에 호스트 이름을 추가하는 방법은 레지스트리 보안을 참조하십시오.

2.5.4. 레지스트리 설정 덮어쓰기

실행 중인 레지스트리 컨테이너의 /config.yml 에 기본적으로 있는 통합 레지스트리의 기본 구성을 자체 사용자 지정 구성으로 재정의할 수 있습니다.

참고

이 파일의 업스트림 구성 옵션은 환경 변수를 사용하여 재정의할 수도 있습니다. 미들웨어 섹션 은 환경 변수를 사용하여 재정의할 수 있는 몇 가지 옵션만 있으므로 예외입니다. 특정 구성 옵션을 재정의하는 방법을 알아봅니다.

레지스트리 구성 파일의 관리를 직접 활성화하고 ConfigMap 을 사용하여 업데이트된 구성을 배포하려면 다음을 수행합니다.

  1. 레지스트리를 배포합니다.
  2. 필요에 따라 레지스트리 구성 파일을 로컬로 편집합니다. 레지스트리에 배포된 초기 YAML 파일은 아래에 제공됩니다. 지원되는 옵션 검토.

    레지스트리 설정 파일

    version: 0.1
    log:
      level: debug
    http:
      addr: :5000
    storage:
      cache:
        blobdescriptor: inmemory
      filesystem:
        rootdirectory: /registry
      delete:
        enabled: true
    auth:
      openshift:
        realm: openshift
    middleware:
      registry:
        - name: openshift
      repository:
        - name: openshift
          options:
            acceptschema2: true
            pullthrough: true
            enforcequota: false
            projectcachettl: 1m
            blobrepositorycachettl: 10m
      storage:
        - name: openshift
    openshift:
      version: 1.0
      metrics:
        enabled: false
        secret: <secret>

  3. 이 디렉터리의 각 파일의 콘텐츠를 보관하는 ConfigMap 을 생성합니다.

    $ oc create configmap registry-config \
        --from-file=</path/to/custom/registry/config.yml>/
  4. registry-config ConfigMap을 레지스트리 배포 구성에 볼륨으로 추가하여 /etc/docker/registry/ 에 사용자 정의 구성 파일을 마운트합니다.

    $ oc set volume dc/docker-registry --add --type=configmap \
        --configmap-name=registry-config -m /etc/docker/registry/
  5. 레지스트리의 배포 구성에 다음 환경 변수를 추가하여 이전 단계의 구성 경로를 참조하도록 레지스트리를 업데이트합니다.

    $ oc set env dc/docker-registry \
        REGISTRY_CONFIGURATION_PATH=/etc/docker/registry/config.yml

이 작업은 원하는 구성을 수행하기 위해 반복 프로세스로 수행할 수 있습니다. 예를 들어 문제를 해결하는 동안 구성이 일시적으로 업데이트되어 디버그 모드가 될 수 있습니다.

기존 구성을 업데이트하려면 다음을 수행합니다.

주의

이 절차에서는 현재 배포된 레지스트리 구성을 덮어씁니다.

  1. 로컬 레지스트리 구성 파일 config.yml 을 편집합니다.
  2. registry-config configmap을 삭제합니다.

    $ oc delete configmap registry-config
  3. 업데이트된 구성 파일을 참조하도록 configmap을 다시 생성합니다.

    $ oc create configmap registry-config\
        --from-file=</path/to/custom/registry/config.yml>/
  4. 업데이트된 구성을 읽기 위해 레지스트리를 재배포합니다.

    $ oc rollout latest docker-registry
작은 정보

소스 제어 리포지토리의 구성 파일을 유지 관리합니다.

2.5.5. 레지스트리 구성 참조

업스트림 Docker 배포 라이브러리에는 다양한 구성 옵션을 사용할 수 있습니다. 일부 구성 옵션이 지원되거나 활성화되지는 않습니다. 레지스트리 구성을 재정의할 때 이 섹션을 참조로 사용합니다.

참고

이 파일의 업스트림 구성 옵션은 환경 변수를 사용하여 재정의할 수도 있습니다. 그러나 미들웨어 섹션 은 환경 변수를 사용하여 재정의 되지 않을 수 있습니다. 특정 구성 옵션을 재정의하는 방법을 알아봅니다.

2.5.5.1. log

업스트림 옵션이 지원됩니다.

예제:

log:
  level: debug
  formatter: text
  fields:
    service: registry
    environment: staging
2.5.5.2. 후크

메일 후크는 지원되지 않습니다.

2.5.5.3. 스토리지

이 섹션에는 지원되는 레지스트리 스토리지 드라이버가 나열되어 있습니다. 자세한 내용은 컨테이너 이미지 레지스트리 설명서를 참조하십시오.

다음 목록에는 레지스트리의 구성 파일에서 구성해야 하는 스토리지 드라이버가 포함되어 있습니다.

일반 레지스트리 스토리지 구성 옵션이 지원됩니다. 자세한 내용은 컨테이너 이미지 레지스트리 설명서를 참조하십시오.

다음 스토리지 옵션은 파일 시스템 드라이버를 통해 구성해야 합니다.

참고

지원되는 영구 스토리지 드라이버에 대한 자세한 내용은 영구 스토리지 및 영구 스토리지 예제 구성을 참조하십시오.

일반 스토리지 구성 옵션

storage:
  delete:
    enabled: true 1
  redirect:
    disable: false
  cache:
    blobdescriptor: inmemory
  maintenance:
    uploadpurging:
      enabled: true
      age: 168h
      interval: 24h
      dryrun: false
    readonly:
      enabled: false

1
이미지 정리 제대로 작동하려면 이 항목이 필요합니다.
2.5.5.4. auth

인증 옵션은 변경할 수 없습니다. openshift 확장 기능은 지원되는 유일한 옵션입니다.

auth:
  openshift:
    realm: openshift
2.5.5.5. 미들웨어

리포지토리 미들웨어 확장을 사용하면 OpenShift Container Platform 및 이미지 프록시와의 상호 작용을 담당하는 OpenShift Container Platform 미들웨어를 구성할 수 있습니다.

middleware:
  registry:
    - name: openshift 1
  repository:
    - name: openshift 2
      options:
        acceptschema2: true 3
        pullthrough: true 4
        mirrorpullthrough: true 5
        enforcequota: false 6
        projectcachettl: 1m 7
        blobrepositorycachettl: 10m 8
  storage:
    - name: openshift 9
1 2 9
이러한 항목은 필수 항목입니다. 이를 통해 필요한 구성 요소가 로드됩니다. 이러한 값은 변경하지 않아야 합니다.
3
레지스트리에 내보내는 동안 매니페스트 스키마 v2 를 저장할 수 있습니다. 자세한 내용은 아래를 참조하십시오.
4
레지스트리가 원격 Blob의 프록시 역할을 할 수 있습니다. 자세한 내용은 아래를 참조하십시오.
5
나중에 빠른 액세스를 위해 원격 레지스트리에서 레지스트리 캐시 Blob을 제공할 수 있습니다. 미러링은 Blob이 처음으로 액세스할 때 시작됩니다. pullthrough 를 비활성화하면 옵션이 적용되지 않습니다.
6
타겟 프로젝트에 정의된 크기 제한을 초과하는 Blob 업로드를 방지합니다.
7
레지스트리에 캐시된 제한에 대한 만료 시간 제한입니다. 값이 낮을수록 제한 변경 사항이 레지스트리에 전파되는 데 걸리는 시간이 줄어듭니다. 그러나 레지스트리는 서버의 제한을 더 자주 쿼리하므로 푸시 속도가 느려집니다.
8
Blob과 리포지토리 간의 기억되는 연결에 대한 만료 시간 제한. 값이 클수록 빠른 조회 가능성이 높으며 더 효율적인 레지스트리 작업입니다. 반면 메모리 사용량은 증가하며 더 이상 액세스할 권한이 없는 사용자에게 이미지 계층을 제공할 위험이 있습니다.
2.5.5.5.1. S3 드라이버 설정

사용 중인 통합 레지스트리에서 지원하지 않는 S3 리전을 사용하려면 지역 검증 오류가 발생하지 않도록 regionendpoint 를 지정할 수 있습니다.

Amazon Simple Storage Service Storage 사용에 대한 자세한 내용은 Amazon S3을 스토리지 백엔드로 참조하십시오.

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

version: 0.1
log:
  level: debug
http:
  addr: :5000
storage:
  cache:
    blobdescriptor: inmemory
  delete:
    enabled: true
  s3:
    accesskey: BJKMSZBRESWJQXRWMAEQ
    secretkey: 5ah5I91SNXbeoUXXDasFtadRqOdy62JzlnOW1goS
    bucket: docker.myregistry.com
    region: eu-west-3
    regionendpoint: https://s3.eu-west-3.amazonaws.com
 auth:
  openshift:
    realm: openshift
middleware:
  registry:
    - name: openshift
  repository:
    - name: openshift
  storage:
    - name: openshift
참고

region 및 region endpoint 필드가 일관되게 표시되는지 확인합니다. 통합 레지스트리가 시작되지만 S3 스토리지에 아무 것도 읽거나 쓸 수 없습니다.

리전엔드 포인트는 Amazon S3과 다른 S3 스토리지를 사용하는 경우에도 유용할 수 있습니다.

2.5.5.5.2. CloudFront Middleware

AWS, uuid CDN 스토리지 공급자를 지원하기 위해 EventListener 미들웨어 확장을 추가할 수 있습니다. CloudFront 미들웨어로 이미지 컨텐츠의 배포를 가속화할 수 있습니다. Blob은 전 세계 여러 에지 위치에 배포됩니다. 클라이언트는 항상 대기 시간이 가장 짧은 에지로 이동합니다.

참고

chronyd 미들웨어 확장S3 스토리지에서만 사용할 수 있습니다. Blob 서비스 중에만 사용됩니다. 따라서 Blob 다운로드만 업로드하지 않고 속도를 높일 수 있습니다.

다음은 CloudFront 미들웨어를 사용한 S3 스토리지 드라이버의 최소 구성 예입니다.

version: 0.1
log:
  level: debug
http:
  addr: :5000
storage:
  cache:
    blobdescriptor: inmemory
  delete:
    enabled: true
  s3: 1
    accesskey: BJKMSZBRESWJQXRWMAEQ
    secretkey: 5ah5I91SNXbeoUXXDasFtadRqOdy62JzlnOW1goS
    region: us-east-1
    bucket: docker.myregistry.com
auth:
  openshift:
    realm: openshift
middleware:
  registry:
    - name: openshift
  repository:
    - name: openshift
  storage:
    - name: cloudfront 2
      options:
        baseurl: https://jrpbyn0k5k88bi.cloudfront.net/ 3
        privatekey: /etc/docker/cloudfront-ABCEDFGHIJKLMNOPQRST.pem 4
        keypairid: ABCEDFGHIJKLMNOPQRST 5
    - name: openshift
1
S3 스토리지는 CloudFront 미들웨어와 관계없이 동일한 방식으로 구성해야 합니다.
2
CloudFront 스토리지 미들웨어는 OpenShift 미들웨어보다 먼저 나열해야 합니다.
3
CloudFront 기본 URL입니다. AWS 관리 콘솔에서 이 값은 CloudFront 배포의 도메인 이름으로 나열됩니다.
4
파일 시스템에 있는 AWS 개인 키의 위치입니다. Amazon EC2 키 쌍과 혼동되지 않아야 합니다. 신뢰할 수 있는 서명자의 CloudFront 키 쌍 생성에 대한 AWS 설명서 를 참조하십시오. 파일은 레지스트리 포드에 시크릿 으로 마운트해야 합니다.
5
Cloudfront 키 쌍의 ID입니다.
2.5.5.5.3. 미들웨어 구성 옵션 덮어쓰기

미들웨어 섹션은 환경 변수를 사용하여 재정의할 수 없습니다. 하지만 몇 가지 예외가 있습니다. 예를 들면 다음과 같습니다.

middleware:
  repository:
    - name: openshift
      options:
        acceptschema2: true 1
        pullthrough: true 2
        mirrorpullthrough: true 3
        enforcequota: false 4
        projectcachettl: 1m 5
        blobrepositorycachettl: 10m 6
1
매니페스트 붙여넣기 요청에서 매니페스트 스키마 v2를 수락할 수 있는 부울 환경 변수 REGISTRY_MIDDLE_REPOSITORY_OPENSHIFT_ACCEPTSCHEMA2 로 재정의할 수 있는 구성 옵션입니다. 인식된 값은 truefalse 입니다(아래의 다른 모든 부울 변수에 적용됩니다).
2
원격 리포지토리에 프록시 모드를 활성화하는 부울 환경 변수 REGISTRY_MIDDLE_REPOSITORY_OPENSHIFT_PULLTHROUGH 로 재정의할 수 있는 구성 옵션입니다.
3
부울 환경 변수 REGISTRY_MIDDLE_REPOSITORY_OPENSHIFT_MIRRORPULLTHROUGH 로 재정의할 수 있는 구성 옵션으로, 원격 Blob을 제공하는 경우 레지스트리에서 Blob을 로컬로 미러링하도록 지시합니다.
4
할당량 적용을 켜거나 끌 수 있는 부울 환경 변수 REGISTRY_MIDDLE_REPOSITORY_OPENSHIFT_ENFORCEQUOTA 로 재정의할 수 있는 구성 옵션입니다. 기본적으로 할당량 적용은 꺼져 있습니다.
5
REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_PROJECTCACHETTL 환경 변수로 재정의할 수 있는 구성 옵션으로 프로젝트 할당량 오브젝트에 대한 제거 시간 제한을 지정합니다. 유효한 기간 문자열(예: 2m)이 걸립니다. 비어 있는 경우 기본 시간 초과가 발생합니다. 0(0m)이면 캐싱이 비활성화됩니다.
6
환경 변수 REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_BLOBREPOSITORYCACHETTL 으로 재정의할 수 있는 구성 옵션으로 blob과 리포지토리를 포함하는 연결에 대한 제거 시간 제한을 지정합니다. 값의 형식은 projectcachettl 사례와 동일합니다.
2.5.5.5.4. 이미지 Pullthrough

활성화된 경우 blob이 로컬로 존재하지 않는 한 레지스트리는 원격 레지스트리에서 요청된 Blob 가져오기를 시도합니다. 원격 후보는 클라이언트에서 가져온 이미지 스트림 상태에 저장된 DockerImage 항목에서 계산됩니다. 이러한 항목의 모든 원격 레지스트리 참조는 Blob을 찾을 때까지 차례로 시도됩니다.

pullthrough는 이미지 스트림 태그가 가져오는 이미지에 대해 존재하는 경우에만 발생합니다. 예를 들어 가져온 이미지가 docker-registry.default.svc:5000/yourproject/yourimage:prod 인 경우 레지스트리는 your project 프로젝트에서 your image:prod 라는 이미지 스트림 태그를 찾습니다. 이미지를 찾으면 해당 이미지 스트림 태그와 연결된 dockerImageReference 를 사용하여 이미지를 가져오려고 합니다.

pullthrough를 수행할 때 레지스트리는 참조되는 이미지 스트림 태그와 연결된 프로젝트에서 찾은 가져오기 자격 증명을 사용합니다. 이 기능을 사용하면 이미지를 참조하는 이미지 스트림 태그에 액세스할 수 있는 인증 정보가 없는 레지스트리에 있는 이미지를 가져올 수도 있습니다.

가져오기를 수행하는 외부 레지스트리를 신뢰하기 위한 적절한 인증서가 레지스트리에 있는지 확인해야 합니다. 인증서를 포드의 /etc/pki/tls/certs 디렉터리에 배치해야 합니다. 구성 맵 또는 시크릿 을 사용하여 인증서를 마운트할 수 있습니다. 전체 /etc/pki/tls/certs 디렉토리를 교체해야 합니다. 새 인증서를 포함하고 마운트하는 시크릿 또는 구성 맵에 시스템 인증서를 교체해야 합니다.

기본적으로 이미지 스트림 태그는 소스 의 참조 정책 유형을 사용합니다. 즉, 이미지 스트림 참조가 이미지 가져오기 사양으로 확인되면 사용된 사양이 이미지 소스를 가리킵니다. 외부 레지스트리에서 호스팅되는 이미지의 경우 외부 레지스트리가 되며, 결과적으로 리소스는 외부 레지스트리에서 이미지를 참조하고 가져옵니다. 예를 들어 registry.redhat.io/openshift3/jenkins-2-rhel7 및 pullthrough는 적용되지 않습니다. 이미지 스트림을 참조하는 리소스가 내부 레지스트리를 가리키는 가져오기 사양을 사용하도록 하려면 이미지 스트림 태그에서 참조 정책 유형을 Local 으로 사용해야 합니다. 자세한 내용은 참조 정책에서 확인할 수 있습니다.

이 기능은 기본적으로 활성화되어 있습니다. 그러나 구성 옵션을 사용하여 비활성화할 수 있습니다.

기본적으로 mirrorpullthrough 를 비활성화하지 않는 한 이러한 방식으로 제공되는 모든 원격 Blob은 후속 빠른 액세스를 위해 로컬에 저장됩니다. 이 미러링 기능의 단점은 스토리지 사용량이 증가합니다.

참고

클라이언트가 Blob의 한 바이트 이상을 가져오려고 할 때 미러링이 시작됩니다. 실제로 필요하기 전에 특정 이미지를 통합 레지스트리로 미리 가져오려면 다음 명령을 실행합니다.

$ oc get imagestreamtag/${IS}:${TAG} -o jsonpath='{ .image.dockerImageLayers[*].name }' | \
  xargs -n1 -I {} curl -H "Range: bytes=0-1" -u user:${TOKEN} \
  http://${REGISTRY_IP}:${PORT}/v2/default/mysql/blobs/{}
참고

이 OpenShift Container Platform 미러링 기능은 유사하지만 고유한 기능인 캐시 기능을 통해 업스트림 레지스트리 가져오기 와 혼동해서는 안 됩니다.

2.5.5.5.5. 매니페스트 스키마 v2 지원

각 이미지에 해당 Blob, 실행 지침 및 추가 메타데이터를 설명하는 매니페스트가 있습니다. 매니페스트는 버전이 지정되며 각 버전은 시간이 지남에 따라 구조와 필드가 서로 다릅니다. 동일한 이미지는 여러 매니페스트 버전으로 표시할 수 있습니다. 하지만 각 버전에는 다른 다이제스트가 있습니다.

레지스트리는 현재 매니페스트 v2 스키마 1 (schema1) 및 매니페스트 v2 스키마 2( schema 2)를 지원합니다. 전자는 더 이상 사용되지 않지만 연장된 시간 동안 지원됩니다.

기본 구성은 schema2 를 저장하는 것입니다.

다양한 Docker 클라이언트와의 호환성 문제가 주의해야 합니다.

  • 버전 1.9 이상의 Docker 클라이언트는 schema1 만 지원합니다. 이 클라이언트 풀 또는 푸시는 이 레거시 스키마의 모든 매니페스트입니다.
  • 버전 1.10의 Docker 클라이언트는 schema 1 및 schema 2 를 모두 지원합니다. 최신 스키마를 지원하는 경우 기본적으로 후자를 레지스트리로 푸시합니다.

schema1 이 있는 이미지를 저장하는 레지스트리는 항상 변경되지 않은 상태로 클라이언트로 반환됩니다. Schema2 는 변경되지 않고 최신 Docker 클라이언트로만 전송됩니다. 이전 버전의 경우 on-the-fly를 schema1 로 변환합니다.

이것은 큰 결과를 가져옵니다. 예를 들어 최신 Docker 클라이언트에서 레지스트리에 푸시된 이미지를 다이제스트에서 이전 Docker에서 가져올 수 없습니다. 저장된 이미지의 매니페스트는 schema2 이고 다이제스트를 사용하여 이 매니페스트 버전만 가져올 수 있기 때문입니다.

모든 레지스트리 클라이언트가 schema2 를 지원한다고 확신하면 레지스트리에서 안전하게 지원을 활성화할 수 있습니다. 특정 옵션은 위의 미들웨어 구성 참조를 참조하십시오.

2.5.5.6. OpenShift

이 섹션에서는 OpenShift Container Platform과 관련된 기능에 대한 전역 설정 구성을 검토합니다. 향후 릴리스에서는 Middleware 섹션의 openshift관련 설정이 더 이상 사용되지 않습니다.

현재 이 섹션에서는 레지스트리 메트릭 컬렉션을 구성할 수 있습니다.

openshift:
  version: 1.0 1
  server:
    addr: docker-registry.default.svc 2
  metrics:
    enabled: false 3
    secret: <secret> 4
  requests:
    read:
      maxrunning: 10 5
      maxinqueue: 10 6
      maxwaitinqueue 2m 7
    write:
      maxrunning: 10 8
      maxinqueue: 10 9
      maxwaitinqueue 2m 10
1
이 섹션의 구성 버전을 지정하는 필수 항목입니다. 지원되는 유일한 값은 1.0 입니다.
2
레지스트리의 호스트 이름입니다. 마스터에 구성된 동일한 값으로 설정해야 합니다. 환경 변수 REGISTRY_OPENSHIFT_SERVER_ADDR 로 재정의할 수 있습니다.
3
지표 컬렉션을 활성화하려면 true 로 설정할 수 있습니다. 부울 환경 변수 REGISTRY_OPENSHIFT_METRICS_ENABLED 로 재정의할 수 있습니다.
4
클라이언트 요청을 인증하는 데 사용되는 시크릿입니다. 지표 클라이언트는 권한 부여 헤더에서 전달자 토큰으로 사용해야 합니다. 환경 변수 REGISTRY_OPENSHIFT_METRICS_SECRET 로 재정의할 수 있습니다.
5
최대 동시 가져오기 요청 수입니다. 환경 변수 REGISTRY_OPENSHIFT_REQUESTS_READ_MAXRUNNING 으로 재정의할 수 있습니다. 0은 제한이 없음을 나타냅니다.
6
대기 중인 최대 가져오기 요청 수입니다. 환경 변수 REGISTRY_OPENSHIFT_REQUESTS_READ_MAXINQUEUE 로 재정의할 수 있습니다. 0은 제한이 없음을 나타냅니다.
7
가져오기 요청이 거부되기 전에 대기열에서 대기할 수 있는 최대 시간입니다. 환경 변수 REGISTRY_OPENSHIFT_REQUESTS_READ_MAXWAITINQUEUE 로 재정의할 수 있습니다. 0은 제한이 없음을 나타냅니다.
8
최대 동시 푸시 요청 수입니다. 환경 변수 REGISTRY_OPENSHIFT_REQUESTS_WRITE_MAXRUNNING 으로 재정의할 수 있습니다. 0은 제한이 없음을 나타냅니다.
9
대기 중인 최대 푸시 요청 수입니다. 환경 변수 REGISTRY_OPENSHIFT_REQUESTS_WRITE_MAXINQUEUE 로 재정의할 수 있습니다. 0은 제한이 없음을 나타냅니다.
10
내보내기 요청이 거부되기 전에 대기열에서 대기할 수 있는 최대 시간입니다. 환경 변수 REGISTRY_OPENSHIFT_REQUESTS_WRITE_MAXWAITINQUEUE 로 재정의할 수 있습니다. 0은 제한이 없음을 나타냅니다.

사용 정보는 레지스트리 지표 액세스를 참조하십시오.

2.5.5.7. 보고

보고는 지원되지 않습니다.

2.5.5.8. HTTP

업스트림 옵션이 지원됩니다. 환경 변수를 통해 이러한 설정을 변경하는 방법을 알아봅니다. tls 섹션만 변경해야 합니다. 예를 들면 다음과 같습니다.

http:
  addr: :5000
  tls:
    certificate: /etc/secrets/registry.crt
    key: /etc/secrets/registry.key
2.5.5.9. 알림

업스트림 옵션이 지원됩니다. REST API 참조 는 보다 포괄적인 통합 옵션을 제공합니다.

예제:

notifications:
  endpoints:
    - name: registry
      disabled: false
      url: https://url:port/path
      headers:
        Accept:
          - text/plain
      timeout: 500
      threshold: 5
      backoff: 1000
2.5.5.10. Redis

Redis는 지원되지 않습니다.

2.5.5.11. 상태

업스트림 옵션이 지원됩니다. 레지스트리 배포 구성은 /healthz 에서 통합된 상태 점검을 제공합니다.

2.5.5.12. proxy

프록시 설정은 활성화해서는 안 됩니다. 이 기능은 OpenShift Container Platform 리포지토리 미들웨어 확장,pullthrough: true 로 제공됩니다.

2.5.5.13. 캐시

통합 레지스트리는 데이터를 적극적으로 캐시하여 외부 리소스 속도가 느린 호출 수를 줄입니다. 두 개의 캐시가 있습니다.

  1. Blob 메타데이터를 캐시하는 데 사용되는 스토리지 캐시입니다. 이 캐시에는 만료 시간이 없으며 명시적으로 삭제될 때까지 데이터가 있습니다.
  2. 애플리케이션 캐시에는 Blob과 리포지토리 간의 연결이 포함됩니다. 이 캐시의 데이터에는 만료 시간이 있습니다.

캐시를 완전히 해제하려면 구성을 변경해야 합니다.

version: 0.1
log:
  level: debug
http:
  addr: :5000
storage:
  cache:
    blobdescriptor: "" 1
openshift:
  version: 1.0
  cache:
    disabled: true 2
    blobrepositoryttl: 10m
1
스토리지 백엔드에서 액세스한 메타데이터의 캐시를 비활성화합니다. 이 캐시가 없으면 레지스트리 서버는 메타데이터의 백엔드에 지속적으로 액세스합니다.
2
Blob 및 리포지토리 연결이 포함된 에서 캐시를 비활성화합니다. 이 캐시가 없으면 레지스트리 서버가 마스터 API에서 데이터를 계속 재쿼터하고 연관을 다시 계산합니다.

2.6. 확인된 문제

2.6.1. 개요

다음은 통합 레지스트리를 배포하거나 사용할 때 알려진 문제입니다.

2.6.2. 레지스트리 가져오기를 사용한 동시 빌드

로컬 docker-registry 배포에서는 추가 로드를 사용합니다. 기본적으로 registry.redhat.io 의 콘텐츠를 캐시합니다. STI 빌드용 registry.redhat.io 의 이미지가 로컬 레지스트리에 저장됩니다. 로컬 docker-registry 에서 가져오기를 시도합니다. 결과적으로 극도의 동시 빌드로 인해 가져오기에 대한 시간 초과가 발생하고 빌드가 실패할 수 있는 상황이 있습니다. 문제를 완화하려면 docker-registry 배포를 둘 이상의 복제본으로 스케일링합니다. 빌더 Pod의 로그에서 시간 초과를 확인합니다.

2.6.3. 공유 NFS 볼륨을 사용하여 확장 레지스트리가 포함된 이미지 푸시 오류

공유 NFS 볼륨과 함께 확장된 레지스트리를 사용하는 경우 이미지를 푸시하는 동안 다음 오류 중 하나가 표시될 수 있습니다.

  • 다이제스트 유효하지 않음: 제공된 다이제스트가 업로드된 콘텐츠와 일치하지 않습니다
  • Blob 업로드 알 수 없음
  • Blob 업로드가 잘못되었습니다

이러한 오류는 Docker에서 이미지를 푸시하려고 할 때 내부 레지스트리 서비스에서 반환됩니다. 이러한 원인은 노드에서 파일 속성의 동기화에서 발생합니다. NFS 클라이언트 측 캐싱, 네트워크 대기 시간 및 계층 크기와 같은 요인은 모두 기본 라운드 로빈 로드 밸런싱 구성을 사용하여 이미지를 푸시할 때 발생할 수 있는 잠재적인 오류에 기여할 수 있습니다.

다음 단계를 수행하여 이러한 실패 가능성을 최소화할 수 있습니다.

  1. docker-registry 서비스의 sessionAffinityClientIP 로 설정되어 있는지 확인합니다.

    $ oc get svc/docker-registry --template='{{.spec.sessionAffinity}}'

    그러면 최근 OpenShift Container Platform 버전에서 기본값인 ClientIP 가 반환되어야 합니다. 그렇지 않은 경우 변경합니다.

    $ oc patch svc/docker-registry -p '{"spec":{"sessionAffinity": "ClientIP"}}'
  2. NFS 서버에 있는 레지스트리 볼륨의 NFS 내보내기 줄에 no_wdelay 옵션이 나열되어 있는지 확인합니다. no_wdelay 옵션을 사용하면 서버가 쓰기를 지연시키지 못하므로 레지스트리 요구 사항인 쓰기 후 읽기 일관성이 크게 향상됩니다.
중요

테스트 결과 RHEL NFS 서버를 컨테이너 이미지 레지스트리의 스토리지 백엔드로 사용하는 데 문제가 있는 것으로 표시됩니다. 여기에는 OpenShift Container Registry 및 Quay가 포함됩니다. 따라서 RHEL NFS 서버를 사용하여 핵심 서비스에서 사용하는 PV를 백업하는 것은 권장되지 않습니다.

마켓플레이스의 다른 NFS 구현에는 이러한 문제가 나타나지 않을 수 있습니다. 이러한 OpenShift 핵심 구성 요소에 대해 완료된 테스트에 대한 자세한 내용은 개별 NFS 구현 벤더에 문의하십시오.

2.6.4. "not found" 오류로 내부 관리 이미지 가져오기 실패

이 오류는 가져온 이미지를 가져오는 이미지 스트림과 다른 이미지 스트림으로 푸시할 때 발생합니다. 이는 빌드된 이미지를 임의의 이미지 스트림으로 다시 태그하기 때문에 발생합니다.

$ oc tag srcimagestream:latest anyproject/pullimagestream:latest

그런 다음 다음과 같은 이미지 참조를 사용하여 Playbook에서 가져오십시오.

internal.registry.url:5000/anyproject/pullimagestream:latest

수동 Docker 가져오기 동안 유사한 오류가 발생합니다.

Error: image anyproject/pullimagestream:latest not found

이 문제를 방지하려면 내부 관리 이미지의 태그 지정을 완전히 방지하거나 빌드된 이미지를 원하는 네임스페이스에 수동으로 다시 푸시합니다.

2.6.5. S3 스토리지에서 "500개의 내부 서버 오류"로 이미지 푸시 실패

레지스트리가 S3 스토리지 백엔드에서 실행될 때 보고되는 문제가 있습니다. 컨테이너 이미지 레지스트리로 푸시하는 데 다음 오류가 발생하는 경우가 있습니다.

Received unexpected HTTP status: 500 Internal Server Error

이 문제를 디버깅하려면 레지스트리 로그를 확인해야 합니다. 여기에서 실패한 푸시 시 발생하는 유사한 오류 메시지를 찾습니다.

time="2016-03-30T15:01:21.22287816-04:00" level=error msg="unknown error completing upload: driver.Error{DriverName:\"s3\", Enclosed:(*url.Error)(0xc20901cea0)}" http.request.method=PUT
...
time="2016-03-30T15:01:21.493067808-04:00" level=error msg="response completed with error" err.code=UNKNOWN err.detail="s3: Put https://s3.amazonaws.com/oso-tsi-docker/registry/docker/registry/v2/blobs/sha256/ab/abe5af443833d60cf672e2ac57589410dddec060ed725d3e676f1865af63d2e2/data: EOF" err.message="unknown error" http.request.method=PUT
...
time="2016-04-02T07:01:46.056520049-04:00" level=error msg="error putting into main store: s3: The request signature we calculated does not match the signature you provided. Check your key and signing method." http.request.method=PUT
atest

이러한 오류가 표시되면 Amazon S3 지원에 문의하십시오. 지역이나 특정 버킷에 문제가 있을 수 있습니다.

2.6.6. 이미지 정리 실패

이미지를 정리할 때 다음 오류가 발생하면 다음을 수행합니다.

BLOB sha256:49638d540b2b62f3b01c388e9d8134c55493b1fa659ed84e97cb59b87a6b8e6c error deleting blob

레지스트리 로그에 는 다음 정보가 포함되어 있습니다.

error deleting blob \"sha256:49638d540b2b62f3b01c388e9d8134c55493b1fa659ed84e97cb59b87a6b8e6c\": operation unsupported

즉, 사용자 지정 구성 파일에는 storage 섹션에 필수 항목, 즉 storage:delete:enabledtrue로 설정되어 있지 않습니다. 이미지를 추가하고 레지스트리를 다시 배포한 다음 이미지 정리 작업을 반복합니다.

3장. 라우터 설정

3.1. 라우터 개요

3.1.1. 라우터 정보

클러스터로 트래픽을 가져오는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 OpenShift Container Platform 라우터 를 OpenShift Container Platform 설치의 서비스로 향하는 외부 트래픽의 진입 지점으로 사용하는 것입니다.

OpenShift Container Platform은 다음 라우터 플러그인을 제공하고 지원합니다.

  • HAProxy 템플릿 라우터 는 기본 플러그인입니다. openshift3/ose-haproxy-router 이미지를 사용하여 OpenShift Container Platform의 컨테이너 내부에서 템플릿 라우터 플러그인과 함께 HAProxy 인스턴스를 실행합니다. 현재 SNI를 통해 HTTP(S) 트래픽 및 TLS 지원 트래픽을 지원합니다. 개인 IP에서만 수신 대기하는 대부분의 컨테이너와 달리 라우터의 컨테이너는 호스트 네트워크 인터페이스에서 수신 대기합니다. 라우터는 경로 이름에 대한 외부 요청을 경로와 연결된 서비스로 식별된 실제 포드의 IP로 프록시합니다.
  • F5 라우터 는 사용자 환경의 기존 F5 BIG-IP® 시스템과 통합되어 경로를 동기화합니다. F5 iControl REST API를 사용하려면 F5 BIG-IP® 버전 11.4 이상이 필요합니다.
  • 기본 HAProxy 라우터 배포
  • 사용자 지정 HAProxy 라우터 배포
  • PROXY 프로토콜을 사용하도록 HAProxy 라우터 구성
  • 경로 시간 제한 구성

3.1.2. 라우터 서비스 계정

OpenShift Container Platform 클러스터를 배포하기 전에 클러스터 설치 중에 자동으로 생성되는 라우터의 서비스 계정이 있어야 합니다. 이 서비스 계정에는 호스트 포트를 지정할 수 있는 SCC( 보안 컨텍스트 제약 조건)에 대한 권한이 있습니다.

3.1.2.1. 액세스 권한 레이블

예를 들어 라우터 shard 생성 시 네임스페이스 레이블을 사용하는 경우 라우터 의 서비스 계정에 cluster-reader 권한이 있어야 합니다.

$ oc adm policy add-cluster-role-to-user \
    cluster-reader \
    system:serviceaccount:default:router

서비스 계정이 있는 경우 기본 HAProxy 라우터 또는 사용자 지정된 HAProxy 라우터설치를 진행할 수 있습니다.

3.2. 기본 HAProxy 라우터 사용

3.2.1. 개요

oc adm router 명령은 새 설치에서 라우터를 설정하는 작업을 간소화하기 위해 관리자 CLI와 함께 제공됩니다. oc adm router 명령은 서비스 및 배포 구성 오브젝트를 만듭니다. service -account 옵션을 사용하여 라우터가 마스터에 연결하는 데 사용할 서비스 계정을 지정합니다.

라우터 서비스 계정은 사전에 생성하거나 oc adm router --service-account 명령으로 만들 수 있습니다.

OpenShift Container Platform 구성 요소 간 모든 형식의 통신은 TLS에 의해 보호되며 다양한 인증서 및 인증 방법을 사용합니다. default -certificate .pem 형식 파일을 제공하거나 oc adm router 명령으로 파일을 생성할 수 있습니다. 경로가 생성되면 사용자는 라우터가 경로를 처리할 때 사용할 경로 인증서를 제공할 수 있습니다.

중요

라우터를 삭제할 때 배포 구성, 서비스 및 시크릿도 삭제되었는지 확인합니다.

라우터는 특정 노드에 배포됩니다. 따라서 클러스터 관리자와 외부 네트워크 관리자가 라우터를 실행할 IP 주소와 라우터에서 처리할 트래픽을 보다 쉽게 조정할 수 있습니다. 라우터는 노드 선택기를 사용하여 특정 노드에 배포됩니다.

중요

라우터는 기본적으로 호스트 네트워킹을 사용하며 호스트의 모든 인터페이스의 포트 80 및 443에 직접 연결합니다. 라우터를 80/443을 사용할 수 있고 다른 서비스에서 사용하지 않는 호스트로 제한하고 노드 선택기스케줄러 구성을 사용하여 설정합니다. 예를 들어 라우터와 같은 서비스를 실행하도록 인프라 노드를 전용으로 지정하여 이를 수행할 수 있습니다.

중요

라우터와 함께 별도의 openshift-router 서비스 계정을 사용하는 것이 좋습니다. 이 작업은 --service-account 플래그를 사용하여 oc adm router 명령에 제공할 수 있습니다.

$ oc adm router --dry-run --service-account=router 1
1
--service-accountopenshift-router서비스 계정 이름입니다.
중요

oc adm 라우터를 사용하여 생성된 라우터 포드에는 노드가 배포될 라우터 포드를 충족해야 한다는 기본 리소스 요청이 있습니다. 인프라 구성 요소의 안정성을 높이기 위해 기본 리소스 요청은 리소스 요청 없이 포드 위의 라우터 Pod의 QoS 계층을 늘리는 데 사용됩니다. 기본값은 배포되는 기본 라우터에 필요한 관찰된 최소 리소스를 나타내며 라우터 배포 구성에서 편집할 수 있으며 라우터 부하에 따라 늘릴 수 있습니다.

3.2.2. 라우터 생성

라우터가 없는 경우 다음을 실행하여 라우터를 생성합니다.

$ oc adm router <router_name> --replicas=<number> --service-account=router --extended-logging=true

고가용성 구성이 생성되지 않는 한 --replicas 는 일반적으로 1 입니다.

--extended-logging=true 는 HAProxy에서 생성한 로그를 syslog 컨테이너로 전달하도록 라우터를 구성합니다.

라우터의 호스트 IP 주소를 찾으려면 다음을 수행합니다.

$ oc get po <router-pod>  --template={{.status.hostIP}}

라우터 shard를 사용하여 라우터가 특정 네임스페이스 또는 경로로 필터링되었는지 확인하거나 라우터 생성 후 환경 변수를 설정할 수도 있습니다. 이 경우 각 shard에 대한 라우터를 생성합니다.

3.2.3. 기타 기본 라우터 명령

기본 라우터 확인
router라는 기본 라우터 서비스 계정은 클러스터 설치 중에 자동으로 생성됩니다. 이 계정이 이미 있는지 확인하려면 다음을 수행하십시오.
$ oc adm router --dry-run --service-account=router
기본 라우터 보기
기본 라우터가 생성된 경우 어떻게 표시되는지 확인하려면 다음을 수행하십시오.
$ oc adm router --dry-run -o yaml --service-account=router
HAProxy 로그를 전달하도록 라우터 구성
HAProxy에서 생성된 로그를 rsyslog 사이드카 컨테이너로 전달하도록 라우터를 구성할 수 있습니다. extended -logging=true 매개 변수는 syslog 컨테이너를 추가하여 HAProxy 로그를 표준 출력에 전달합니다.
$ oc adm router --extended-logging=true

다음 예제는 --extended-logging=true 를 사용하는 라우터의 구성입니다.

$ oc get pod router-1-xhdb9 -o yaml
apiVersion: v1
kind: Pod
spec:
  containers:
  - env:

    ....

    - name: ROUTER_SYSLOG_ADDRESS 1
      value: /var/lib/rsyslog/rsyslog.sock

    ....

 - command: 2
   - /sbin/rsyslogd
   - -n
   - -i
   - /tmp/rsyslog.pid
   - -f
   - /etc/rsyslog/rsyslog.conf
   image: registry.redhat.io/openshift3/ose-haproxy-router:v3.11.188
   imagePullPolicy: IfNotPresent
   name: syslog
1
extended -logging=true 매개 변수는 로그에 사용할 소켓 파일을 생성합니다.
2
extended -logging=true 매개변수는 라우터에 컨테이너를 추가합니다. 컨테이너에서 rsyslog 프로세스는 /sbin/rsyslogd -n -i /tmp/rsyslog.pid -f /etc/rsyslog/rsyslog.conf 로 실행되고 있습니다.

다음 명령을 사용하여 HAProxy 로그를 확인합니다.

$ oc set env dc/test-router ROUTER_LOG_LEVEL=info 1
$ oc logs -f <pod-name> -c syslog 2
1
로그 수준을 info 또는 debug 로 설정합니다. 기본값은 warning 입니다.
2
로그를 보려면 라우터 포드의 이름을 지정합니다.

HAProxy 로그는 다음 형식을 취합니다.

2020-04-14T03:05:36.629527+00:00 test-311-node-1 haproxy[43]: 10.0.151.166:59594 [14/Apr/2020:03:05:36.627] fe_no_sni~ be_secure:openshift-console:console/pod:console-b475748cb-t6qkq:console:10.128.0.5:8443 0/0/1/1/2 200 393 - - --NI 2/1/0/1/0 0/0 "HEAD / HTTP/1.1"
2020-04-14T03:05:36.633024+00:00 test-311-node-1 haproxy[43]: 10.0.151.166:59594 [14/Apr/2020:03:05:36.528] public_ssl be_no_sni/fe_no_sni 95/1/104 2793 -- 1/1/0/0/0 0/0
라벨이 지정된 노드에 라우터 배포
지정된 노드 레이블 과 일치하는 모든 노드에 라우터를 배포하려면 다음을 수행합니다.
$ oc adm router <router_name> --replicas=<number> --selector=<label> \
    --service-account=router

예를 들어 router 이라는 라우터를 생성하고 node-role.kubernetes.io/infra=true로 레이블이 지정된 노드에 배치하려면 다음을 수행합니다.

$ oc adm router router --replicas=1 --selector='node-role.kubernetes.io/infra=true' \
  --service-account=router

클러스터 설치 중에 openshift_router_selectoropenshift_registry_selector Ansible 설정은 기본적으로 node-role.kubernetes.io/infra=true 로 설정됩니다. 기본 라우터 및 레지스트리는 노드가 node-role.kubernetes.io/infra=true 레이블과 일치하는 경우에만 자동으로 배포됩니다.

라벨 업데이트에 대한 자세한 내용은 노드에서 라벨 업데이트를 참조하십시오.

스케줄러 정책에 따라 여러 개의 인스턴스가 여러 호스트에서 생성됩니다.

다른 라우터 이미지 사용
다른 라우터 이미지를 사용하고 사용되는 라우터 구성을 보려면 다음을 수행합니다.
$ oc adm router <router_name> -o <format> --images=<image> \
    --service-account=router

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

$ oc adm router region-west -o yaml --images=myrepo/somerouter:mytag \
    --service-account=router

3.2.4. 특정 라우터로 경로 필터링

ROUTE_LABELS 환경 변수를 사용하면 특정 라우터에서만 사용하도록 경로를 필터링할 수 있습니다.

예를 들어 여러 라우터와 100개의 경로가 있는 경우 레이블을 경로에 연결하여 한 라우터에서 이를 처리하도록 하는 반면 나머지는 다른 라우터에서 처리할 수 있습니다.

  1. 라우터를 만든ROUTE_LABELS 환경 변수를 사용하여 라우터에 태그를 지정합니다.

    $ oc set env dc/<router=name>  ROUTE_LABELS="key=value"
  2. 원하는 경로에 라벨을 추가합니다.

    oc label route <route=name> key=value
  3. 레이블이 경로에 연결되었는지 확인하려면 경로 구성을 확인합니다.

    $ oc describe route/<route_name>
최대 동시 연결 수 설정
라우터는 기본적으로 최대 20000개의 연결을 처리할 수 있습니다. 요구 사항에 따라 해당 제한을 변경할 수 있습니다. 연결이 너무 적으면 상태 점검이 작동하지 않으므로 불필요한 재시작이 발생합니다. 최대 연결 수를 지원하도록 시스템을 구성해야 합니다. 'sysctl fs.nr_open''sysctl fs.file-max' 에 표시된 제한은 충분히 커야 합니다. 그렇지 않으면 HAproxy가 시작되지 않습니다.

라우터가 생성되면 --max-connections= 옵션은 원하는 제한을 설정합니다.

$ oc adm router --max-connections=10000   ....

라우터의 배포 구성에서 ROUTER_MAX_CONNECTIONS 환경 변수를 편집하여 값을 변경합니다. 라우터 포드는 새 값으로 다시 시작됩니다. ROUTER_MAX_CONNECTIONS 가 없으면 기본값 20000이 사용됩니다.

참고

연결에는 프론트엔드 및 내부 백엔드가 포함됩니다. 두 개의 커넥션으로 계산됩니다. 생성하려는 연결 수보다 두 배로 ROUTER_MAX_CONNECTIONS 를 설정해야 합니다.

3.2.5. HAProxy Strict SNI

HAProxy S tric-sni 는 라우터 배포 구성의 ROUTER_STRICT_SNI 환경 변수를 통해 제어할 수 있습니다. 또한 --strict-sni 명령줄 옵션을 사용하여 라우터를 만들 때 설정할 수 있습니다.

$ oc adm router --strict-sni

3.2.6. TLS 암호 제품군

라우터를 만들 때 --ciphers 옵션을 사용하여 라우터 암호화 제품군 을 설정합니다.

$ oc adm router --ciphers=modern   ....

값은 modern,intermediate 또는 old 이며 기본값은 intermediate 입니다. 또는 ":"로 구분된 암호 집합을 제공할 수 있습니다. 암호는 다음을 통해 표시되는 세트의 암호여야 합니다.

$ openssl ciphers

또는 기존 라우터에 ROUTER_CIPHERS 환경 변수를 사용합니다.

3.2.7. 상호 TLS 인증

라우터 및 백엔드 서비스에 대한 클라이언트 액세스는 상호 TLS 인증을 사용하여 제한할 수 있습니다. 라우터는 인증된 세트에 없는 클라이언트의 요청을 거부합니다. 상호 TLS 인증은 클라이언트 인증서에 구현되며 인증서를 발급한 CA(인증 기관), 인증서 폐기 목록 및/또는 모든 인증 대상 필터를 기반으로 제어할 수 있습니다. 라우터를 생성할 때 상호 tls 구성 옵션 -- mutual-tls-auth,--mutual-tls-auth-ca, -- mutual-tls-auth-filter 를 사용합니다.

$ oc adm router --mutual-tls-auth=required  \
                --mutual-tls-auth-ca=/local/path/to/cacerts.pem   ....

mutual -tls-auth 값은 required,optional 또는 none 이며 기본값으로 none 입니다. mutual -tls-auth-ca 값은 하나 이상의 CA 인증서가 포함된 파일을 지정합니다. 이러한 CA 인증서는 라우터에서 클라이언트의 인증서를 확인하는 데 사용됩니다.

mutual -tls-auth-crl 을 사용하면 인증서 취소 목록을 지정하여 인증서(유효한 인증 기관에서 발급)가 취소된 경우를 처리할 수 있습니다.

$ oc adm router --mutual-tls-auth=required  \
     --mutual-tls-auth-ca=/local/path/to/cacerts.pem  \
     --mutual-tls-auth-filter='^/CN=my.org/ST=CA/C=US/O=Security/OU=OSE$'  \
     ....

인증서 제목에 따라 --mutual-tls-auth-filter 값을 사용하여 세분화된 액세스 제어에 사용할 수 있습니다. 값은 인증서 제목과 일치하는 데 사용되는 정규식입니다.

참고

위의 상호 TLS 인증 필터 예제는 인증서 제목과 정확히 일치하는 제한적인 정규 표현식(regex)( regex ) 살펴봅니다. 덜 제한적인 정규 표현식을 사용하기로 결정한 경우 유효한 것으로 간주되는 CA에서 발급한 인증서와 일치할 수 있다는 점에 유의하십시오. 또한 발급한 인증서를 더 세부적으로 제어할 수 있도록 --mutual-tls-auth-ca 옵션을 사용하는 것이 좋습니다.

mutual -tls-auth=required 를 사용하면 인증된 클라이언트 백엔드 리소스에 액세스할 수 있습니다. 즉, 클라이언트가 인증 정보( 클라이언트 인증서라고 함)를 항상 제공해야 합니다. 상호 TLS 인증을 선택하도록 하려면 --mutual-tls-auth=optional 을 사용합니다(또는 none 을 사용하여 이를 비활성화 - 기본값임). 여기서 선택사항 은 인증 정보를 제공하는 클라이언트가 인증 정보를 제공하지 않아도 되며 클라이언트가 인증 정보를 제공하는 경우 X-SSL* HTTP 헤더의 백엔드로만 전달됩니다.

$ oc adm router --mutual-tls-auth=optional  \
     --mutual-tls-auth-ca=/local/path/to/cacerts.pem  \
     ....

상호 TLS 인증 지원이 활성화된 경우( --mutual-tls-auth 플래그에 필수 또는 선택적 값 사용) 클라이언트 인증 정보는 X-SSL* HTTP 헤더 형식의 백엔드로 전달됩니다.

X-SSL* HTTP 헤더 X-SSL-Client-DN: 인증서 제목의 전체 고유 이름(DN)의 예. X-SSL-Client-NotBefore: YYMMDDhhmmss[Z] 형식의 클라이언트 인증서 시작 날짜입니다. X-SSL-Client-NotAfter: YYMMDDhhmmss[Z] 형식의 클라이언트 인증서 종료일입니다. X-SSL-Client-SHA1: 클라이언트 인증서의 SHA-1 지문입니다. X-SSL-Client-DER: 클라이언트 인증서에 대한 전체 액세스를 제공합니다. base-64 형식으로 인코딩된 DER 형식 클라이언트 인증서를 포함합니다.

3.2.8. 고가용성 라우터

IP 페일오버를 사용하여 OpenShift Container Platform 클러스터에 고가용성 라우터를 설정 할 수 있습니다. 이 설정에는 여러 노드에 여러 개의 복제본이 있으므로 현재 노드에 장애가 발생한 경우 장애 조치(failover) 소프트웨어로 전환할 수 있습니다.

3.2.9. 라우터 서비스 포트 사용자 정의

환경 변수 ROUTER_SERVICE_HTTP_PORT 및 ROUTER_SERVICE_HTTPS_PORT 를 설정하여 템플릿 라우터가 바인딩하는 서비스 포트를 사용자 지정할 수 있습니다. 이 작업은 템플릿 라우터를 만든 다음 배포 구성을 편집하여 수행할 수 있습니다.

다음 예제에서는 0 개의 복제본을 사용하여 라우터 배포를 생성하고 라우터 서비스 HTTP 및 HTTPS 포트를 사용자 지정한 다음 적절하게 확장합니다(복제본 1 개로).

$ oc adm router --replicas=0 --ports='10080:10080,10443:10443' 1
$ oc set env dc/router ROUTER_SERVICE_HTTP_PORT=10080  \
                   ROUTER_SERVICE_HTTPS_PORT=10443
$ oc scale dc/router --replicas=1
1
컨테이너 네트워킹 모드 --host-network=false 를 사용하는 라우터에 노출된 포트가 적절하게 설정되었는지 확인합니다.
중요

템플릿 라우터 서비스 포트를 사용자 지정하는 경우 라우터 포드가 실행되는 노드에 방화벽(Ansible 또는 iptables 을 통해 또는 firewall-cmd를 통해 사용하는 기타 사용자 지정 방법)에서 해당 사용자 지정 포트가 열려 있는지 확인해야 합니다.

다음은 iptables 를 사용하여 사용자 지정 라우터 서비스 포트를 여는 예입니다.

$ iptables -A OS_FIREWALL_ALLOW -p tcp --dport 10080 -j ACCEPT
$ iptables -A OS_FIREWALL_ALLOW -p tcp --dport 10443 -j ACCEPT

3.2.10. 여러 라우터로 작업

관리자는 동일한 정의로 여러 라우터를 만들어 동일한 경로 집합을 제공할 수 있습니다. 각 라우터는 다른 노드에 있으며 다른 IP 주소를 가집니다. 네트워크 관리자는 각 노드에 원하는 트래픽을 가져와야 합니다.

클러스터에 라우팅 부하를 분산하고 다른 라우터 또는 shard 에 테넌트를 분리하도록 여러 라우터를 그룹화할 수 있습니다. 그룹의 각 라우터 또는 shard는 라우터의 선택기를 기반으로 경로를 허용합니다. 관리자는 ROUTE_LABELS 를 사용하여 전체 클러스터에 shard를 생성할 수 있습니다. 사용자는 NAMESPACE_LABELS 를 사용하여 네임스페이스(프로젝트)에서 shard를 생성할 수 있습니다.

3.2.11. 배포 구성에 노드 선택기 추가

특정 라우터를 특정 노드에 배포하려면 다음 두 단계가 필요합니다.

  1. 원하는 노드에 레이블을 추가합니다.

    $ oc label node 10.254.254.28 "router=first"
  2. 라우터 배포 구성에 노드 선택기를 추가합니다.

    $ oc edit dc <deploymentConfigName>

    라벨에 해당하는 키와 값이 있는 template.spec.nodeSelector 필드를 추가합니다.

    ...
      template:
        metadata:
          creationTimestamp: null
          labels:
            router: router1
        spec:
          nodeSelector:      1
            router: "first"
    ...
    1
    키 및 값은 각각 router =first 레이블에 해당하는 라우터와 번째 레이블입니다.

3.2.12. 라우터 공유 공간 사용

라우터 분할 에서는 NAMESPACE_LABELSROUTE_LABELS 를 사용하여 라우터 네임스페이스와 경로를 필터링합니다. 이를 통해 경로의 하위 집합을 여러 라우터 배포에 배포할 수 있습니다. 오버레이되지 않은 하위 집합을 사용하면 경로 집합을 효과적으로 분할할 수 있습니다. 또는 겹치는 경로 하위 집합으로 구성된 shard를 정의할 수 있습니다.

기본적으로 라우터는 모든 프로젝트(네임스페이스) 에서 모든 경로를 선택합니다. 분할에는 경로 또는 네임스페이스에 레이블을 추가하고 라우터에 라벨 선택기를 추가합니다. 각 라우터 shard는 특정 레이블 선택기 집합에서 선택한 경로로 구성되거나 특정 레이블 선택기 세트에서 선택한 네임스페이스에 속합니다.

참고

라우터 서비스 계정에는 다른 네임스페이스의 라벨에 액세스할 수 있도록 [클러스터 리더] 권한이 설정되어 있어야 합니다.

라우터 공유 및 DNS

요청을 원하는 shard로 라우팅하려면 외부 DNS 서버가 필요하므로 관리자는 프로젝트의 각 라우터에 대해 별도의 DNS 항목을 만들어야 합니다. 라우터는 알 수 없는 경로를 다른 라우터로 전달하지 않습니다.

다음 예제를 고려하십시오.

  • 라우터 A는 호스트 192.168.0.5에 있으며 *.foo.com 이 있는 경로가 있습니다.
  • 라우터 B는 호스트 192.168.1.9에 있으며 *.example.com 이 있는 경로가 있습니다.

별도의 DNS 항목은 *.foo.com을 라우터 A를 호스팅하는 노드로 확인하고 *.example.com을 라우터 B를 호스팅하는 노드로 확인해야 합니다.

  • *.foo.com A IN 192.168.0.5
  • *.example.com A IN 192.168.1.9

라우터 공유 예

이 섹션에서는 네임스페이스 및 경로 레이블을 사용하여 라우터 분할에 대해 설명합니다.

그림 3.1. 네임 스페이스 레이블 기반 라우터 공유

네임 스페이스 레이블 기반 라우터 공유
  1. 네임스페이스 라벨 선택기를 사용하여 라우터를 구성합니다.

    $ oc set env dc/router NAMESPACE_LABELS="router=r1"
  2. 라우터에는 네임스페이스에 선택기가 있으므로 라우터는 일치하는 네임스페이스에 대해서만 경로를 처리합니다. 이 선택기가 네임스페이스와 일치하도록 하려면 그에 따라 네임스페이스에 라벨을 지정합니다.

    $ oc label namespace default "router=r1"
  3. 이제 default 네임스페이스에 경로를 생성하는 경우 기본 라우터에서 경로를 사용할 수 있습니다.

    $ oc create -f route1.yaml
  4. 새 프로젝트(namespace)를 생성하고 경로를 만듭니다. route2:

    $ oc new-project p1
    $ oc create -f route2.yaml

    라우터에서 경로를 사용할 수 없습니다.

  5. router=r 1을 사용하여 네임스페이스 p1 에 레이블을 지정합니다.

    $ oc label namespace p1 "router=r1"

이 레이블을 추가하면 라우터에서 경로를 사용할 수 있습니다.

예제

라우터 배포 pin ops-router 는 레이블 선택기 NAMESPACE_LABELS="name in (finance, ops)"으로 구성되고 라우터 배포 dev-router 는 레이블 선택기 NAMESPACE_LABELS="name=dev" 로 구성됩니다.

모든 경로가 name=finance, name= ops, name= dev 라는 레이블이 지정된 네임스페이스에 있는 경우 이 구성은 두 라우터 배포 간에 경로를 효과적으로 배포합니다.

위의 시나리오에서 분할은 중복되는 하위 집합이 없는 파티션의 특별한 사례가 됩니다. 경로는 라우터 shard 간에 나뉩니다.

경로 선택 기준은 경로 배포 방법을 결정합니다. 라우터 배포에서 경로의 중복된 하위 집합을 가질 수 있습니다.

예제

위의 예에 있는 pinops -router 및 dev-router 외에도 라벨 선택기 NAMESPACE_LABELS="name (dev, ops)" 으로 구성된 devops-router 도 있습니다.

name=dev 또는 name= ops 레이블이 지정된 네임스페이스의 경로는 이제 두 개의 서로 다른 라우터 배포에서 서비스를 제공합니다. 이 경우에는 네임스페이스 레이블을 기반으로 라우터 공유를 기반으로 하는 절차에 설명된 대로 경로의 중복된 하위 집합을 정의한 사례가 됩니다.

또한 더 복잡한 라우팅 규칙을 만들 수 있으므로 우선 순위가 더 높은 트래픽이 전용 conf ops-router 로 전환할 수 있으며 우선 순위가 낮은 트래픽을 devops-router 로 보낼 수 있습니다.

경로 레이블을 기반으로 하는 라우터 공유

NAMESPACE_LABELS 를 사용하면 프로젝트를 서비스하고 해당 프로젝트에서 모든 경로를 선택할 수 있지만 경로 자체와 연결된 다른 기준에 따라 경로를 분할할 수 있습니다. ROUTE_LABELS 선택기를 사용하면 경로 자체를 슬라이스 앤 드롭할 수 있습니다.

예제

라우터 배포 prod-router 는 레이블 선택기 ROUTE_LABELS="mydeployment=prod" 로 구성되고 라우터 배포 devtest-router 는 레이블 선택기 ROUTE_LABELS="mydeployment in (dev, test)" 로 구성됩니다.

이 구성 파티션은 네임스페이스와 관계없이 경로의 레이블에 따라 두 라우터 배포 간에 라우팅됩니다.

이 예제에서는 서비스할 모든 경로에 "mydeployment=<tag>" 라는 레이블이 지정되어 있다고 가정합니다.

3.2.12.1. 라우터 공유 파일 생성

이 섹션에서는 라우터 분할의 고급 예를 설명합니다. 다양한 라벨이 있는 26개의 경로(이름: ) 가 있다고 가정합니다.

경로에 가능한 레이블

sla=high       geo=east     hw=modest     dept=finance
sla=medium     geo=west     hw=strong     dept=dev
sla=low                                   dept=ops

이러한 레이블은 서비스 수준 계약, 지리적 위치, 하드웨어 요구 사항, 부서 등의 개념을 나타냅니다. 경로에는 각 열에서 최대 하나의 레이블이 있을 수 있습니다. 일부 경로에는 다른 레이블이 있거나 레이블이 전혀 없을 수 있습니다.

이름SLAgeoHWDept기타 레이블

a

높음

동부

Modet

금융

type=static

b

 

west

strong

 

type=dynamic

c, d, e

low

 

Modet

 

type=static

g — k

중간

 

strong

dev

 

l — s

높음

 

Modet

ops

 

t — z

 

west

  

type=dynamic

다음은 oc adm router, ocset envoc scale 을 함께 사용하여 라우터 shard를 만드는 방법을 보여주는 모바일 스크립트 mkshard 입니다.

#!/bin/bash
# Usage: mkshard ID SELECTION-EXPRESSION
id=$1
sel="$2"
router=router-shard-$id           1
oc adm router $router --replicas=0  2
dc=dc/router-shard-$id            3
oc set env   $dc ROUTE_LABELS="$sel"  4
oc scale $dc --replicas=3         5
1
생성된 라우터의 이름은 router-shard-<id> 입니다.
2
현재 스케일링하지 않음을 지정합니다.
3
라우터의 배포 구성입니다.
4
oc set env를 사용하여 선택 표현식을 설정합니다. 선택 표현식은 ROUTE_LABELS 환경 변수의 값입니다.
5
확장해 보십시오.

mkshard 를 여러 번 실행하면 여러 라우터가 생성됩니다.

라우터선택 표현식라우트

router-shard-1

sla=high

a, l — s

router-shard-2

geo=west

b, t — z

router-shard-3

dept=dev

g — k

3.2.12.2. 라우터 공유 파일 수정

라우터 shard는 레이블을 기반으로 한 생성자이므로 oc 레이블을통해 레이블(oc label ) 또는 선택 표현식(oc set env를 통해)을 수정할 수 있습니다.

이 섹션에서는 라우터 공유 생성 섹션에서 시작된 예제를 확장하여 선택 표현식을 변경하는 방법을 보여줍니다.

다음은 새 선택 표현식을 사용하도록 기존 라우터를 수정하는 편리한 스크립트 modshard 입니다.

#!/bin/bash
# Usage: modshard ID SELECTION-EXPRESSION...
id=$1
shift
router=router-shard-$id       1
dc=dc/$router                 2
oc scale $dc --replicas=0     3
oc set env   $dc "$@"             4
oc scale $dc --replicas=3     5
1
수정된 라우터의 이름은 router-shard-<id> 입니다.
2
수정이 발생하는 배포 구성입니다.
3
축소할 수 있습니다.
4
oc set env를 사용하여 새 선택 표현식을 설정합니다. 라우터 공유 생성 섹션의 mkshard 와 달리, modshard 에 비ID 인수로 지정된 선택 표현식에는 환경 변수 이름과 해당 값이 포함되어야 합니다.
5
다시 확장합니다.
참고

modshard 에서는 router-shard-<id>배포 전략이 롤링 인 경우 oc scale 명령이 필요하지 않습니다.

예를 들어 router-shard-3 의 부서를 확장하여 opsdev 를 포함하려면 다음을 수행합니다.

$ modshard 3 ROUTE_LABELS='dept in (dev, ops)'

그 결과 router-shard-3 이 이제 g cd - s(g^- k 및 lcd - s  결합된 집합)를 선택합니다.

이 예제에서는 이 예제 시나리오에 세 개의 부서만 있으며 shard에서 나가도록 부서를 지정하여 이전 예제와 동일한 결과를 얻을 수 있음을 고려합니다.

$ modshard 3 ROUTE_LABELS='dept != finance'

이 예제에서는 쉼표로 구분된 세 가지 특성을 지정하며 결과적으로 b 만 선택됩니다.

$ modshard 3 ROUTE_LABELS='hw=strong,type=dynamic,geo=west'

경로 레이블이 포함된 ROUTE_LABELS 와 유사하게 NAMESPACE_LABELS 환경 변수를 사용하여 경로 네임스페이스의 레이블을 기반으로 경로를 선택할 수 있습니다. 이 예제에서는 router-shard-3 을 수정하여 네임스페이스에 라벨 frequency=weekly 가 있는 경로를 제공합니다.

$ modshard 3 NAMESPACE_LABELS='frequency=weekly'

마지막 예제에서는 ROUTE_LABELSNAMESPACE_LABELS 를 결합하여 라벨이 sla=low 인 경로를 선택하고 네임스페이스에 라벨 frequency=weekly 가 있습니다.

$ modshard 3 \
    NAMESPACE_LABELS='frequency=weekly' \
    ROUTE_LABELS='sla=low'

3.2.13. 라우터의 호스트 이름 찾기

서비스를 노출할 때 외부 사용자가 애플리케이션에 액세스하는 데 사용하는 DNS 이름과 동일한 경로를 사용할 수 있습니다. 외부 네트워크의 네트워크 관리자는 호스트 이름이 경로를 허용한 라우터의 이름으로 확인되어야 합니다. 사용자는 이 호스트 이름을 가리키는 CNAME으로 DNS를 설정할 수 있습니다. 그러나 사용자는 라우터의 호스트 이름을 알지 못할 수 있습니다. 알 수 없는 경우 클러스터 관리자는 이를 제공할 수 있습니다.

클러스터 관리자는 라우터를 만들 때 라우터의 정식 호스트 이름과 함께 --router-canonical-hostname 옵션을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

# oc adm router myrouter --router-canonical-hostname="rtr.example.com"

이렇게 하면 라우터의 호스트 이름이 포함된 라우터 배포 구성에 ROUTER_CANONICAL_HOSTNAME 환경 변수가 생성됩니다.

이미 존재하는 라우터의 경우 클러스터 관리자는 라우터의 배포 구성을 편집하고 ROUTER_CANONICAL_HOSTNAME 환경 변수를 추가할 수 있습니다.

spec:
  template:
    spec:
      containers:
        - env:
          - name: ROUTER_CANONICAL_HOSTNAME
            value: rtr.example.com

ROUTER_CANONICAL_HOSTNAME 값은 경로를 승인한 모든 라우터의 경로 상태에 표시됩니다. 라우터를 다시 로드할 때마다 경로 상태가 새로 고쳐집니다.

사용자가 경로를 만들면 모든 활성 라우터가 경로를 평가하고 조건이 충족되면 이를 승인합니다. ROUTER_CANONICAL_HOSTNAME 환경 변수를 정의하는 라우터에서 경로를 허용하면 라우터에서 routerCanonicalHostname 필드에 값을 경로 상태에 배치합니다. 사용자는 경로 상태를 검사하여 라우터가 경로를 허용했는지 확인하고, 목록에서 라우터를 선택하고, 네트워크 관리자에게 전달할 라우터의 호스트 이름을 찾을 수 있습니다.

status:
  ingress:
    conditions:
      lastTransitionTime: 2016-12-07T15:20:57Z
      status: "True"
      type: Admitted
      host: hello.in.mycloud.com
      routerCanonicalHostname: rtr.example.com
      routerName: myrouter
      wildcardPolicy: None

oc describe 는 사용 가능한 경우 호스트 이름을 포함합니다.

$ oc describe route/hello-route3
...
Requested Host: hello.in.mycloud.com exposed on router myroute (host rtr.example.com) 12 minutes ago

사용자는 위의 정보를 사용하여 DNS 관리자에게 경로의 호스트 hello.in.mycloud.com에서 라우터의 정식 호스트 이름 rtr.example.com 으로 CNAME을 설정하도록 요청할 수 있습니다. 그러면 hello.in.mycloud.com 에 대한 트래픽이 사용자의 애플리케이션에 도달하게 됩니다.

3.2.14. 기본 라우팅 하위 도메인 사용자 지정

마스터 구성 파일(기본적으로 /etc/origin/master/master-config.yaml 파일)을 수정하여 해당 환경의 기본 라우팅 하위 도메인으로 사용되는 접미사를 사용자 지정할 수 있습니다. 호스트 이름을 지정하지 않는 경로는 이 기본 라우팅 하위 도메인을 사용하여 생성됩니다.

다음 예제에서는 구성된 접미사를 v3.openshift.test로 설정하는 방법을 보여줍니다.

routingConfig:
  subdomain: v3.openshift.test
참고

이 변경 사항을 적용하려면 마스터가 실행 중인 경우 다시 시작해야 합니다.

위 구성을 실행하는 OpenShift Container Platform 마스터에서 mynamespace 네임스페이스에 호스트 이름을 추가하지 않고 no-route-hostname 이라는 경로의 예를 위해 생성된 호스트 이름은 다음과 같습니다.

no-route-hostname-mynamespace.v3.openshift.test

3.2.15. 사용자 지정 라우팅 하위 도메인으로 경로 호스트 이름 강제

관리자가 모든 경로를 특정 라우팅 하위 도메인으로 제한하려는 경우 --force-subdomain 옵션을 oc adm router 명령에 전달할 수 있습니다. 이렇게 하면 라우터가 경로에 지정된 호스트 이름을 재정의하고 --force-subdomain 옵션에 제공된 템플릿을 기반으로 합니다.

다음 예제에서는 라우터를 실행하여 사용자 지정 하위 도메인 템플릿 ${name}-${namespace}.apps.example.com 을 사용하여 경로 호스트 이름을 재정의합니다.

$ oc adm router --force-subdomain='${name}-${namespace}.apps.example.com'

3.2.16. 와일드카드 인증서 사용

인증서가 포함되지 않은 TLS 지원 경로에서는 라우터의 기본 인증서를 대신 사용합니다. 대부분의 경우 이 인증서는 신뢰할 수 있는 인증 기관에서 제공해야 하지만 편의를 위해 OpenShift Container Platform CA를 사용하여 인증서를 생성할 수 있습니다. 예를 들면 다음과 같습니다.

$ CA=/etc/origin/master
$ oc adm ca create-server-cert --signer-cert=$CA/ca.crt \
      --signer-key=$CA/ca.key --signer-serial=$CA/ca.serial.txt \
      --hostnames='*.cloudapps.example.com' \
      --cert=cloudapps.crt --key=cloudapps.key
참고

oc adm ca create-server-cert 명령은 2년 동안 유효한 인증서를 생성합니다. 이는 --expire-days 옵션으로 변경할 수 있지만 보안상의 이유로 이 값보다 커지지 않는 것이 좋습니다.

기본적으로 /etc/ansible/hosts 에서 Ansible 호스트 인벤토리 파일에 나열된 첫 번째 마스터에서만 oc adm 명령을 실행합니다.

라우터는 인증서와 키가 단일 파일에서 PEM 형식이어야 합니다.

$ cat cloudapps.crt cloudapps.key $CA/ca.crt > cloudapps.router.pem

여기에서 --default-cert 플래그를 사용할 수 있습니다.

$ oc adm router --default-cert=cloudapps.router.pem --service-account=router
참고

브라우저는 한 레벨의 하위 도메인에 유효한 와일드카드만 고려합니다. 이 예에서는 인증서가. cloudapps.example.com에 유효하지만, a. b.cloudapps.example.com에는 적용되지 않습니다.

3.2.17. 수동으로 인증서 재배포

라우터 인증서를 수동으로 재배포하려면 다음을 수행합니다.

  1. 기본 라우터 인증서가 포함된 보안이 라우터에 추가되었는지 확인합니다.

    $ oc set volume dc/router
    
    deploymentconfigs/router
      secret/router-certs as server-certificate
        mounted at /etc/pki/tls/private

    인증서가 추가되면 다음 단계를 건너뛰고 보안을 덮어씁니다.

  2. 다음 변수 DEFAULT_CERTIFICATE_DIR 에 대해 설정된 기본 인증서 디렉터리가 있는지 확인합니다.

    $ oc set env dc/router --list
    
    DEFAULT_CERTIFICATE_DIR=/etc/pki/tls/private

    그렇지 않은 경우 다음 명령을 사용하여 디렉터리를 생성합니다.

    $ oc set env dc/router DEFAULT_CERTIFICATE_DIR=/etc/pki/tls/private
  3. 인증서를 PEM 형식으로 내보냅니다.

    $ cat custom-router.key custom-router.crt custom-ca.crt > custom-router.crt
  4. 라우터 인증서 보안을 덮어쓰거나 생성합니다.

    인증서 보안이 라우터에 추가되면 보안을 덮어씁니다. 그렇지 않은 경우 새 시크릿을 생성합니다.

    보안을 덮어쓰려면 다음 명령을 실행합니다.

    $ oc create secret generic router-certs --from-file=tls.crt=custom-router.crt --from-file=tls.key=custom-router.key --type=kubernetes.io/tls -o json --dry-run | oc replace -f -

    새 보안을 생성하려면 다음 명령을 실행합니다.

    $ oc create secret generic router-certs --from-file=tls.crt=custom-router.crt --from-file=tls.key=custom-router.key --type=kubernetes.io/tls
    
    $ oc set volume dc/router --add --mount-path=/etc/pki/tls/private --secret-name='router-certs' --name router-certs
  5. 라우터를 배포합니다.

    $ oc rollout latest dc/router

3.2.18. 보안 경로 사용

현재는 암호로 보호되는 키 파일이 지원되지 않습니다. HAProxy는 시작 시 암호를 묻는 메시지를 표시하며 이 프로세스를 자동화할 방법이 없습니다. 키 파일에서 암호를 제거하려면 다음을 실행합니다.

# openssl rsa -in <passwordProtectedKey.key> -out <new.key>

다음은 트래픽이 대상에 프록시되기 전에 라우터에서 TLS 종료와 함께 보안 에지 종료 경로를 사용하는 방법에 대한 예입니다. 보안 에지 종료 경로는 TLS 인증서 및 키 정보를 지정합니다. TLS 인증서는 라우터 프런트엔드에서 제공합니다.

먼저 라우터 인스턴스를 시작합니다.

# oc adm router --replicas=1 --service-account=router

다음으로 에지 보안 경로에 사용할 개인 키 csr 및 인증서를 만듭니다. 이 작업을 수행하는 방법에 대한 지침은 인증 기관 및 공급자에 따라 다릅니다. www.example.test 도메인의 간단한 자체 서명 인증서는 아래 표시된 예제를 참조하십시오.

# sudo openssl genrsa -out example-test.key 2048
#
# sudo openssl req -new -key example-test.key -out example-test.csr  \
  -subj "/C=US/ST=CA/L=Mountain View/O=OS3/OU=Eng/CN=www.example.test"
#
# sudo openssl x509 -req -days 366 -in example-test.csr  \
      -signkey example-test.key -out example-test.crt

위의 인증서와 키를 사용하여 경로를 생성합니다.

$ oc create route edge --service=my-service \
    --hostname=www.example.test \
    --key=example-test.key --cert=example-test.crt
route "my-service" created

해당 정의를 살펴보겠습니다.

$ oc get route/my-service -o yaml
apiVersion: v1
kind: Route
metadata:
  name:  my-service
spec:
  host: www.example.test
  to:
    kind: Service
    name: my-service
  tls:
    termination: edge
    key: |
      -----BEGIN PRIVATE KEY-----
      [...]
      -----END PRIVATE KEY-----
    certificate: |
      -----BEGIN CERTIFICATE-----
      [...]
      -----END CERTIFICATE-----

www.example.test 에 대한 DNS 항목이 라우터 인스턴스를 가리키는지 확인하고 도메인의 경로를 사용할 수 있어야 합니다. 아래 예제에서는 로컬 확인자와 함께 curl을 사용하여 DNS 조회를 시뮬레이션합니다.

# routerip="4.1.1.1"  #  replace with IP address of one of your router instances.
# curl -k --resolve www.example.test:443:$routerip https://www.example.test/

3.2.19. 와일드 카드 경로 사용(하위 도메인의 경우)

HAProxy 라우터는 와일드카드 경로를 지원하며, 이 경로는 ROUTER_ALLOW_WILDCARD_ROUTES 환경 변수를 true 로 설정하여 활성화됩니다. 라우터 승인 검사를 통과하는 와일드카드 정책이 Subdomain 인 모든 경로는 HAProxy 라우터에서 서비스를 제공합니다. 그런 다음 HAProxy 라우터는 경로의 와일드카드 정책에 따라 연결된 서비스(경로용)를 노출합니다.

중요

경로의 와일드카드 정책을 변경하려면 경로를 제거하고 업데이트된 와일드카드 정책으로 다시 생성해야 합니다. 경로의 .yaml 파일에서 경로의 와일드카드 정책만 편집하는 것은 작동하지 않습니다.

$ oc adm router --replicas=0 ...
$ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true
$ oc scale dc/router --replicas=1

와일드카드 경로에 사용할 웹 콘솔을 구성하는 방법을 알아봅니다.

보안 와일드카드 에지 종료 경로 사용

이 예에서는 트래픽이 대상으로 프록시되기 전에 라우터에서 발생하는 TLS 종료를 반영합니다. 하위 도메인 example.org(*.example.org )의 모든 호스트에 전송된 트래픽은 노출된 서비스로 프록시됩니다.

보안 에지 종료 경로는 TLS 인증서 및 키 정보를 지정합니다. TLS 인증서는 하위 도메인(*.example.org)과 일치하는 모든 호스트의 라우터 프런트엔드에서 제공합니다.

  1. 라우터 인스턴스를 시작합니다.

    $ oc adm router --replicas=0 --service-account=router
    $ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true
    $ oc scale dc/router --replicas=1
  2. 엣지 보안 경로에 대한 개인 키, CSR(인증서 서명 요청) 및 인증서를 만듭니다.

    이 작업을 수행하는 방법에 대한 지침은 인증 기관 및 공급자에 따라 다릅니다. *.example.test라는 도메인의 간단한 자체 서명 인증서는 다음 예제를 참조하십시오.

    # sudo openssl genrsa -out example-test.key 2048
    #
    # sudo openssl req -new -key example-test.key -out example-test.csr  \
      -subj "/C=US/ST=CA/L=Mountain View/O=OS3/OU=Eng/CN=*.example.test"
    #
    # sudo openssl x509 -req -days 366 -in example-test.csr  \
          -signkey example-test.key -out example-test.crt
  3. 위의 인증서 및 키를 사용하여 와일드카드 경로를 생성합니다.

    $ cat > route.yaml  <<REOF
    apiVersion: v1
    kind: Route
    metadata:
      name:  my-service
    spec:
      host: www.example.test
      wildcardPolicy: Subdomain
      to:
        kind: Service
        name: my-service
      tls:
        termination: edge
        key: "$(perl -pe 's/\n/\\n/' example-test.key)"
        certificate: "$(perl -pe 's/\n/\\n/' example-test.cert)"
    REOF
    $ oc create -f route.yaml

    *.example.test 에 대한 DNS 항목이 라우터 인스턴스를 가리키는지 확인하고 도메인의 경로를 사용할 수 있는지 확인합니다.

    이 예제에서는 로컬 확인자와 함께 curl 을 사용하여 DNS 조회를 시뮬레이션합니다.

    # routerip="4.1.1.1"  #  replace with IP address of one of your router instances.
    # curl -k --resolve www.example.test:443:$routerip https://www.example.test/
    # curl -k --resolve abc.example.test:443:$routerip https://abc.example.test/
    # curl -k --resolve anyname.example.test:443:$routerip https://anyname.example.test/

와일드카드 경로(ROUTER_ALLOW_WILDCARD_ROUTEStrue로 설정됨)를 허용하는 라우터의 경우 와일드카드 경로와 연결된 하위 도메인의 소유권에 대한 몇 가지 주의 사항이 있습니다.

와일드카드 경로 이전에는 다른 클레임에 대해 경로가 가장 오래된 네임스페이스를 사용하는 호스트 이름에 대한 소유권을 기반으로 했습니다. 예를 들어, 1. example.test 에 대한 클레임이 있는 네임스페이스 ns1 의 경로 r 1은 경로 r2 가 경로 r 2보다 오래된 경우 네임스페이스 ns2 의 다른 경로 r 2 에 대해 상이합니다.

또한 다른 네임스페이스의 경로는 오버레이되지 않은 호스트 이름을 요청할 수 있었습니다. 예를 들어 네임스페이스 ns1 routerone은 www.example.test 를 클레임하고 네임스페이스 d2 의 다른 경로 rtwoc3po.example.test 를 클레임할 수 있습니다.

동일한 하위 도메인을 클레임하는 와일드카드 경로(위예제에서 example.test )가 없는 경우에도 마찬가지입니다.

그러나 와일드카드 경로는 하위 도메인(\ *.example.test 형식의 호스트 이름) 내의 모든 호스트 이름을 요청해야 합니다. 와일드카드 경로의 클레임은 해당 하위 도메인의 가장 오래된 경로(예.test)가 와일드카드 경로와 동일한 네임스페이스에 있는지 여부에 따라 허용 또는 거부됩니다. 가장 오래된 경로는 일반 경로 또는 와일드카드 경로일 수 있습니다.

예를 들어, owner.example.test 라는 호스트를 요청한 ns1 네임스페이스에 경로 eldest 이미 있고 나중에 해당 하위 도메인의 경로(예.test)에 요청하는 새 와일드카드 경로 와일드카드 경로가 추가된 경우 와일드카드 경로의 클레임은소유경로와 동일한 네임스페이스(ns1)인 경우에만 허용됩니다.

다음 예제에서는 와일드카드 경로 클레임이 성공 또는 실패하는 다양한 시나리오를 보여줍니다.

아래 예제에서 와일드카드 경로를 허용하는 라우터는 와일드카드 경로가 하위 도메인을 요청하지 않은 한 하위 도메인 example.test 에 있는 호스트에 대한 비 오버레이 클레임을 허용합니다.

$ oc adm router ...
$ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true

$ oc project ns1
$ oc expose service myservice --hostname=owner.example.test
$ oc expose service myservice --hostname=aname.example.test
$ oc expose service myservice --hostname=bname.example.test

$ oc project ns2
$ oc expose service anotherservice --hostname=second.example.test
$ oc expose service anotherservice --hostname=cname.example.test

$ oc project otherns
$ oc expose service thirdservice --hostname=emmy.example.test
$ oc expose service thirdservice --hostname=webby.example.test

아래 예제에서 와일드카드 경로를 허용하는 라우터에서는 소유자.example.test 또는 aname.example.example.test 에 대한 클레임을 성공적으로 허용하지 않습니다. 소유 네임스페이스는 ns1 입니다.

$ oc adm router ...
$ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true

$ oc project ns1
$ oc expose service myservice --hostname=owner.example.test
$ oc expose service myservice --hostname=aname.example.test

$ oc project ns2
$ oc expose service secondservice --hostname=bname.example.test
$ oc expose service secondservice --hostname=cname.example.test

$ # Router will not allow this claim with a different path name `/p1` as
$ # namespace `ns1` has an older route claiming host `aname.example.test`.
$ oc expose service secondservice --hostname=aname.example.test --path="/p1"

$ # Router will not allow this claim as namespace `ns1` has an older route
$ # claiming host name `owner.example.test`.
$ oc expose service secondservice --hostname=owner.example.test

$ oc project otherns

$ # Router will not allow this claim as namespace `ns1` has an older route
$ # claiming host name `aname.example.test`.
$ oc expose service thirdservice --hostname=aname.example.test

아래 예제에서 와일드카드 경로를 허용하는 라우터를 사용하면 소유 네임스페이스가 ns1 이고 와일드카드 경로는 동일한 네임스페이스에 속하므로 '\*.example.test.test 클레임이 성공합니다.

$ oc adm router ...
$ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true

$ oc project ns1
$ oc expose service myservice --hostname=owner.example.test

$ # Reusing the route.yaml from the previous example.
$ # spec:
$ #   host: www.example.test
$ #   wildcardPolicy: Subdomain

$ oc create -f route.yaml   #  router will allow this claim.

아래 예에서 와일드카드 경로를 허용하는 라우터에서는 소유 네임스페이스가 ns1 이고 와일드카드 경로는 다른 네임 스페이스에 속하므로 '\*.example.test.test에 대한 클레임이 성공하지 못합니다 .

$ oc adm router ...
$ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true

$ oc project ns1
$ oc expose service myservice --hostname=owner.example.test

$ # Switch to a different namespace/project.
$ oc project cyclone

$ # Reusing the route.yaml from a prior example.
$ # spec:
$ #   host: www.example.test
$ #   wildcardPolicy: Subdomain

$ oc create -f route.yaml   #  router will deny (_NOT_ allow) this claim.

마찬가지로 와일드카드 경로가 있는 네임스페이스에서 하위 도메인을 요청하면 해당 네임스페이스 내 경로만 동일한 하위 도메인의 호스트를 요청할 수 있습니다.

아래 예제에서 와일드카드 경로가 subdomain example.test 인 네임스페이스 ns1 의 경로가 있으면 네임스페이스 ns1 의 경로만 동일한 하위 도메인의 호스트를 요청할 수 있습니다.

$ oc adm router ...
$ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true

$ oc project ns1
$ oc expose service myservice --hostname=owner.example.test

$ oc project otherns

$ # namespace `otherns` is allowed to claim for other.example.test
$ oc expose service otherservice --hostname=other.example.test

$ oc project ns1

$ # Reusing the route.yaml from the previous example.
$ # spec:
$ #   host: www.example.test
$ #   wildcardPolicy: Subdomain

$ oc create -f route.yaml   #  Router will allow this claim.

$ #  In addition, route in namespace otherns will lose its claim to host
$ #  `other.example.test` due to the wildcard route claiming the subdomain.

$ # namespace `ns1` is allowed to claim for deux.example.test
$ oc expose service mysecondservice --hostname=deux.example.test

$ # namespace `ns1` is allowed to claim for deux.example.test with path /p1
$ oc expose service mythirdservice --hostname=deux.example.test --path="/p1"

$ oc project otherns

$ # namespace `otherns` is not allowed to claim for deux.example.test
$ # with a different path '/otherpath'
$ oc expose service otherservice --hostname=deux.example.test --path="/otherpath"

$ # namespace `otherns` is not allowed to claim for owner.example.test
$ oc expose service yetanotherservice --hostname=owner.example.test

$ # namespace `otherns` is not allowed to claim for unclaimed.example.test
$ oc expose service yetanotherservice --hostname=unclaimed.example.test

아래 예제에서는 소유자 경로가 삭제되고 소유권이 네임스페이스 내에서 전달되는 다양한 시나리오가 표시되어 있습니다. 네임스페이스 ns1 에 호스트를 클레임하는 경로에는 eldest .example.test 가 있지만 해당 네임스페이스의 와일드카드 경로는 하위 도메인 example.test 를 요청할 수 있습니다. 호스트 eldest .example.test 의 경로가 삭제되면 다음 가장 오래된 경로 senior.example.test 가 가장 오래된 경로가 되며 다른 경로에는 영향을 주지 않습니다. 호스트 senior.example.test 의 경로가 삭제되면 가장 오래된 다음 경로 junior.example.test 가 가장 오래된 경로가 되고 와일드카드 경로 클레임자를 차단합니다.

$ oc adm router ...
$ oc set env dc/router ROUTER_ALLOW_WILDCARD_ROUTES=true

$ oc project ns1
$ oc expose service myservice --hostname=eldest.example.test
$ oc expose service seniorservice --hostname=senior.example.test

$ oc project otherns

$ # namespace `otherns` is allowed to claim for other.example.test
$ oc expose service juniorservice --hostname=junior.example.test

$ oc project ns1

$ # Reusing the route.yaml from the previous example.
$ # spec:
$ #   host: www.example.test
$ #   wildcardPolicy: Subdomain

$ oc create -f route.yaml   #  Router will allow this claim.

$ #  In addition, route in namespace otherns will lose its claim to host
$ #  `junior.example.test` due to the wildcard route claiming the subdomain.

$ # namespace `ns1` is allowed to claim for dos.example.test
$ oc expose service mysecondservice --hostname=dos.example.test

$ # Delete route for host `eldest.example.test`, the next oldest route is
$ # the one claiming `senior.example.test`, so route claims are unaffacted.
$ oc delete route myservice

$ # Delete route for host `senior.example.test`, the next oldest route is
$ # the one claiming `junior.example.test` in another namespace, so claims
$ # for a wildcard route would be affected. The route for the host
$ # `dos.example.test` would be unaffected as there are no other wildcard
$ # claimants blocking it.
$ oc delete route seniorservice

3.2.20. 컨테이너 네트워크 스택 사용

OpenShift Container Platform 라우터는 컨테이너 내부에서 실행되며 기본 동작은 호스트의 네트워크 스택을 사용하는 것입니다(즉, 라우터 컨테이너가 실행되는 노드). 이 기본 동작은 원격 클라이언트의 네트워크 트래픽이 대상 서비스 및 컨테이너에 도달하기 위해 사용자 공간을 통해 여러 개의 홉을 수행하지 않아도 되므로 성능에 도움이 됩니다.

또한 이 기본 동작을 사용하면 라우터에서 노드의 IP 주소를 가져오는 대신 원격 연결의 실제 소스 IP 주소를 가져올 수 있습니다. 이 기능은 원래 IP를 기반으로 수신 규칙을 정의하고, 고정 세션을 지원하고, 다른 용도에서 트래픽을 모니터링하는 데 유용합니다.

이 호스트 네트워크 동작은 --host-network 라우터 명령줄 옵션으로 제어되며 기본 동작은 --host-network=true 를 사용하는 것과 동일합니다. 컨테이너 네트워크 스택을 사용하여 라우터를 실행하려면 라우터를 만들 때 --host-network=false 옵션을 사용합니다. 예를 들면 다음과 같습니다.

$ oc adm router --service-account=router --host-network=false

내부적으로 라우터 컨테이너는 외부 네트워크가 라우터와 통신할 수 있도록 80 및 443 포트를 게시해야 합니다.

참고

컨테이너 네트워크 스택으로 실행하면 라우터에서 연결의 소스 IP 주소가 실제 원격 IP 주소가 아니라 노드의 NATed IP 주소가 되도록 합니다.

참고

다중 테넌트 네트워크 격리 를 사용하는 OpenShift Container Platform 클러스터에서 --host-network=false 옵션과 함께 기본이 아닌 네임스페이스의 라우터는 클러스터의 모든 경로를 로드하지만, 네트워크 격리로 인해 네임스페이스의 경로에 연결할 수 없습니다. host -network=true 옵션을 사용하면 경로에서 컨테이너 네트워크를 바이패스하고 클러스터의 모든 Pod에 액세스할 수 있습니다. 이 경우 격리가 필요한 경우 네임스페이스 전체에서 경로를 추가하지 마십시오.

3.2.21. 동적 구성 관리자 사용

동적 구성 관리자를 지원하도록 HAProxy 라우터를 구성할 수 있습니다.

동적 구성 관리자는 HAProxy를 다시 로드하지 않고도 특정 유형의 경로를 온라인으로 제공합니다. 경로 및 엔드포인트 추가|deletion|업데이트 와 같은 경로 및 엔드포인트 라이프사이클 이벤트를 처리합니다.

ROUTER_HAPROXY_CONFIG_MANAGER 환경 변수를 true 로 설정하여 동적 구성 관리자를 활성화합니다.

$ oc set env dc/<router_name> ROUTER_HAPROXY_CONFIG_MANAGER='true'

동적 구성 관리자가 HAProxy를 동적으로 구성할 수 없는 경우 구성을 다시 작성하고 HAProxy 프로세스를 다시 로드합니다. 예를 들어 새 경로에 사용자 지정 시간 초과와 같은 사용자 지정 주석이 있거나 경로에 사용자 지정 TLS 구성이 필요한 경우입니다.

동적 구성은 사전 할당된 경로 및 백엔드 서버 풀과 함께 HAProxy 소켓 및 구성 API를 사용합니다. 경로 청사진을 사용하여 사전 할당된 경로 풀이 생성됩니다. 기본 청사진 집합은 사용자 지정 TLS 구성 및 통과 경로 없이 비보안 경로, 에지 보안 경로를 지원합니다.

중요

재암호화 경로에는 사용자 지정 TLS 구성 정보가 필요하므로 동적 구성 관리자와 함께 사용하려면 추가 구성이 필요합니다.

ROUTER_BLUEPRINT_ROUTE_ NAMESPACE를 설정하고 선택적으로 ROUTER_BLUEPRINT_ ROUTE_ LABELS 환경 변수를 설정하여 동적 구성 관리자가 사용할 수 있는 청사진을 확장합니다.

청사진 경로 네임스페이스의 모든 경로 또는 경로 레이블은 기본 청사진 세트와 유사한 사용자 지정 청사진으로 처리됩니다. 여기에는 사용자 정의 TLS 구성으로 사용자 정의 주석 또는 경로를 사용하는 재암호화 경로 또는 경로가 포함됩니다.

다음 절차에서는 세 개의 경로 오브젝트, 즉 reencrypt-blueprint, annotated- edge-blueprint 및 annotated- unsecured-blueprint 를 생성했다고 가정합니다. 다양한 경로 유형 오브젝트의 예는 경로 유형을 참조하십시오.

절차

  1. 새 프로젝트를 생성합니다.

    $ oc new-project namespace_name
  2. 새 경로를 만듭니다. 이 메서드는 기존 서비스를 노출합니다.

    $ oc create route edge edge_route_name --key=/path/to/key.pem \
          --cert=/path/to/cert.pem --service=<service> --port=8443
  3. 경로에 레이블을 지정합니다.

    $ oc label route edge_route_name type=route_label_1
  4. 경로 오브젝트 정의에서 세 가지 다른 경로를 만듭니다. 모두 type=route_label_1 라벨을 갖습니다.

    $ oc create -f reencrypt-blueprint.yaml
    $ oc create -f annotated-edge-blueprint.yaml
    $ oc create -f annotated-unsecured-blueprint.json

    경로에서 레이블을 제거하여 청사진 경로로 사용하지 않도록 할 수도 있습니다. 예를 들어 주석이 있는 비보안 청사진이 청사진 경로로 사용되지 않도록 하려면 다음을 수행합니다.

    $ oc label route annotated-unsecured-blueprint type-
  5. 블루프린트 풀에 사용할 새 라우터를 생성합니다.

    $ oc adm router
  6. 새 라우터의 환경 변수를 설정합니다.

    $ oc set env dc/router ROUTER_HAPROXY_CONFIG_MANAGER=true      \
                           ROUTER_BLUEPRINT_ROUTE_NAMESPACE=namespace_name  \
                           ROUTER_BLUEPRINT_ROUTE_LABELS="type=route_label_1"

    type=route_label_1 라벨이 있는 네임스페이스 또는 프로젝트 namespace_ name 의 모든 경로를 처리하여 사용자 지정 청사진으로 사용할 수 있습니다.

    해당 namespace_name 에서 일반적으로와 같이 경로를 관리하여 청사진을 추가, 업데이트 또는 제거할 수도 있습니다. 동적 구성 관리자는 라우터가 경로 및 서비스를 감시하는 방법과 유사하게 네임스페이스 namespace_name경로 변경 사항을 감시합니다.

  7. 사전 할당된 경로 및 백엔드 서버의 풀 크기는 기본값인 ROUTER_BLUEPRINT_ROUTE_POOL_SIZE 와 기본값인 5 , 기본값인 ROUTER_MAX_DYNAMIC_SERVERS 를 사용하여 제어할 수 있습니다. 또한 동적 구성 관리자의 변경 사항이 디스크에 커밋되는 빈도를 제어할 수 있습니다. 이 경우 HAProxy 구성을 다시 작성하고 HAProxy 프로세스가 다시 로드됩니다. 기본값은 1시간 또는 3600초 또는 동적 구성 관리자가 풀 공간이 부족할 때입니다. COMMIT_INTERVAL 환경 변수는 다음 설정을 제어합니다.

    $ oc set env dc/router -c router ROUTER_BLUEPRINT_ROUTE_POOL_SIZE=20  \
          ROUTER_MAX_DYNAMIC_SERVERS=3 COMMIT_INTERVAL=6h

    이 예제에서는 각 청사진 경로의 풀 크기를 20 으로 늘리고, 동적 서버 수를 3 으로 줄이며, 커밋 간격을 6 시간으로 늘립니다.

3.2.22. 라우터 지표 노출

HAProxy 라우터 지표 는 기본적으로 외부 지표 수집 및 집계 시스템(예: Prometheus, statsd)에서 사용할 수 있도록 Prometheus 형식에 노출되거나 게시됩니다. 지표는 브라우저 또는 CSV 다운로드에서 볼 수 있도록 자체 HTML 형식으로 HAProxy 라우터 에서 직접 사용할 수도 있습니다. 이러한 지표에는 HAProxy 기본 지표 및 일부 컨트롤러 지표가 포함됩니다.

다음 명령을 사용하여 라우터를 생성할 때 OpenShift Container Platform에서는 기본적으로 1936년까지 통계 포트의 Prometheus 형식으로 지표를 사용할 수 있습니다.

$ oc adm router --service-account=router
  • Prometheus 형식의 원시 통계를 추출하려면 다음 명령을 실행합니다.

    curl <user>:<password>@<router_IP>:<STATS_PORT>

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

    $ curl admin:sLzdR6SgDJ@10.254.254.35:1936/metrics

    라우터 서비스 주석에서 메트릭에 액세스하는 데 필요한 정보를 가져올 수 있습니다.

    $ oc edit service <router-name>
    
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        prometheus.io/port: "1936"
        prometheus.io/scrape: "true"
        prometheus.openshift.io/password: IImoDqON02
        prometheus.openshift.io/username: admin

    prometheus.io/port 는 기본적으로 1936년 통계 포트입니다. 액세스를 허용하도록 방화벽을 구성해야 할 수도 있습니다. 이전 사용자 이름 및 암호를 사용하여 지표에 액세스합니다. 경로는 /metrics 입니다.

    $ curl <user>:<password>@<router_IP>:<STATS_PORT>
    for example:
    $ curl admin:sLzdR6SgDJ@10.254.254.35:1936/metrics
    ...
    # HELP haproxy_backend_connections_total Total number of connections.
    # TYPE haproxy_backend_connections_total gauge
    haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route"} 0
    haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route-alt"} 0
    haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route01"} 0
    ...
    # HELP haproxy_exporter_server_threshold Number of servers tracked and the current threshold value.
    # TYPE haproxy_exporter_server_threshold gauge
    haproxy_exporter_server_threshold{type="current"} 11
    haproxy_exporter_server_threshold{type="limit"} 500
    ...
    # HELP haproxy_frontend_bytes_in_total Current total of incoming bytes.
    # TYPE haproxy_frontend_bytes_in_total gauge
    haproxy_frontend_bytes_in_total{frontend="fe_no_sni"} 0
    haproxy_frontend_bytes_in_total{frontend="fe_sni"} 0
    haproxy_frontend_bytes_in_total{frontend="public"} 119070
    ...
    # HELP haproxy_server_bytes_in_total Current total of incoming bytes.
    # TYPE haproxy_server_bytes_in_total gauge
    haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_no_sni",service=""} 0
    haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_sni",service=""} 0
    haproxy_server_bytes_in_total{namespace="default",pod="docker-registry-5-nk5fz",route="docker-registry",server="10.130.0.89:5000",service="docker-registry"} 0
    haproxy_server_bytes_in_total{namespace="default",pod="hello-rc-vkjqx",route="hello-route",server="10.130.0.90:8080",service="hello-svc-1"} 0
    ...
  • 브라우저에서 메트릭을 가져오려면 다음을 수행합니다.

    1. 라우터 배포 구성 파일에서 다음 환경 변수를 삭제합니다.

      $ oc edit dc router
      
      - name: ROUTER_LISTEN_ADDR
        value: 0.0.0.0:1936
      - name: ROUTER_METRICS_TYPE
        value: haproxy
    2. 라우터 준비 프로브를 패치하여 haproxy 라우터에서 현재 제공하는 활성 프로브와 동일한 경로를 사용합니다.

      $ oc patch dc router -p '"spec": {"template": {"spec": {"containers": [{"name": "router","readinessProbe": {"httpGet": {"path": "/healthz"}}}]}}}'
    3. 브라우저에서 다음 URL을 사용하여 stats 창을 시작합니다. 여기서 STATS_PORT 값은 기본적으로 1936 입니다.

      http://admin:<Password>@<router_IP>:<STATS_PORT>

      URL에 ;csv 를 추가하여 CSV 형식으로 통계를 가져올 수 있습니다.

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

      http://admin:<Password>@<router_IP>:1936;csv

      라우터 IP, 관리자 이름 및 암호를 가져오려면 다음을 수행합니다.

      oc describe pod <router_pod>
  • 메트릭 컬렉션을 비활성화하려면 다음을 수행합니다.

    $ oc adm router --service-account=router --stats-port=0

3.2.23. 대규모 클러스터에 대한 ARP 캐시 튜닝

다수의 경로가 있는 OpenShift Container Platform 클러스터에서는 기본적으로 65536net.ipv4.neigh.default.gc_thresh3 값보다 큰 경로가 있는 OpenShift Container Platform 클러스터에서 라우터 Pod를 실행하는 클러스터의 각 노드에서 sysctl 변수의 기본값을 늘려 ARP 캐시에 더 많은 항목을 허용해야 합니다.

문제가 발생하면 커널 메시지가 다음과 유사합니다.

[ 1738.811139] net_ratelimit: 1045 callbacks suppressed
[ 1743.823136] net_ratelimit: 293 callbacks suppressed

이 문제가 발생하면 oc 명령이 다음 오류로 인해 실패할 수 있습니다.

Unable to connect to the server: dial tcp: lookup <hostname> on <ip>:<port>: write udp <ip>:<port>-><ip>:<port>: write: invalid argument

IPv4의 실제 ARP 항목을 확인하려면 다음을 실행합니다.

# ip -4 neigh show nud all | wc -l

숫자가 net.ipv4.neigh.default.gc_thresh3 임계값에 접근하기 시작하면 값을 늘립니다. 다음을 실행하여 현재 값을 가져옵니다.

# sysctl net.ipv4.neigh.default.gc_thresh1
net.ipv4.neigh.default.gc_thresh1 = 128
# sysctl net.ipv4.neigh.default.gc_thresh2
net.ipv4.neigh.default.gc_thresh2 = 512
# sysctl net.ipv4.neigh.default.gc_thresh3
net.ipv4.neigh.default.gc_thresh3 = 1024

다음 sysctl은 변수를 OpenShift Container Platform 현재 기본값으로 설정합니다.

# sysctl net.ipv4.neigh.default.gc_thresh1=8192
# sysctl net.ipv4.neigh.default.gc_thresh2=32768
# sysctl net.ipv4.neigh.default.gc_thresh3=65536

이러한 설정을 영구적으로 설정하려면 이 문서를 참조하십시오.

3.2.24. 가상 공격에 대한 보호

DHCP http-request 를 기본 HAProxy 라우터 이미지에 추가하여 DDoS(Distributed-of-service) 공격(예: slowloris) 공격으로부터 배포를 보호합니다.

# and the haproxy stats socket is available at /var/run/haproxy.stats
global
  stats socket ./haproxy.stats level admin

defaults
  option http-server-close
  mode http
  timeout http-request 5s
  timeout connect 5s 1
  timeout server 10s
  timeout client 30s
1
시간 제한 http-request 가 최대 5초로 설정됩니다. HAProxy는 전체 HTTP 요청을 보낼 클라이언트 5초 *를 제공합니다. 그렇지 않으면 HAProxy가 *an 오류로 연결을 종료합니다.

또한 환경 변수 ROUTER_SLOWLORIS_TIMEOUT 이 설정되면 클라이언트가 전체 HTTP 요청을 보내야 하는 시간을 제한합니다. 그렇지 않으면 HAProxy가 연결을 종료합니다.

환경 변수를 설정하면 라우터 배포 구성의 일부로 정보를 캡처할 수 있으며 템플릿을 수동으로 수정할 필요가 없지만 HAProxy 설정을 수동으로 추가하려면 라우터 포드를 다시 빌드하고 라우터 템플릿 파일을 유지 관리해야 합니다.

주석을 사용하면 HAProxy 템플릿 라우터에서 다음을 제한하는 기능을 포함하여 기본 사항이 적용됩니다.

  • 동시 TCP 연결 수
  • 클라이언트가 TCP 연결을 요청할 수 있는 비율
  • HTTP 요청을 작성할 수 있는 비율

애플리케이션은 트래픽 패턴이 매우 다를 수 있으므로 경로별로 활성화됩니다.

표 3.1. HAProxy 템플릿 라우터 설정
설정설명

haproxy.router.openshift.io/rate-limit-connections

설정을 구성할 수 있습니다(예: true 로 설정된 경우).

haproxy.router.openshift.io/rate-limit-connections.concurrent-tcp

이 경로의 동일한 IP 주소로 만들 수 있는 동시 TCP 연결 수입니다.

haproxy.router.openshift.io/rate-limit-connections.rate-tcp

클라이언트 IP에서 열 수 있는 TCP 연결 수입니다.

haproxy.router.openshift.io/rate-limit-connections.rate-http

클라이언트 IP에서 3초 내에 생성할 수 있는 HTTP 요청 수입니다.

3.2.25. HAProxy 스레드 활성화

--threads 플래그로 활성화된 스레드입니다. 이 플래그는 HAProxy 라우터에서 사용할 스레드 수를 지정합니다.

3.3. 사용자 지정된 HAProxy 라우터 배포

3.3.1. 개요

기본 HAProxy 라우터는 대부분의 사용자의 요구 사항을 충족하기 위한 것입니다. 그러나 HAProxy의 모든 기능을 노출하지는 않습니다. 따라서 사용자가 자신의 요구에 맞게 라우터를 수정해야 할 수 있습니다.

애플리케이션 백엔드 내에서 새 기능을 구현하거나 현재 작업을 수정해야 할 수 있습니다. 라우터 플러그인은 이 사용자 지정에 필요한 모든 기능을 제공합니다.

라우터 포드는 템플릿 파일을 사용하여 필요한 HAProxy 구성 파일을 생성합니다. 템플릿 파일은 golang 템플릿 입니다. 템플릿을 처리할 때 라우터는 라우터의 배포 구성, 허용된 경로 집합 및 일부 도우미 기능을 포함하여 OpenShift Container Platform 정보에 액세스할 수 있습니다.

라우터 포드가 시작되고 다시 로드될 때마다 HAProxy 구성 파일을 생성한 다음 HAProxy를 시작합니다. HAProxy 구성 설명서 에서는 HAProxy의 모든 기능과 유효한 구성 파일을 구성하는 방법을 설명합니다.

configMap 을 사용하여 라우터 Pod에 새 템플릿을 추가할 수 있습니다. 이 방법을 사용하면 configMap 을 라우터 Pod의 볼륨으로 마운트하도록 라우터 배포 구성이 수정되었습니다. TEMPLATE_FILE 환경 변수는 라우터 포드에서 템플릿 파일의 전체 경로 이름으로 설정됩니다.

중요

OpenShift Container Platform을 업그레이드한 후에도 라우터 템플릿 사용자 정의가 계속 작동하는지 보장하지 않습니다.

또한 라우터 템플릿 사용자 지정을 실행 중인 라우터의 템플릿 버전에 적용해야 합니다.

또는 사용자 지정 라우터 이미지를 빌드하여 일부 또는 전체 라우터를 배포할 때 사용할 수 있습니다. 모든 라우터에서 동일한 이미지를 실행할 필요가 없습니다. 이렇게 하려면 haproxy-template.config 파일을 수정하고 라우터 이미지를 다시 빌드 합니다. 새 이미지는 클러스터의 Docker 리포지토리로 푸시되고 라우터의 배포 구성 이미지: 필드가 새 이름으로 업데이트됩니다. 클러스터가 업데이트되면 이미지를 다시 빌드하고 푸시해야 합니다.

두 경우 모두 라우터 포드는 템플릿 파일로 시작합니다.

3.3.2. 라우터 구성 템플릿 가져오기

HAProxy 템플릿 파일은 상당히 크고 복잡합니다. 일부 변경의 경우 전체 교체를 작성하지 않고 기존 템플릿을 수정하는 것이 더 쉬울 수 있습니다. 라우터 Pod를 참조하여 master에서 이를 실행하여 실행 중인 라우터에서 haproxy-config.template 파일을 가져올 수 있습니다.

# oc get po
NAME                       READY     STATUS    RESTARTS   AGE
router-2-40fc3             1/1       Running   0          11d
# oc exec router-2-40fc3 cat haproxy-config.template > haproxy-config.template
# oc exec router-2-40fc3 cat haproxy.config > haproxy.config

또는 라우터를 실행 중인 노드에 로그인할 수도 있습니다.

# docker run --rm --interactive=true --tty --entrypoint=cat \
    registry.redhat.io/openshift3/ose-haproxy-router:v{product-version} haproxy-config.template

이미지 이름은 컨테이너 이미지의 입니다.

사용자 지정된 템플릿의 기반으로 사용할 수 있도록 이 콘텐츠를 파일에 저장합니다. 저장된 haproxy.config 는 실제로 실행 중인 항목을 표시합니다.

3.3.3. 라우터 구성 템플릿 수정

3.3.3.1. 배경

템플릿은 golang 템플릿 을 기반으로 합니다. 라우터 배포 구성의 환경 변수, 아래 설명된 모든 구성 정보 및 라우터 제공 도우미 기능을 참조할 수 있습니다.

템플릿 파일의 구조가 생성된 HAProxy 구성 파일을 미러링합니다. 템플릿이 처리되면 {{"으로 묶지 않는 모든 것이 구성 파일에 직접 복사됩니다. {{'로 묶인 문구는 "}}" 에 대해 평가됩니다. 결과 텍스트(있는 경우)가 구성 파일에 복사됩니다.

3.3.3.2. Go Template Actions

는 처리된 템플릿을 포함할 파일의 이름을 정의합니다.

{{define "/var/lib/haproxy/conf/haproxy.config"}}pipeline{{end}}
표 3.2. 템플릿 라우터 기능
함수의미

processEndpointsForAlias(alias ServiceAliasConfig, svc ServiceUnit, action string) []Endpoint

유효한 엔드포인트 목록을 반환합니다. 작업이 "축소"되면 끝점 순서가 임의화됩니다.

env(variable, default …​문자열) 문자열

포드에서 명명된 환경 변수를 가져옵니다. 정의되지 않았거나 비어 있지 않은 경우 선택적 두 번째 인수를 반환합니다. 그렇지 않으면 빈 문자열을 반환합니다.

matchPattern(pattern, s string) bool

첫 번째 인수는 정규 표현식이 포함된 문자열이며, 두 번째 인수는 테스트할 변수입니다. 첫 번째 인수로 제공된 정규 표현식이 두 번째 인수로 제공된 문자열과 일치하는지 여부를 나타내는 부울 값을 반환합니다.

isInteger(s string) bool

지정된 변수가 정수인지 여부를 결정합니다.

firstMatch(s string, allowedValues …​문자열) 부울

지정된 문자열을 허용된 문자열 목록과 비교합니다. 목록을 통해 첫 번째 일치 스캔을 오른쪽으로 반환합니다.

matchValues(s string, allowedValues …​문자열) 부울

지정된 문자열을 허용된 문자열 목록과 비교합니다. 문자열이 허용된 값인 경우 "true"를 반환하고, 그렇지 않으면 false를 반환합니다.

generateRouteRegexp(hostname, path string, wildcard bool) string

경로 호스트(및 경로)와 일치하는 정규식을 생성합니다. 첫 번째 인수는 호스트 이름, 두 번째 인수는 경로이며, 세 번째 인수는 와일드카드 부울입니다.

genCertificateHostName(hostname string, wildcard bool) string

인증서 제공/결합에 사용할 호스트 이름을 생성합니다. 첫 번째 인수는 호스트 이름이고 두 번째 인수는 와일드카드 부울입니다.

isTrue(s string) bool

주어진 변수에 "true"가 포함되어 있는지 확인합니다.

이러한 기능은 HAProxy 템플릿 라우터 플러그인에서 제공합니다.

3.3.3.3. 라우터 제공 정보

이 섹션에서는 템플릿에서 라우터를 사용할 수 있도록 하는 OpenShift Container Platform 정보를 검토합니다. 라우터 구성 매개 변수는 HAProxy 라우터 플러그인이 제공되는 데이터 집합입니다. 필드는 (점) .Fieldname 을 통해 액세스합니다.

라우터 구성 매개 변수 아래의 테이블은 다양한 필드의 정의에서 확장됩니다. 특히 .State 에는 허용된 경로 집합이 있습니다.

표 3.3. 라우터 구성 매개변수
필드유형설명

WorkingDir

string

파일이 작성될 디렉토리, 기본값은 /var/lib/containers/router입니다.

상태

map[string](ServiceAliasConfig)

경로.

ServiceUnits

map[string]ServiceUnit

서비스 조회.

DefaultCertificate

string

pem 형식의 기본 인증서의 전체 경로 이름입니다.

PeerEndpoints

[]Endpoint

동료.

StatsUser

string

통계를 표시할 사용자 이름(템플릿에서 지원하는 경우).

StatsPassword

string

로 통계를 표시할 암호입니다(템플릿에서 지원하는 경우).

StatsPort

int

로 통계를 노출할 포트입니다(템플릿에서 지원하는 경우).

BindPorts

부울

라우터가 기본 포트를 바인딩해야 하는지 여부입니다.

표 3.4. 라우터 ServiceAliasConfig (A Route)
필드유형설명

이름

string

경로의 사용자 지정 이름입니다.

네임 스페이스

string

경로의 네임스페이스입니다.

호스트

string

호스트 이름입니다. 예: www.example.com.

경로

string

선택적 경로입니다. 예를 들어, www.example.com/myservice myservice 가 경로입니다.

TLSTermination

routeapi.TLSTerminationType

이 백엔드에 대한 종료 정책은 매핑 파일 및 라우터 구성을 구동합니다.

인증서

map[string]Certificate

이 백엔드를 보호하는 데 사용되는 인증서입니다. 인증서 ID로 키됩니다.

상태

ServiceAliasConfigStatus

유지해야 하는 구성 상태를 나타냅니다.

PreferPort

string

사용자가 노출하려는 포트를 나타냅니다. 비어 있는 경우 서비스에 대해 포트가 선택됩니다.

InsecureEdgeTerminationPolicy

routeapi.InsecureEdgeTerminationPolicyType

에지 종료 경로에 대한 비보안 연결에 대해 원하는 동작을 나타냅니다. none (또는 비활성화), 허용 또는 리디렉션.

RoutingKeyName

string

쿠키 ID를 모호하게 하는 데 사용되는 경로 + 네임스페이스 이름의 해시입니다.

IsWildcard

부울

와일드카드 지원이 필요한 이 서비스 유닛을 나타냅니다.

annotations

map[string]string

이 경로에 연결된 주석입니다.

ServiceUnitNames

map[string]int32

이 경로를 지원하는 서비스 컬렉션으로 서비스 이름별로 키 지정되고 맵의 다른 항목과 관련하여 연결된 가중치에 대해 값 매겨집니다.

ActiveServiceUnits

int

가중치가 0이 아닌 ServiceUnitNames의 수입니다.

ServiceAliasConfig 는 서비스의 경로입니다. 호스트 + 경로로 고유하게 식별됩니다. 기본 템플릿은 {{range $cfgIdx, $cfg := .State }} 를 사용하여 경로를 반복합니다. 이러한 {{range}} 블록 내에서 템플릿은 $cfg.Field 를 사용하여 현재 ServiceAliasConfig 의 모든 필드를 참조할 수 있습니다.

표 3.5. Router ServiceUnit
필드유형설명

이름

string

name은 서비스 이름 + 네임스페이스에 해당합니다. ServiceUnit 을 고유하게 식별합니다.

EndpointTable

[]Endpoint

서비스를 지원하는 엔드포인트입니다. 이는 라우터의 최종 백엔드 구현으로 변환됩니다.

ServiceUnit 은 서비스 캡슐화, 해당 서비스를 지원하는 엔드포인트, 서비스를 가리키는 경로입니다. 라우터 구성 파일을 생성하도록 지원하는 데이터입니다.

표 3.6. 라우터 엔드포인트
필드유형

ID

string

IP

string

포트

string

TargetName

string

PortName

string

IdHash

string

NoHealthCheck

부울

엔드포인트 는 Kubernetes 엔드포인트의 내부 표현입니다.

표 3.7. Router Certificate, ServiceAliasConfigStatus
필드유형설명

인증서

string

공개/개인 키 쌍을 나타냅니다. ID로 식별되며 파일 이름이 됩니다. CA 인증서에는 PrivateKey 가 설정되어 있지 않습니다.

ServiceAliasConfigStatus

string

이 구성에 필요한 파일이 디스크에 지속되었음을 나타냅니다. 유효한 값: "saved", "".

표 3.8. 라우터 인증서 유형
필드유형설명

ID

string

 

내용

string

인증서입니다.

PrivateKey

string

개인 키입니다.

표 3.9. 라우터 TLSTerminationType
필드유형설명

TLSTerminationType

string

보안 통신을 중지할 위치를 지정합니다.

InsecureEdgeTerminationPolicyType

string

안전하지 않은 경로 연결에 대해 원하는 동작을 나타냅니다. 각 라우터에서 노출할 포트를 자체적으로 결정할 수 있지만 일반적으로 포트 80입니다.

TLSTerminationTypeInsecureEdgeTerminationPolicyType 은 보안 통신을 중지할 위치를 지정합니다.

표 3.10. 라우터 TLSTerminationType 값
상수현재의의미

TLSTerminationEdge

edge

에지 라우터에서 암호화를 종료합니다.

TLSTerminationPassthrough

passthrough

대상에서 암호화를 종료하면 대상에서 트래픽의 암호를 해독합니다.

TLSTerminationReencrypt

reencrypt

에지 라우터에서 암호화를 종료하고 대상에서 제공하는 새 인증서로 다시 암호화합니다.

표 3.11. Router InsecureEdgeTerminationPolicyType Values
유형의미

허용

트래픽은 비보안 포트의 서버로 전송됩니다(기본값).

비활성화

비보안 포트에는 트래픽이 허용되지 않습니다.

리디렉션

클라이언트는 보안 포트로 리디렉션됩니다.

none(")Disable (비활성화)과 동일합니다.

3.3.3.4. 주석

각 경로에는 주석이 연결될 수 있습니다. 각 주석은 이름과 값일 뿐입니다.

apiVersion: v1
kind: Route
metadata:
  annotations:
    haproxy.router.openshift.io/timeout: 5500ms
[...]

이름은 기존 주석과 충돌하지 않는 항목이 될 수 있습니다. 값은 모든 문자열입니다. 문자열에는 공백으로 구분된 여러 개의 토큰이 있을 수 있습니다. 예를 들면 aa bb cc 입니다. 템플릿은 {{index}} 을 사용하여 주석 값을 추출합니다. 예를 들면 다음과 같습니다.

{{$balanceAlgo := index $cfg.Annotations "haproxy.router.openshift.io/balance"}}

이는 상호 클라이언트 권한 부여에 이를 사용하는 방법의 예입니다.

{{ with $cnList := index $cfg.Annotations "whiteListCertCommonName" }}
  {{   if ne $cnList "" }}
    acl test ssl_c_s_dn(CN) -m str {{ $cnList }}
    http-request deny if !test
  {{   end }}
{{ end }}

그런 다음 이 명령을 사용하여 화이트리스트 CN을 처리할 수 있습니다.

$ oc annotate route <route-name> --overwrite whiteListCertCommonName="CN1 CN2 CN3"

자세한 내용은 경로별 주석 을 참조하십시오.

3.3.3.5. 환경 변수

템플릿은 라우터 포드에 존재하는 모든 환경 변수를 사용할 수 있습니다. 환경 변수는 배포 구성에서 설정할 수 있습니다. 새 환경 변수를 추가할 수 있습니다.

env 기능은 참조합니다.

{{env "ROUTER_MAX_CONNECTIONS" "20000"}}

첫 번째 문자열은 변수이며, 두 번째 문자열은 변수가 누락되거나 nil 이 없을 때 기본값입니다. ROUTER_MAX_CONNECTIONS 가 설정되지 않았거나 nil 인 경우 20000이 사용됩니다. 환경 변수는 키가 환경 변수 이름이고 콘텐츠가 변수의 값인 맵입니다.

자세한 내용은 경로별 환경 변수를 참조하십시오.

3.3.3.6. 사용 예

다음은 HAProxy 템플릿 파일을 기반으로 하는 간단한 템플릿입니다.

코멘트로 시작하십시오.

{{/*
  Here is a small example of how to work with templates
  taken from the HAProxy template file.
*/}}

템플릿에서 원하는 수의 출력 파일을 만들 수 있습니다. define 구문을 사용하여 출력 파일을 만듭니다. 파일 이름은 정의할 인수로 지정되며, 내부에 있는 블록은 일치하는 끝까지 모두 파일의 내용으로 작성됩니다.

{{ define "/var/lib/haproxy/conf/haproxy.config" }}
global
{{ end }}

위의 는 global/var/lib/haproxy/conf/haproxy.config 파일에 복사한 다음 파일을 닫습니다.

환경 변수를 기반으로 로깅을 설정합니다.

{{ with (env "ROUTER_SYSLOG_ADDRESS" "") }}
  log {{.}} {{env "ROUTER_LOG_FACILITY" "local1"}} {{env "ROUTER_LOG_LEVEL" "warning"}}
{{ end }}

env 함수는 환경 변수의 값을 추출합니다. 환경 변수가 정의되지 않았거나 nil 이 없으면 두 번째 인수가 반환됩니다.

with 구문을 사용하여 블록 내에서 "."( 점)의 값을 와 함께 에 인수로 제공됩니다. 를 사용하여 nil 에 대한 Dot를 테스트합니다. nil 이 아니면 절이 종료 까지 처리됩니다. 위의 경우 ROUTER_SYSLOG_ADDRESS/var/log/msg, ROUTER_LOG_FACILITY 가 정의되지 않은 경우 ROUTER_LOG_LEVELinfo 가 포함되어 있다고 가정합니다. 다음은 출력 파일에 복사됩니다.

  log /var/log/msg local1 info

허용되는 각 경로는 구성 파일에서 행 생성을 종료합니다. 범위를 사용하여 허용된 경로를 통과합니다.

{{ range $cfgIdx, $cfg := .State }}
  backend be_http_{{$cfgIdx}}
{{end}}

.stateServiceAliasConfig 의 맵입니다. 키는 경로 이름입니다. 범위는 맵을 통과하며, 통과할 때마다 키로 $cfgIdx 를 설정하고 경로를 설명하는 ServiceAliasConfig 를 가리키도록 $cfg Idx를 설정합니다. myroute 라는 두 개의 경로와 hisroute 가 있는 경우 위의 경로는 다음을 출력 파일에 복사합니다.

  backend be_http_myroute
  backend be_http_hisroute

Route Annotations, $cfg.Annotations 는 주석 이름이 키이고 content 문자열이 값으로 있는 맵이기도 합니다. 경로에는 원하는 만큼 많은 주석이 있을 수 있으며, 이 사용은 템플릿 작성자가 정의합니다. 사용자는 주석을 경로에 코딩하고 템플릿 작성자는 주석을 처리하도록 HAProxy 템플릿을 사용자 지정합니다.

일반적인 사용은 주석을 인덱싱하여 값을 가져오는 것입니다.

{{$balanceAlgo := index $cfg.Annotations "haproxy.router.openshift.io/balance"}}

인덱스는 지정된 주석에 대한 값을 추출합니다(있는 경우). 따라서 $balanceAlgo 에는 주석 또는 nil 과 연결된 문자열이 포함됩니다. 위와 같이nil 이 아닌 문자열을 테스트하고 구문을 사용하여 해당 문자열을 작동할 수 있습니다.

{{ with $balanceAlgo }}
  balance $balanceAlgo
{{ end }}

여기서 $balanceAlgonil 이 아닌 경우$balanceAlgo 가 출력 파일에 복사됩니다.

두 번째 예에서 주석에 설정된 시간 제한 값에 따라 서버 시간 초과를 설정합니다.

$value := index $cfg.Annotations "haproxy.router.openshift.io/timeout"

이제 $ 값을 평가하여 올바르게 구성된 문자열이 포함되어 있는지 확인할 수 있습니다. matchPattern 함수는 정규 표현식을 수락하고 인수가 표현식을 만족하는 경우 true 를 반환합니다.

matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value

이 경우 5000ms 가 허용되지만 7y 는 허용되지 않습니다. 결과는 테스트에서 사용할 수 있습니다.

{{if (matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value) }}
  timeout server  {{$value}}
{{ end }}

토큰과 일치시키는 데 사용할 수도 있습니다.

matchPattern "roundrobin|leastconn|source" $balanceAlgo

또는 matchValues 를 사용하여 토큰과 일치시킬 수 있습니다.

matchValues $balanceAlgo "roundrobin" "leastconn" "source"

3.3.4. ConfigMap을 사용하여 라우터 구성 템플릿 교체

ConfigMap 을 사용하여 라우터 이미지를 다시 빌드하지 않고 라우터 인스턴스를 사용자 지정할 수 있습니다. haproxy-config.template, reload-haproxy 및 기타 스크립트는 라우터 환경 변수 생성 및 수정뿐만 아니라 수정할 수 있습니다.

  1. 위에서 설명한 대로 수정할 haproxy-config.template 을 복사합니다. 원하는 대로 수정합니다.
  2. ConfigMap을 생성합니다.

    $ oc create configmap customrouter --from-file=haproxy-config.template

    customrouter ConfigMap에 수정된 haproxy-config.template 파일의 사본이 포함됩니다.

  3. ConfigMap을 파일로 마운트하고 TEMPLATE_FILE 환경 변수를 가리키도록 라우터 배포 구성을 수정합니다. 이 작업은 oc set envoc set volume 명령을 사용하거나 라우터 배포 구성을 편집하여 수행할 수 있습니다.

    oc 명령 사용
    $ oc set volume dc/router --add --overwrite \
        --name=config-volume \
        --mount-path=/var/lib/haproxy/conf/custom \
        --source='{"configMap": { "name": "customrouter"}}'
    $ oc set env dc/router \
        TEMPLATE_FILE=/var/lib/haproxy/conf/custom/haproxy-config.template
    라우터 배포 구성 편집

    oc edit dc 라우터 를 사용하여 텍스트 편집기로 라우터 배포 구성을 편집합니다.

    ...
            - name: STATS_USERNAME
              value: admin
            - name: TEMPLATE_FILE  1
              value: /var/lib/haproxy/conf/custom/haproxy-config.template
            image: openshift/origin-haproxy-routerp
    ...
            terminationMessagePath: /dev/termination-log
            volumeMounts: 2
            - mountPath: /var/lib/haproxy/conf/custom
              name: config-volume
          dnsPolicy: ClusterFirst
    ...
          terminationGracePeriodSeconds: 30
          volumes: 3
          - configMap:
              name: customrouter
            name: config-volume
    ...
    1
    spec.container.env 필드에 마운트된 haproxy-config.template 파일을 가리키도록 TEMPLATE_FILE 환경 변수를 추가합니다.
    2
    spec.container.volumeMounts 필드를 추가하여 마운트 지점을 생성합니다.
    3
    spec.volumes 필드를 추가하여 ConfigMap을 언급합니다.

    변경 사항을 저장하고 편집기를 종료합니다. 그러면 라우터가 다시 시작됩니다.

3.3.5. 스틱 테이블 사용

다음 예제 사용자 지정은 고가용성 라우팅 설정에서 사용하여 피어 간에 동기화되는 고정 테이블을 사용할 수 있습니다.

피어 섹션 추가

피어 간에 고정 테이블을 동기화하려면 HAProxy 구성에 peers 섹션을 정의해야 합니다. 이 섹션에서는 HAProxy가 피어를 식별하고 연결하는 방법을 결정합니다. 플러그인은 .PeerEndpoints 변수 아래의 템플릿에 데이터를 제공하여 라우터 서비스의 멤버를 쉽게 식별할 수 있도록 합니다. 다음을 추가하여 라우터 이미지 내의 haproxy-config.template 파일에 peer 섹션을 추가할 수 있습니다.

{{ if (len .PeerEndpoints) gt 0 }}
peers openshift_peers
  {{ range $endpointID, $endpoint := .PeerEndpoints }}
    peer {{$endpoint.TargetName}} {{$endpoint.IP}}:1937
  {{ end }}
{{ end }}

다시 로드 스크립트 변경

stick-tables를 사용하는 경우 HAProxy에 peer 섹션의 로컬 호스트 이름을 고려해야 하는 사항을 지시하는 옵션이 있습니다. 엔드포인트를 만들 때 플러그인은 TargetName 을 엔드포인트의 TargetRef.Name 값으로 설정합니다. TargetRef 를 설정하지 않으면 TargetName 을 IP 주소로 설정합니다. TargetRef.Name 은 Kubernetes 호스트 이름에 해당하므로, -L 옵션을 reload-haproxy 스크립트에 추가하여 피어 섹션에서 로컬 호스트를 식별할 수 있습니다.

peer_name=$HOSTNAME 1

if [ -n "$old_pid" ]; then
  /usr/sbin/haproxy -f $config_file -p $pid_file -L $peer_name -sf $old_pid
else
  /usr/sbin/haproxy -f $config_file -p $pid_file -L $peer_name
fi
1
피어 섹션에서 사용되는 엔드포인트 대상 이름과 일치해야 합니다.

백엔드 수정

마지막으로 백엔드 내에서 고정 테이블을 사용하려면 HAProxy 구성을 수정하여 stick-tables 및 peer 세트를 사용할 수 있습니다. 다음은 고정 테이블을 사용하도록 TCP 연결의 기존 백엔드를 변경하는 예입니다.

            {{ if eq $cfg.TLSTermination "passthrough" }}
backend be_tcp_{{$cfgIdx}}
  balance leastconn
  timeout check 5000ms
  stick-table type ip size 1m expire 5m{{ if (len $.PeerEndpoints) gt 0 }} peers openshift_peers {{ end }}
  stick on src
                {{ range $endpointID, $endpoint := $serviceUnit.EndpointTable }}
  server {{$endpointID}} {{$endpoint.IP}}:{{$endpoint.Port}} check inter 5000ms
                {{ end }}
            {{ end }}

이 수정 후 라우터를 다시 빌드할 수 있습니다.

3.3.6. 라우터 다시 빌드

라우터를 다시 빌드하려면 실행 중인 라우터에 있는 여러 파일의 복사본이 필요합니다. 작업 디렉토리를 만들고 라우터에서 파일을 복사합니다.

# mkdir - myrouter/conf
# cd myrouter
# oc get po
NAME                       READY     STATUS    RESTARTS   AGE
router-2-40fc3             1/1       Running   0          11d
# oc exec router-2-40fc3 cat haproxy-config.template > conf/haproxy-config.template
# oc exec router-2-40fc3 cat error-page-503.http > conf/error-page-503.http
# oc exec router-2-40fc3 cat default_pub_keys.pem > conf/default_pub_keys.pem
# oc exec router-2-40fc3 cat ../Dockerfile > Dockerfile
# oc exec router-2-40fc3 cat ../reload-haproxy > reload-haproxy

이러한 파일을 편집하거나 바꿀 수 있습니다. 그러나 conf/haproxy-config.templatereload-haproxy 가 수정될 가능성이 가장 높습니다.

파일을 업데이트한 후 다음을 수행합니다.

# docker build -t openshift/origin-haproxy-router-myversion .
# docker tag openshift/origin-haproxy-router-myversion 172.30.243.98:5000/openshift/haproxy-router-myversion 1
# docker push 172.30.243.98:5000/openshift/origin-haproxy-router-pc:latest 2
1
버전 태그를 리포지토리로 지정합니다. 이 경우 리포지토리는 172.30.243.98:5000 입니다.
2
태그된 버전을 리포지토리로 내보냅니다. 먼저 리포지토리에 Docker 로그인해야 할 수 있습니다.

새 라우터를 사용하려면 image: 문자열을 변경하거나 oc adm router 명령에 --images=<repo>/<image>:<tag> 플래그를 추가하여 라우터 배포 구성을 편집합니다.

변경 사항을 디버깅할 때 imagePullPolicy를 설정하는 것이 좋습니다. always 배포 구성에서 각 Pod 생성 시 이미지를 강제로 가져옵니다. 디버깅이 완료되면 imagePullPolicy로 다시 변경할 수 있습니다. ifNotPresent 각 Pod에서 풀을 시작하지 않도록 합니다.

3.4. PROXY 프로토콜을 사용하도록 HAProxy 라우터 구성

3.4.1. 개요

기본적으로 HAProxy 라우터에서는 HTTP를 사용하도록 들어오는 연결이 안전하지 않은 에지 및 재암호화 경로에 대해 예상합니다. 그러나 PROXY 프로토콜을 사용하여 들어오는 요청을 예상하도록 라우터를 구성할 수 있습니다. 이 주제에서는 PROXY 프로토콜을 사용하도록 HAProxy 라우터 및 외부 로드 밸런서를 구성하는 방법에 대해 설명합니다.

3.4.2. PROXY 프로토콜을 사용하는 이유는 무엇입니까?

프록시 서버 또는 로드 밸런서와 같은 중간 서비스에서 HTTP 요청을 전달하는 경우 이 정보를 후속 중간 및 궁극적으로 요청이 전달되는 백엔드 서비스에 제공하기 위해 요청의 "Forwarded" 헤더에 연결의 소스 주소를 추가합니다. 그러나 연결이 암호화되면 중간자는 "Forwarded" 헤더를 수정할 수 없습니다. 이 경우 HTTP 헤더는 요청이 전달될 때 원래 소스 주소를 정확하게 전달하지 않습니다.

이 문제를 해결하기 위해 일부 로드 밸런서는 PROXY 프로토콜을 사용하여 HTTP 요청을 단순히 HTTP 전달을 위한 대안으로 캡슐화합니다. 캡슐화를 사용하면 전달된 요청 자체를 수정하지 않고도 로드 밸런서에서 요청에 정보를 추가할 수 있습니다. 특히, 이는 암호화된 연결을 전달할 때도 로드 밸런서에서 소스 주소를 통신할 수 있음을 의미합니다.

HAProxy 라우터는 PROXY 프로토콜을 수락하고 HTTP 요청을 분리하도록 구성할 수 있습니다. 라우터는 에지 및 재암호화 경로의 암호화를 종료하므로 라우터는 요청에서 "Forwarded" HTTP 헤더(및 관련 HTTP 헤더)를 업데이트하여 PROXY 프로토콜을 사용하여 통신하는 모든 소스 주소를 추가할 수 있습니다.

주의

PROXY 프로토콜과 HTTP는 호환되지 않으며 혼합할 수 없습니다. 라우터 앞의 로드 밸런서를 사용하는 경우 둘 다 PROXY 프로토콜 또는 HTTP를 사용해야 합니다. 하나의 프로토콜을 사용하도록 구성하면 다른 프로토콜을 사용하도록 다른 프로토콜을 사용하면 라우팅이 실패합니다.

3.4.3. PROXY 프로토콜 사용

기본적으로 HAProxy 라우터에서는 PROXY 프로토콜을 사용하지 않습니다. 라우터는 들어오는 연결에 PROXY 프로토콜을 예상하도록 ROUTER_USE_PROXY_PROTOCOL 환경 변수를 사용하여 구성할 수 있습니다.

PROXY 프로토콜 활성화

$ oc set env dc/router ROUTER_USE_PROXY_PROTOCOL=true

PROXY 프로토콜을 비활성화하려면 변수를 true 또는 TRUE 이외의 값으로 설정합니다.

PROXY 프로토콜 비활성화

$ oc set env dc/router ROUTER_USE_PROXY_PROTOCOL=false

라우터에서 PROXY 프로토콜을 활성화하는 경우 PROXY 프로토콜을 사용하도록 라우터 앞에 로드 밸런서를 구성해야 합니다. 다음은 PROXY 프로토콜을 사용하도록 Amazon의 ELB(Elastic Load Balancer) 서비스를 구성하는 예입니다. 이 예에서는 ELB가 포트 80(HTTP), 443(HTTPS) 및 5000(이미지 레지스트리의 경우)을 하나 이상의 EC2 인스턴스에서 실행되는 라우터로 전달한다고 가정합니다.

PROXY 프로토콜을 사용하도록 Amazon ELB 구성

  1. 후속 단계를 간소화하려면 먼저 몇 가지 쉘 변수를 설정합니다.

    $ lb='infra-lb' 1
    $ instances=( 'i-079b4096c654f563c' ) 2
    $ secgroups=( 'sg-e1760186' ) 3
    $ subnets=( 'subnet-cf57c596' ) 4
    1
    ELB의 이름입니다.
    2
    라우터가 실행 중인 인스턴스 또는 인스턴스입니다.
    3
    이 ELB의 보안 그룹 또는 그룹입니다.
    4
    이 ELB의 서브넷 또는 서브넷입니다.
  2. 그런 다음 적절한 리스너, 보안 그룹 및 서브넷을 사용하여 ELB를 만듭니다.

    참고

    HTTP 프로토콜이 아닌 TCP 프로토콜을 사용하도록 모든 리스너를 구성해야 합니다.

    $ aws elb create-load-balancer --load-balancer-name "$lb" \
       --listeners \
        'Protocol=TCP,LoadBalancerPort=80,InstanceProtocol=TCP,InstancePort=80' \
        'Protocol=TCP,LoadBalancerPort=443,InstanceProtocol=TCP,InstancePort=443' \
        'Protocol=TCP,LoadBalancerPort=5000,InstanceProtocol=TCP,InstancePort=5000' \
       --security-groups $secgroups \
       --subnets $subnets
    {
        "DNSName": "infra-lb-2006263232.us-east-1.elb.amazonaws.com"
    }
  3. ELB에 라우터 인스턴스 또는 인스턴스를 등록합니다.

    $ aws elb register-instances-with-load-balancer --load-balancer-name "$lb" \
       --instances $instances
    {
        "Instances": [
            {
                "InstanceId": "i-079b4096c654f563c"
            }
        ]
    }
  4. ELB의 상태 점검을 구성합니다.

    $ aws elb configure-health-check --load-balancer-name "$lb" \
       --health-check 'Target=HTTP:1936/healthz,Interval=30,UnhealthyThreshold=2,HealthyThreshold=2,Timeout=5'
    {
        "HealthCheck": {
            "HealthyThreshold": 2,
            "Interval": 30,
            "Target": "HTTP:1936/healthz",
            "Timeout": 5,
            "UnhealthyThreshold": 2
        }
    }
  5. 마지막으로 ProxyProtocol 특성이 활성화된 로드 밸런서 정책을 생성하고 ELB의 TCP 포트 80 및 443에서 구성합니다.

    $ aws elb create-load-balancer-policy --load-balancer-name "$lb" \
       --policy-name "${lb}-ProxyProtocol-policy" \
       --policy-type-name 'ProxyProtocolPolicyType' \
       --policy-attributes 'AttributeName=ProxyProtocol,AttributeValue=true'
    $ for port in 80 443
      do
        aws elb set-load-balancer-policies-for-backend-server \
         --load-balancer-name "$lb" \
         --instance-port "$port" \
         --policy-names "${lb}-ProxyProtocol-policy"
      done

설정 확인

다음과 같이 로드 밸런서를 검사하여 구성이 올바른지 확인할 수 있습니다.

$ aws elb describe-load-balancers --load-balancer-name "$lb" |
    jq '.LoadBalancerDescriptions| [.[]|.ListenerDescriptions]'
[
  [
    {
      "Listener": {
        "InstancePort": 80,
        "LoadBalancerPort": 80,
        "Protocol": "TCP",
        "InstanceProtocol": "TCP"
      },
      "PolicyNames": ["infra-lb-ProxyProtocol-policy"] 1
    },
    {
      "Listener": {
        "InstancePort": 443,
        "LoadBalancerPort": 443,
        "Protocol": "TCP",
        "InstanceProtocol": "TCP"
      },
      "PolicyNames": ["infra-lb-ProxyProtocol-policy"] 2
    },
    {
      "Listener": {
        "InstancePort": 5000,
        "LoadBalancerPort": 5000,
        "Protocol": "TCP",
        "InstanceProtocol": "TCP"
      },
      "PolicyNames": [] 3
    }
  ]
]
1
TCP 포트 80의 리스너에는 PROXY 프로토콜을 사용하는 정책이 있어야 합니다.
2
TCP 포트 443의 리스너에는 동일한 정책이 있어야 합니다.
3
TCP 포트 5000의 리스너에는 정책이 없어야 합니다.

또는 ELB가 이미 구성되어 있지만 PROXY 프로토콜을 사용하도록 구성되지 않은 경우 HTTP 대신 TCP 프로토콜을 사용하도록 기존 리스너를 변경해야 합니다(TCP 포트 443은 이미 TCP 프로토콜을 사용해야 함).

$ aws elb delete-load-balancer-listeners --load-balancer-name "$lb" \
   --load-balancer-ports 80
$ aws elb create-load-balancer-listeners --load-balancer-name "$lb" \
   --listeners 'Protocol=TCP,LoadBalancerPort=80,InstanceProtocol=TCP,InstancePort=80'

프로토콜 업데이트 확인

다음과 같이 프로토콜이 업데이트되었는지 확인합니다.

$ aws elb describe-load-balancers --load-balancer-name "$lb" |
   jq '[.LoadBalancerDescriptions[]|.ListenerDescriptions]'
[
  [
    {
      "Listener": {
        "InstancePort": 443,
        "LoadBalancerPort": 443,
        "Protocol": "TCP",
        "InstanceProtocol": "TCP"
      },
      "PolicyNames": []
    },
    {
      "Listener": {
        "InstancePort": 5000,
        "LoadBalancerPort": 5000,
        "Protocol": "TCP",
        "InstanceProtocol": "TCP"
      },
      "PolicyNames": []
    },
    {
      "Listener": {
        "InstancePort": 80,
        "LoadBalancerPort": 80,
        "Protocol": "TCP", 1
        "InstanceProtocol": "TCP"
      },
      "PolicyNames": []
    }
  ]
]
1
TCP 포트 80의 리스너를 포함한 모든 리스너는 TCP 프로토콜을 사용해야 합니다.

그런 다음 로드 밸런서 정책을 만들고 위의 5단계에 설명된 대로 ELB에 추가합니다.

4장. Red Hat CloudForms 배포

4.1. OpenShift Container Platform에 Red Hat CloudForms 배포

4.1.1. 소개

OpenShift Container Platform 설치 프로그램에는 OpenShift Container Platform에 Red Hat CloudForms 4.6(CloudForms Management Engine 5.9 또는 CFME)을 배포하기 위한 Ansible 역할 openshift-management 및 플레이북이 포함되어 있습니다.

주의

현재 구현은 OpenShift Container Platform 3.6 설명서에 설명된 대로 Red Hat CloudForms 4.5의 기술 프리뷰 배포 프로세스와 호환되지 않습니다.

OpenShift Container Platform에 Red Hat CloudForms를 배포할 때 다음과 같은 두 가지 주요 결정을 내릴 수 있습니다.

  1. 외부 또는 컨테이너화된( 포드화된) PostgreSQL 데이터베이스를 원하십니까?
  2. PV(영구 볼륨)를 지원하는 스토리지 클래스는 무엇입니까?

첫 번째 결정에서는 Red Hat CloudForms가 사용할 PostgreSQL 데이터베이스의 위치에 따라 두 가지 방법 중 하나로 Red Hat CloudForms를 배포할 수 있습니다.

배포 변형설명

완전히 컨테이너화된

모든 애플리케이션 서비스 및 PostgreSQL 데이터베이스는 OpenShift Container Platform에서 포드로 실행됩니다.

외부 데이터베이스

애플리케이션은 외부 호스팅 PostgreSQL 데이터베이스 서버를 활용하는 반면, 다른 모든 서비스는 OpenShift Container Platform에서 포드로 실행됩니다.

두 번째 결정을 위해 openshift-management 역할은 많은 기본 배포 매개 변수를 재정의하기 위한 사용자 지정 옵션을 제공합니다. 여기에는 PV를 백업하는 스토리지 클래스 옵션이 포함됩니다.

스토리지 클래스설명

NFS(기본값)

클러스터의 로컬,

NFS 외부

스토리지 어플라이언스와 같은 다른 곳에 NFS

클라우드 공급자

클라우드 공급자(Google Cloud Engine, Amazon Web Services 또는 Microsoft Azure)의 자동 스토리지 프로비저닝 사용

사전 구성 (고급)

미리 모든 것을 생성했다고 가정합니다.

이 가이드의 주제에는 OpenShift Container Platform에서 Red Hat CloudForms를 실행하기 위한 요구 사항, 사용 가능한 구성 변수에 대한 설명, 초기 OpenShift Container Platform 설치 중 또는 클러스터가 프로비저닝된 후 설치 프로그램 실행에 대한 지침이 포함되어 있습니다.

4.2. OpenShift Container Platform의 Red Hat CloudForms 요구 사항

 
기본 요구 사항은 아래 표에 나열되어 있습니다. 이러한 매개 변수는 템플릿 매개 변수를 사용자 지정하여 재정의할 수 있습니다.

중요

이러한 요구 사항이 충족되지 않는 경우 애플리케이션 성능에 문제가 있거나 배포에 실패할 수도 있습니다.

표 4.1. 기본 요구 사항
항목요구 사항설명사용자 정의 매개 변수

애플리케이션 메모리

✓ 4.0 GI

애플리케이션에 필요한 최소 메모리

APPLICATION_MEM_REQ

애플리케이션 스토리지

✓ 5.0 GI

애플리케이션에 필요한 최소 PV 크기

APPLICATION_VOLUME_CAPACITY

PostgreSQL 메모리

✓ 6.0 GI

데이터베이스에 필요한 최소 메모리

POSTGRESQL_MEM_REQ

PostgreSQL Storage

✓15.0 GI

데이터베이스에 필요한 최소 PV 크기

DATABASE_VOLUME_CAPACITY

클러스터 호스트

≥ 3

클러스터의 호스트 수

해당 없음

이러한 요구 사항을 요약하려면 다음을 수행합니다.

  • 여러 클러스터 노드가 있어야 합니다.
  • 클러스터 노드에는 사용 가능한 메모리가 많이 있어야 합니다.
  • 로컬 또는 클라우드 공급자에 여러GiB의 스토리지를 사용할 수 있어야 합니다.
  • 템플릿 매개 변수에 재정의 값을 제공하여 PV 크기를 변경할 수 있습니다.

4.3. 역할 변수 구성

4.3.1. 개요

다음 섹션에서는 설치 프로그램을 실행할 때 Red Hat CloudForms 설치 동작을 제어하는 데 사용되는 Ansible 인벤토리 파일에서 사용할 수 있는 역할 변수에 대해 설명합니다.

4.3.2. 일반 변수

Variable필수 항목Default설명

openshift_management_install_management

없음

false

애플리케이션을 설치하려면 부울을 true 로 설정합니다.

openshift_management_app_template

있음

cfme-template

설치할 Red Hat CloudForms의 배포 변형. 컨테이너화된 데이터베이스의 cfme-template 또는 외부 데이터베이스의 경우 cfme-template-ext-db 를 설정합니다.

openshift_management_project

없음

openshift-management

Red Hat CloudForms 설치를 위한 네임스페이스(프로젝트).

openshift_management_project_description

없음

CloudForms 관리 엔진

네임스페이스(프로젝트) 설명.

openshift_management_username

없음

admin

기본 관리 사용자 이름. 이 값을 변경해도 사용자 이름은 변경되지 않습니다. 이미 이름을 변경했으며 통합 스크립트(예: 컨테이너 공급업체 추가스크립트)를 실행 중인 경우에만 이 값을 변경합니다.

openshift_management_password

없음

smartvm

기본 관리 암호. 이 값을 변경해도 암호가 변경되지 않습니다. 이미 암호를 변경했으며 통합 스크립트(예: 컨테이너 공급업체 추가)를 실행 중인 경우에만 이 값을 변경합니다.

4.3.3. 템플릿 매개변수 사용자 정의

openshift_management_template_parameters Ansible 역할 변수를 사용하여 애플리케이션 또는 PV 템플릿에서 재정의하려는 템플릿 매개변수를 지정할 수 있습니다.

예를 들어 PostgreSQL 포드의 메모리 요구 사항을 줄이려는 경우 다음을 설정할 수 있습니다.

openshift_management_template_parameters={'POSTGRESQL_MEM_REQ': '1Gi'}

Red Hat CloudForms 템플릿이 처리되면 POSTGRESQL_MEM_REQ 템플릿 매개변수 값에 1Gi 가 사용됩니다.

일부 템플릿 매개 변수가 템플릿 변형(컨테이너화된 또는 외부 데이터베이스)에 있는 것은 아닙니다. 예를 들어 podified 데이터베이스 템플릿에는 POSTGRESQL_MEM_REQ 매개 변수가 있지만 포드가 필요한 데이터베이스가 없기 때문에 이러한 매개 변수가 외부 db 템플릿에 존재하지 않습니다.

따라서 템플릿 매개 변수를 재정의하는 경우 주의하십시오. 템플릿에 정의되지 않은 매개 변수를 포함하면 오류가 발생합니다. Unsure the Management App is created 작업 중에 오류가 발생하면 설치 프로그램을 다시 실행하기 전에 제거 스크립트를 먼저 실행합니다.

4.3.4. 데이터베이스 변수

4.3.4.1. 컨테이너화된 (Podified) 데이터베이스

cfme-template.yaml 파일의 POSTGRES _* 또는 DATABASE_* 템플릿 매개 변수는 인벤토리 파일의 openshift_management_template_parameters 해시를 통해 사용자 지정할 수 있습니다.

4.3.4.2. 외부 데이터베이스

cfme-template-ext-db.yaml 파일의 POSTGRES _* 또는 DATABASE_* 템플릿 매개 변수는 인벤토리 파일의 openshift_management_template_parameters 해시를 통해 사용자 지정할 수 있습니다.

외부 PostgreSQL 데이터베이스를 사용하려면 데이터베이스 연결 매개 변수를 제공해야 합니다. 인벤토리의 openshift_management_template_parameters 매개변수에 필요한 연결 키를 설정해야 합니다. 다음 키가 필요합니다.

  • DATABASE_USER
  • DATABASE_PASSWORD
  • DATABASE_IP
  • DATABASE_PORT (최대 PostgreSQL 서버는 포트 5432에서 실행됩니다)
  • DATABASE_NAME
참고

외부 데이터베이스에서 PostgreSQL 9.5를 실행 중이거나 CloudForms 애플리케이션을 성공적으로 배포할 수 없는지 확인합니다.

인벤토리에는 다음과 유사한 행이 포함됩니다.

[OSEv3:vars]
openshift_management_app_template=cfme-template-ext-db 1
openshift_management_template_parameters={'DATABASE_USER': 'root', 'DATABASE_PASSWORD': 'mypassword', 'DATABASE_IP': '10.10.10.10', 'DATABASE_PORT': '5432', 'DATABASE_NAME': 'cfme'}
1
openshift_management_app_template 매개 변수를 cfme-template-ext-db 로 설정합니다.

4.3.5. 스토리지 클래스 변수

Variable필수 항목Default설명

openshift_management_storage_class

없음

nfs

사용할 스토리지 유형입니다. 옵션은 nfs,nfs_external,preconfigured 또는 cloudprovider 입니다.

openshift_management_storage_nfs_external_hostname

없음

false

NetApp 어플라이언스와 같은 외부 NFS 서버를 사용하는 경우 여기에 호스트 이름을 설정해야 합니다. 외부 NFS를 사용하지 않는 경우 값을 false 로 둡니다. 또한 외부 NFS에서는 애플리케이션 PV 및 데이터베이스 PV를 백업할 NFS 내보내기를 생성해야 합니다.

openshift_management_storage_nfs_base_dir

없음

/exports/

외부 NFS를 사용하는 경우 내보내기 위치로 기본 경로를 설정할 수 있습니다. 로컬 NFS의 경우 로컬 NFS 내보내기에 사용되는 기본 경로를 변경하려면 이 값을 변경할 수도 있습니다.

openshift_management_storage_nfs_local_hostname

없음

false

인벤토리에 [nfs] 그룹이 없거나 클러스터에서 로컬 NFS 호스트를 수동으로 정의하려는 경우 이 매개변수를 기본 NFS 서버의 호스트 이름으로 설정합니다. 서버는 OpenShift Container Platform 클러스터의 일부여야 합니다.

4.3.5.1. NFS(기본값)

NFS 스토리지 클래스는 개념 증명 및 테스트 배포에 가장 적합합니다. 배포를 위한 기본 스토리지 클래스이기도 합니다. 이 선택에는 추가 구성이 필요하지 않습니다.

이 스토리지 클래스는 클러스터 호스트에서 NFS를 구성합니다(기본적으로 인벤토리 파일의 첫 번째 마스터) 필수 PV를 백업하도록 합니다. 애플리케이션에는 PV가 필요하며 데이터베이스(외부에서 호스팅될 수 있음)에는 1초가 필요할 수 있습니다. PV의 최소 필수 크기는 Red Hat CloudForms 애플리케이션의 경우 5GiB이고 PostgreSQL 데이터베이스에는 15GiB입니다(NFS용으로 특별히 사용되는 경우 볼륨 또는 파티션에서 사용 가능한 최소 공간 20GiB).

사용자 지정은 다음 역할 변수를 통해 제공됩니다.

  • openshift_management_storage_nfs_base_dir
  • openshift_management_storage_nfs_local_hostname
4.3.5.2. NFS 외부

외부 NFS는 필요한 PV에 내보내기를 제공하기 위해 사전 구성된 NFS 서버에 간결합니다. 외부 NFS의 경우 cfme-appcfme-db (컨테이너 데이터베이스용) 내보내기가 있어야 합니다.

구성은 다음 역할 변수를 통해 제공됩니다.

  • openshift_management_storage_nfs_external_hostname
  • openshift_management_storage_nfs_base_dir

openshift_management_storage_nfs_external_hostname 매개 변수를 외부 NFS 서버의 호스트 이름 또는 IP로 설정해야 합니다.

/exports 가 내보내기에 대한 상위 디렉터리가 아닌 경우 openshift_management_storage_nfs_base_dir 매개 변수를 통해 기본 디렉터리를 설정해야 합니다.

예를 들어 서버 내보내기가 /exports/hosted/prod/cfme-app 인 경우 openshift_management_storage_nfs_base_dir=/exports/hosted/prod 를 설정해야 합니다.

4.3.5.3. 클라우드 공급자

스토리지 클래스에 OpenShift Container Platform 클라우드 공급자 통합을 사용하는 경우 Red Hat CloudForms는 클라우드 공급자 스토리지를 사용하여 필요한 PV를 백업할 수도 있습니다. 이 기능이 작동하려면 선택한 클라우드 공급자와 관련된 openshift_cloudprovider_kind 변수(AWS 또는 GCE의 경우) 및 모든 관련 매개변수를 구성해야 합니다.

이 스토리지 클래스를 사용하여 애플리케이션이 생성되면 구성된 클라우드 프로바이더 스토리지 통합을 사용하여 필요한 PV가 자동으로 프로비저닝됩니다.

이 스토리지 클래스의 동작을 구성하는 추가 변수는 없습니다.

4.3.5.4. 사전 구성(고급)

사전 구성된 스토리지 클래스는 사용자가 수행하는 작업을 정확하게 알고 모든 스토리지 요구 사항이 미리 관리되었음을 의미합니다. 일반적으로 올바르게 크기가 지정된 PV를 이미 생성했습니다. 설치 프로그램은 스토리지 설정을 수정하지 않습니다.

이 스토리지 클래스의 동작을 구성하는 추가 변수는 없습니다.

4.4. 설치 프로그램 실행

4.4.1. OpenShift Container Platform 설치 중 또는 이후에 Red Hat CloudForms 배포

초기 OpenShift Container Platform 설치 중 또는 클러스터가 프로비저닝된 후 Red Hat CloudForms를 배포할 수 있습니다.

  1. [OSEv3:vars] 섹션 아래의 인벤토리 파일에서 openshift_management_install_managementtrue 로 설정되어 있는지 확인합니다.

    [OSEv3:vars]
    openshift_management_install_management=true
  2. 역할 변수 구성에 설명된 대로 인벤토리 파일에서 다른 Red Hat CloudForms 역할 변수를 설정합니다. 이를 지원하는 리소스는 Example Inventory Files 에서 제공됩니다.
  3. OpenShift Container Platform이 이미 프로비저닝되었는지 여부에 따라 실행할 플레이북을 선택합니다.

    1. OpenShift Container Platform 클러스터를 동시에 설치할 때 Red Hat CloudForms를 설치하려면 설치 플레이북 실행에 설명된 대로 표준 config.yml 플레이북을 호출 하여 OpenShift Container Platform 클러스터 및 Red Hat CloudForms 설치를 시작합니다.
    2. 이미 프로비저닝된 OpenShift Container Platform 클러스터에 Red Hat CloudForms를 설치하려면 플레이북 디렉터리로 변경하고 Red Hat CloudForms 플레이북을 직접 호출하여 설치를 시작합니다.

      $ cd /usr/share/ansible/openshift-ansible
      $ ansible-playbook -v [-i /path/to/inventory] \
          playbooks/openshift-management/config.yml

4.4.2. 인벤토리 파일 예

다음 섹션에서는 시작하는 데 도움이 되는 OpenShift Container Platform의 Red Hat CloudForms의 다양한 구성을 보여주는 인벤토리 파일의 예를 보여줍니다.

참고

전체 변수 설명은 역할 변수 구성을 참조하십시오.

4.4.2.1. 모든 기본값

이 예제는 모든 기본값과 선택 사항을 사용하는 가장 간단한 예입니다. 따라서 완전히 컨테이너화된 Red Hat CloudForms가 설치됩니다. 모든 애플리케이션 구성 요소 및 PostgreSQL 데이터베이스는 OpenShift Container Platform에서 포드로 생성됩니다.

[OSEv3:vars]
openshift_management_app_template=cfme-template
4.4.2.2. 외부 NFS 스토리지

이는 클러스터에서 로컬 NFS 서비스를 사용하는 대신 기존 외부 NFS 서버(예: 스토리지 어플라이언스)를 사용하는 경우를 제외하고 이전 예제와 같습니다. 두 개의 새 매개변수를 확인합니다.

[OSEv3:vars]
openshift_management_app_template=cfme-template
openshift_management_storage_class=nfs_external 1
openshift_management_storage_nfs_external_hostname=nfs.example.com 2
1
nfs_external 로 설정합니다.
2
NFS 서버의 호스트 이름으로 설정합니다.

외부 NFS 호스트에서 /exports/hosted/prod 와 같은 다른 상위 디렉터리 아래에 디렉터리를 내보내는 경우 다음 추가 변수를 추가합니다.

openshift_management_storage_nfs_base_dir=/exports/hosted/prod
4.4.2.3. PV 크기 덮어쓰기

이 예제에서는 PV(영구 볼륨) 크기를 재정의합니다. PV 크기는 openshift_management_template_parameters 를 통해 설정해야 애플리케이션 및 데이터베이스에서 생성된 PV에 대한 클레임을 만들 수 있습니다.

[OSEv3:vars]
openshift_management_app_template=cfme-template
openshift_management_template_parameters={'APPLICATION_VOLUME_CAPACITY': '10Gi', 'DATABASE_VOLUME_CAPACITY': '25Gi'}
4.4.2.4. 메모리 요구 사항 재정의

테스트 또는 개념 증명 설치에서는 애플리케이션 및 데이터베이스 메모리 요구 사항을 용량에 맞게 줄여야 할 수도 있습니다. 메모리 제한을 줄이면 성능이 저하되거나 애플리케이션을 초기화하는 데 완전한 오류가 발생할 수 있습니다.

[OSEv3:vars]
openshift_management_app_template=cfme-template
openshift_management_template_parameters={'APPLICATION_MEM_REQ': '3000Mi', 'POSTGRESQL_MEM_REQ': '1Gi', 'ANSIBLE_MEM_REQ': '512Mi'}

이 예제에서는 설치 프로그램에서 APPLICATION_MEM_REQ 매개 변수를 사용하여 애플리케이션 템플릿을 3000Mi 로 설정하고POSTGRESQL_MEM_REQ1Gi 로 설정하고 ANSIBLE_MEM_REQ512Mi 로 설정하도록 지시합니다.

이러한 매개변수는 이전 예제의 PV 크기 재정의에 표시된 매개변수와 결합할 수 있습니다.

4.4.2.5. 외부 PostgreSQL 데이터베이스

외부 데이터베이스를 사용하려면 openshift_management_app_template 매개변수 값을 cfme-template -ext-db 로 변경해야 합니다.

또한 openshift_management_template_parameters 변수를 사용하여 데이터베이스 연결 정보를 제공해야 합니다. 자세한 내용은 역할 변수 구성을 참조하십시오.

[OSEv3:vars]
openshift_management_app_template=cfme-template-ext-db
openshift_management_template_parameters={'DATABASE_USER': 'root', 'DATABASE_PASSWORD': 'mypassword', 'DATABASE_IP': '10.10.10.10', 'DATABASE_PORT': '5432', 'DATABASE_NAME': 'cfme'}
중요

PostgreSQL 9.5를 실행 중이거나 애플리케이션을 성공적으로 배포할 수 없는지 확인합니다.

4.5. 컨테이너 공급자 통합 활성화

4.5.1. 단일 컨테이너 공급자 추가

설치 프로그램 실행에 설명된 대로 OpenShift Container Platform에 Red Hat CloudForms를 배포한 후 컨테이너 공급자 통합을 활성화하는 두 가지 방법이 있습니다. OpenShift Container Platform을 컨테이너 공급자로 수동으로 추가하거나 이 역할에 포함된 플레이북을 시도할 수 있습니다.

4.5.1.1. 수동으로 추가

OpenShift Container Platform 클러스터를 컨테이너 공급자로 수동으로 추가하는 방법은 다음 Red Hat CloudForms 설명서를 참조하십시오.

4.5.1.2. 자동으로 추가

자동화된 컨테이너 프로바이더 통합은 이 역할에 포함된 플레이북을 사용하여 수행할 수 있습니다.

이 플레이북은 다음과 같습니다.

  1. 필요한 인증 시크릿을 수집합니다.
  2. Red Hat CloudForms 애플리케이션 및 클러스터 API로 공용 경로를 찾습니다.
  3. REST 호출을 만들어 OpenShift Container Platform 클러스터를 컨테이너 공급자로 추가합니다.

플레이북 디렉터리로 변경하고 컨테이너 공급자 플레이북을 실행합니다.

$ cd /usr/share/ansible/openshift-ansible
$ ansible-playbook -v [-i /path/to/inventory] \
    openshift-management/add_container_provider.yml

4.5.2. 다중 컨테이너 공급자

현재 OpenShift Container Platform 클러스터를 Red Hat CloudForms 배포에 통합하는 플레이북을 제공할 뿐 아니라, 이 역할에는 임의의 Red Hat CloudForms 서버에서 여러 컨테이너 플랫폼을 컨테이너 공급자로 추가할 수 있는 스크립트가 포함되어 있습니다. 컨테이너 플랫폼은 OpenShift Container Platform 또는 OpenShift Origin일 수 있습니다.

여러 프로바이더 스크립트를 사용하려면 플레이북을 실행할 때 CLI에서 EXTRA_VARS 매개 변수를 수동으로 구성하고 설정해야 합니다.

4.5.2.1. 스크립트 준비

여러 공급자 스크립트를 준비하려면 다음 수동 구성을 완료합니다.

  1. /usr/share/ansible/openshift-ansible/roles/openshift_management/files/examples/container_providers.yml 예제(예: /tmp/cp.yml )를 복사합니다. 이 파일을 수정합니다.
  2. Red Hat CloudForms 이름 또는 암호를 변경한 경우 복사한 container_providers.yml 파일의 management_server 키에서 hostname,userpassword 매개 변수를 업데이트합니다.
  3. 컨테이너 공급자로 추가할 각 컨테이너 플랫폼 클러스터에 대한 container_providers 키 아래에 항목을 입력합니다.

    1. 다음 매개변수를 구성해야 합니다.

      • auth_key - cluster-admin 권한이 있는 서비스 계정의 토큰입니다.
      • hostname - 클러스터 API를 가리키는 호스트 이름입니다. 각 컨테이너 공급자에는 고유한 호스트 이름이 있어야 합니다.
      • Name (이름) - Red Hat CloudForms 서버 컨테이너 공급업체 개요 페이지에 표시할 클러스터의 이름입니다. 고유해야 합니다.
      작은 정보

      클러스터에서 auth_key 전달자 토큰을 가져오려면 다음을 수행합니다.

      $ oc serviceaccounts get-token -n management-infra management-admin
    2. 선택적으로 다음 매개변수를 구성할 수 있습니다.

      • 포트 - 컨테이너 플랫폼 클러스터가 8443 이외의 포트에서 API를 실행하는 경우 이 키를 업데이트합니다.
      • 엔드포인트 - SSL 확인(verify_ssl)을 활성화하거나 검증 설정을 ssl-with-validation 으로 변경할 수 있습니다. 현재 사용자 정의 신뢰할 수 있는 CA 인증서에 대한 지원은 제공되지 않습니다.
4.5.2.1.1. 예제

예를 들어 다음 시나리오를 고려하십시오.

  • container_providers.yml 파일을 /tmp/cp.yml 에 복사했습니다.
  • 두 개의 OpenShift Container Platform 클러스터를 추가하려고 합니다.
  • Red Hat CloudForms 서버는 mgmt.example.com에서 실행됩니다.

이 시나리오의 경우 다음과 같이 /tmp/cp.yml 을 사용자 지정합니다.

container_providers:
  - connection_configurations:
      - authentication: {auth_key: "<token>", authtype: bearer, type: AuthToken} 1
        endpoint: {role: default, security_protocol: ssl-without-validation, verify_ssl: 0}
    hostname: "<provider_hostname1>"
    name: <display_name1>
    port: 8443
    type: "ManageIQ::Providers::Openshift::ContainerManager"
  - connection_configurations:
      - authentication: {auth_key: "<token>", authtype: bearer, type: AuthToken} 2
        endpoint: {role: default, security_protocol: ssl-without-validation, verify_ssl: 0}
    hostname: "<provider_hostname2>"
    name: <display_name2>
    port: 8443
    type: "ManageIQ::Providers::Openshift::ContainerManager"
management_server:
  hostname: "<hostname>"
  user: <user_name>
  password: <password>
1 2
<token> 을 이 클러스터의 관리 토큰으로 바꿉니다.
4.5.2.2. 플레이북 실행

다중 공급자 통합 스크립트를 실행하려면 컨테이너 프로바이더 구성 파일의 경로를 ansible-playbook 명령에 대한 EXTRA_VARS 매개 변수로 제공해야 합니다. -e (또는 --extra-vars) 매개 변수를 사용하여 container_providers_config 를 구성 파일 경로로 설정합니다. 플레이북 디렉터리로 변경하고 플레이북을 실행합니다.

$ cd /usr/share/ansible/openshift-ansible
$ ansible-playbook -v [-i /path/to/inventory] \
    -e container_providers_config=/tmp/cp.yml \
    playbooks/openshift-management/add_many_container_providers.yml

플레이북이 완료되면 Red Hat CloudForms 서비스에서 두 개의 새 컨테이너 프로바이더를 찾을 수 있습니다. 컴퓨팅 → 컨테이너 → 공급자 페이지로 이동하여 개요를 확인합니다.

4.5.3. 공급자 새로 고침

하나 이상의 컨테이너 공급업체를 추가한 후 Red Hat CloudForms에서 새 공급업체를 새로 고쳐 컨테이너 공급업체 및 관리 중인 컨테이너에 대한 모든 최신 데이터를 가져와야 합니다. 이를 위해서는 Red Hat CloudForms 웹 콘솔의 각 공급업체로 이동한 후 각각 새로 고침 버튼을 클릭해야 합니다.

단계는 다음 Red Hat CloudForms 설명서를 참조하십시오.

4.6. Red Hat CloudForms 설치 제거

4.6.1. 설치 제거 Playbook 실행

OpenShift Container Platform에서 배포된 Red Hat CloudForms 설치를 제거 및 제거하려면 플레이북 디렉터리로 변경하고 uninstall.yml 플레이북을 실행합니다.

$ cd /usr/share/ansible/openshift-ansible
$ ansible-playbook -v [-i /path/to/inventory] \
    playbooks/openshift-management/uninstall.yml
중요

NFS 내보내기 정의 및 NFS 내보내기에 저장된 데이터는 자동으로 제거되지 않습니다. 새 배포를 초기화하기 전에 이전 애플리케이션 또는 데이터베이스 배포의 데이터를 수동으로 삭제해야 합니다.

4.6.2. 문제 해결

이전 PostgreSQL 데이터를 지우지 않으면 캐스케이딩 오류가 발생할 수 있으므로 postgresql Pod가 크래시 루프백 상태가 됩니다. 그러면 cfme 포드가 시작되지 않습니다. 크래시 루프백오프 의 원인은 이전 배포 중에 생성된 데이터베이스 NFS 내보내기에 대한 잘못된 파일 권한 때문입니다.

계속하려면 PostgreSQL 내보내기에서 모든 데이터를 지우고 포드(배포자 포드가 아님)를 삭제합니다. 예를 들어 다음 Pod가 있는 경우 다음을 수행합니다.

$ oc get pods
NAME                 READY     STATUS             RESTARTS   AGE
httpd-1-cx7fk        1/1       Running            1          21h
cfme-0               0/1       Running            1          21h
memcached-1-vkc7p    1/1       Running            1          21h
postgresql-1-deploy  1/1       Running            1          21h
postgresql-1-6w2t4   0/1       CrashLoopBackOff   1          21h

그런 다음 다음을 수행합니다.

  1. 데이터베이스 NFS 내보내기에서 데이터를 지웁니다.
  2. 다음을 실행합니다.

    $ oc delete postgresql-1-6w2t4

PostgreSQL 배포자 포드는 삭제한 포드를 교체하기 위해 새 postgresql 포드를 확장하려고 합니다. postgresql 포드가 실행되면 cfme 포드에서 차단을 중지하고 애플리케이션 초기화를 시작합니다.

5장. Prometheus 클러스터 모니터링

5.1. 개요

OpenShift Container Platform에는 Prometheus 오픈 소스 프로젝트 및 광범위한 에코시스템을 기반으로 하는 사전 구성된 자체 업데이트 모니터링 스택이 포함되어 있습니다. 클러스터 구성 요소의 모니터링을 제공하며, 발생하는 모든 문제와 Grafana 대시보드 세트에 대해 클러스터 관리자에게 즉시 알리는 일련의 경고가 포함되어 있습니다.

모니터링 다이어그램

위의 다이어그램에 표시된 모니터링 스택의 핵심에는 배포된 모니터링 구성 요소 및 리소스를 감시하는 OpenShift Container Platform CMO(Cluster Monitoring Operator)가 있으며 항상 최신 상태인지 확인합니다.

Prometheus Operator(PO)는 Prometheus 및 Alertmanager 인스턴스를 생성, 구성 및 관리합니다. 또한 친숙한 Kubernetes 라벨 쿼리를 기반으로 모니터링 대상 구성을 자동으로 생성합니다.

OpenShift Container Platform Monitoring에는 Prometheus 및 Alertmanager 외에도 node-exporter 및 kube- state-metrics 도 포함됩니다. node-exporter는 모든 노드에 배포된 에이전트로 관련 지표를 수집할 수 있습니다. kube-state-metrics 내보내기 에이전트는 Kubernetes 오브젝트를 Prometheus에서 사용할 수 있는 지표로 변환합니다.

클러스터 모니터링의 일부로 모니터링되는 대상은 다음과 같습니다.

  • Prometheus 자체
  • Prometheus-Operator
  • cluster-monitoring-operator
  • Alertmanager 클러스터 인스턴스
  • Kubernetes apiserver
  • kubelets (kubelet includess cAdvisor for per container metrics)
  • kube-controllers
  • kube-state-metrics
  • node-exporter
  • etcd ( etcd 모니터링이 활성화된 경우)

이러한 모든 구성 요소가 자동으로 업데이트됩니다.

OpenShift Container Platform Cluster Monitoring Operator에 대한 자세한 내용은 Cluster Monitoring Operator GitHub 프로젝트를 참조하십시오.

참고

호환성이 보장된 업데이트를 제공하기 위해 OpenShift Container Platform 모니터링 스택의 구성은 명시적으로 사용 가능한 옵션으로 제한됩니다.

5.2. OpenShift Container Platform 클러스터 모니터링 구성

OpenShift Container Platform Ansible openshift_cluster_monitoring_operator 역할은 인벤토리 파일의 변수를 사용하여 Cluster Monitoring Operator를 구성하고 배포합니다.

표 5.1. Ansible 변수
Variable설명

openshift_cluster_monitoring_operator_install

true 인 경우 Cluster Monitoring Operator를 배포합니다. 그렇지 않으면 배포를 취소합니다. 이 변수는 기본적으로 true 로 설정됩니다.

openshift_cluster_monitoring_operator_prometheus_storage_capacity

각 Prometheus 인스턴스의 영구 볼륨 클레임 크기입니다. 이 변수는 openshift_cluster_monitoring_operator_prometheus_storage_enabledtrue 로 설정된 경우에만 적용됩니다. 기본값은 50Gi 입니다.

openshift_cluster_monitoring_operator_alertmanager_storage_capacity

각 Alertmanager 인스턴스의 영구 볼륨 클레임 크기입니다. 이 변수는 openshift_cluster_monitoring_operator_alertmanager_storage_enabledtrue 로 설정된 경우에만 적용됩니다. 기본값은 2Gi 입니다.

openshift_cluster_monitoring_operator_node_selector

Pod가 특정 레이블이 있는 노드에 배치되도록 원하는 기존 노드 선택기 로 설정합니다. 기본값은 node-role.kubernetes.io/infra=true 입니다.

openshift_cluster_monitoring_operator_alertmanager_config

Alertmanager 구성.

openshift_cluster_monitoring_operator_prometheus_storage_enabled

Prometheus의 시계열 데이터의 영구 스토리지를 활성화합니다. 이 변수는 기본적으로 false 로 설정됩니다.

openshift_cluster_monitoring_operator_alertmanager_storage_enabled

Alertmanager 알림 및 음소거의 영구 스토리지를 활성화합니다. 이 변수는 기본적으로 false 로 설정됩니다.

openshift_cluster_monitoring_operator_prometheus_storage_class_name

openshift_cluster_monitoring_operator_prometheus_storage_enabled 옵션을 활성화한 경우 특정 StorageClass를 설정하여 Pod가 해당 스토리지 클래스에서 PVC 를 사용하도록 구성되어 있는지 확인합니다. 기본값은 none 으로, 기본 스토리지 클래스 이름을 적용합니다.

openshift_cluster_monitoring_operator_alertmanager_storage_class_name

openshift_cluster_monitoring_operator_alertmanager_storage_enabled 옵션을 활성화한 경우 특정 StorageClass를 설정하여 Pod가 해당 스토리지 클래스에서 PVC 를 사용하도록 구성되어 있는지 확인합니다. 기본값은 none 으로, 기본 스토리지 클래스 이름을 적용합니다.

5.2.1. 모니터링 사전 요구 사항

모니터링 스택은 추가 리소스 요구 사항을 적용합니다. 자세한 내용은 컴퓨팅 리소스 권장 사항을 참조하십시오.

5.2.2. 모니터링 스택 설치

모니터링 스택은 기본적으로 OpenShift Container Platform과 함께 설치됩니다. 설치되지 않도록 할 수 있습니다. 이를 수행하려면 Ansible 인벤토리 파일에서 이 변수를 false로 설정합니다.

openshift_cluster_monitoring_operator_install

다음을 실행하여 수행할 수 있습니다.

$ ansible-playbook [-i </path/to/inventory>] <OPENSHIFT_ANSIBLE_DIR>/playbooks/openshift-monitoring/config.yml \
   -e openshift_cluster_monitoring_operator_install=False

Ansible 디렉터리의 일반적인 경로는 /usr/share/ansible/openshift-ansible/ 입니다. 이 경우 구성 파일의 경로는 /usr/share/ansible/openshift-ansible/playbooks/openshift-monitoring/config.yml 입니다.

5.2.3. 영구 스토리지

영구저장장치를 사용하여 클러스터 모니터링을 실행하면 메트릭이 영구 볼륨에 저장되며 Pod가 다시 시작되거나 재생성될 수 있습니다. 데이터 손실에서 메트릭 또는 경고 데이터가 필요한 경우 이상적입니다. 프로덕션 환경의 경우 블록 스토리지 기술을 사용하여 영구 스토리지를 구성하는 것이 좋습니다.

5.2.3.1. 영구 스토리지 활성화

기본적으로 Prometheus 시계열 데이터 및 Alertmanager 알림 및 음소거에 대해 영구 스토리지가 비활성화됩니다. 클러스터 중 하나를 영구적으로 저장하거나 둘 다 저장하도록 구성할 수 있습니다.

  • Prometheus 시계열 데이터의 영구 스토리지를 활성화하려면 Ansible 인벤토리 파일에서 이 변수를 true 로 설정합니다.

    openshift_cluster_monitoring_operator_prometheus_storage_enabled

  • Alertmanager 알림 및 음소거의 영구 스토리지를 활성화하려면 Ansible 인벤토리 파일에서 이 변수를 true 로 설정합니다.

    openshift_cluster_monitoring_operator_alertmanager_storage_enabled

5.2.3.2. 스토리지가 필요한 정도 확인

필요한 스토리지의 양은 Pod 수에 따라 달라집니다. 관리자는 디스크가 가득 차지 않도록 충분한 스토리지를 전담해야 합니다. 영구 스토리지의 시스템 요구 사항에 대한 자세한 내용은 Cluster Monitoring Operator 용량 계획을 참조하십시오.

5.2.3.3. 영구 스토리지 크기 설정

Prometheus 및 Alertmanager에 대한 영구 볼륨 클레임의 크기를 지정하려면 다음 Ansible 변수를 변경합니다.

  • openshift_cluster_monitoring_operator_prometheus_storage_capacity (default: 50Gi)
  • openshift_cluster_monitoring_operator_alertmanager_storage_capacity (default: 2Gi)

이러한 각 변수는 해당 storage_enabled 변수가 true 로 설정된 경우에만 적용됩니다.

5.2.3.4. 충분한 영구 볼륨 할당

동적으로 프로비저닝된 스토리지를 사용하지 않는 경우 PVC에서 각 복제본에 대해 하나의 PV인 PV(영구 볼륨)를 요청할 준비가 되어 있는지 확인해야 합니다. Prometheus에는 두 개의 복제본이 있으며 Alertmanager에는 세 개의 복제본이 있으며, PV는 5개입니다.

5.2.3.5. 동적으로 프로비저닝된 스토리지 활성화

정적으로 프로비저닝된 스토리지 대신 동적으로 프로비저닝된 스토리지를 사용할 수 있습니다. 자세한 내용은 동적 볼륨 프로비저닝 을 참조하십시오.

Prometheus 및 Alertmanager의 동적 스토리지를 활성화하려면 Ansible 인벤토리 파일에서 다음 매개변수를 true 로 설정합니다.

  • openshift_cluster_monitoring_operator_prometheus_storage_enabled (기본값: false)
  • openshift_cluster_monitoring_operator_alertmanager_storage_enabled (기본값: false)

동적 스토리지를 활성화한 후 Ansible 인벤토리 파일의 다음 매개변수에 있는 각 구성 요소에 대한 영구 볼륨 클레임의 스토리지 클래스를 설정할 수도 있습니다.

  • openshift_cluster_monitoring_operator_prometheus_storage_class_name (default: "")
  • openshift_cluster_monitoring_operator_alertmanager_storage_class_name (default: "")

이러한 각 변수는 해당 storage_enabled 변수가 true 로 설정된 경우에만 적용됩니다.

5.2.4. 지원되는 구성

지원되는 OpenShift Container Platform 모니터링 구성 방법은 이 가이드에 설명된 옵션을 사용하여 구성하는 것입니다. 이러한 명시적 구성 옵션 외에도 스택에 추가 구성을 삽입할 수 있습니다. 그러나 구성 패러다임은 Prometheus 릴리스에서 변경될 수 있으며 이러한 경우는 모든 구성 가능성이 제어되는 경우에만 정상적으로 처리할 수 있기 때문에 지원되지 않습니다.

명시적으로 지원되지 않는 경우는 다음과 같습니다.

  • openshift-monitoring 네임스페이스에 추가 ServiceMonitor 오브젝트를 생성하여 클러스터 모니터링 Prometheus 인스턴스 스크랩을 대상으로 확장합니다. 이로 인해 처리할 수 없는 충돌 및 로드 차이점이 발생할 수 있으므로 Prometheus 설정을 불안정할 수 있습니다.
  • 클러스터 모니터링 Prometheus 인스턴스에 추가 경고 및 기록 규칙이 포함되도록 하는 추가 ConfigMap 오브젝트를 생성합니다. Prometheus 2.0에는 새 규칙 파일 구문이 제공되므로 이 동작은 적용 시 중단되는 동작을 발생시키는 것으로 알려져 있습니다.

5.3. Alertmanager 구성

Alertmanager는 들어오는 경고를 관리합니다. 여기에는 이메일, PagerDuty 및 HipChat과 같은 방법을 통해 알림 전송이 포함됩니다.

OpenShift Container Platform Monitoring Alertmanager 클러스터의 기본 구성은 다음과 같습니다.

  global:
    resolve_timeout: 5m
  route:
    group_wait: 30s
    group_interval: 5m
    repeat_interval: 12h
    receiver: default
    routes:
    - match:
        alertname: DeadMansSwitch
      repeat_interval: 5m
      receiver: deadmansswitch
  receivers:
  - name: default
  - name: deadmansswitch

이 구성은 openshift_cluster_monitoring _operator 역할의 Ansible 변수 openshift_cluster_monitoring_operator_alertmanager_ config 를 사용하여 덮어쓸 수 있습니다.

다음 예제에서는 알림을 위해 PagerDuty 를 구성합니다. service_key 를 검색하는 방법을 알아보려면 Alertmanager 에 대한 PagerDuty 문서를 참조하십시오.

openshift_cluster_monitoring_operator_alertmanager_config: |+
  global:
    resolve_timeout: 5m
  route:
    group_wait: 30s
    group_interval: 5m
    repeat_interval: 12h
    receiver: default
    routes:
    - match:
        alertname: DeadMansSwitch
      repeat_interval: 5m
      receiver: deadmansswitch
    - match:
        service: example-app
      routes:
      - match:
          severity: critical
        receiver: team-frontend-page
  receivers:
  - name: default
  - name: deadmansswitch
  - name: team-frontend-page
    pagerduty_configs:
    - service_key: "<key>"

하위 경로는 critical 의 심각도가 있는 경고에서만 일치하고 team-frontend-page 라는 수신자를 사용하여 전송합니다. 이름에서 알 수 있듯이 중요한 경고에 대해 다른 사람을 호출해야 합니다. 다양한 경고 수신자를 통한 경고 구성은 Alertmanager 설정을 참조하십시오.

5.3.1. 배달된 사람의 스위치

OpenShift Container Platform 모니터링에는 모니터링 인프라를 사용할 수 있도록 잘못된 버전의 스위치가 포함되어 있습니다.

배달 못 한 사람의 스위치는 항상 트리거되는 간단한 Prometheus 경고 규칙입니다. Alertmanager는 배달된 사람의 스위치에 대한 알림을 지속적으로 이 기능을 지원하는 알림 프로바이더로 보냅니다. 또한 Alertmanager와 알림 프로바이더 간의 통신이 작동하는지 확인합니다.

이 메커니즘은 모니터링 시스템 자체가 중단될 때 알림을 발행하도록 PagerDuty에서 지원합니다. 자세한 내용은 아래 Dead man의 switch PagerDuty 를 참조하십시오.

5.3.2. 경고 그룹화

Alertmanager에 대해 경고가 실행된 후 논리적으로 그룹화하는 방법을 확인하도록 구성해야 합니다.

이 예에서는 프론트엔드 팀의 경고 라우팅을 반영하기 위해 새 경로가 추가됩니다.

절차

  1. 새 경로 추가. 원본 경로 아래에 여러 경로를 추가하여 일반적으로 알림 수신자를 정의할 수 있습니다. 다음 예제에서는 일치 항목을 사용하여 서비스 example-app 에서 들어오는 경고만 사용됩니다.

    global:
      resolve_timeout: 5m
    route:
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 12h
      receiver: default
      routes:
      - match:
          alertname: DeadMansSwitch
        repeat_interval: 5m
        receiver: deadmansswitch
      - match:
          service: example-app
        routes:
        - match:
            severity: critical
          receiver: team-frontend-page
    receivers:
    - name: default
    - name: deadmansswitch

    하위 경로는 심각도가 critical 인 경고에서만 일치하고 team-frontend-page 라는 수신자를 사용하여 전송합니다. 이름에서 알 수 있듯이 중요한 경고에 대해 다른 사람을 호출해야 합니다.

5.3.3. dead man의 스위치 PagerDuty

PagerDutyDead Man's Snitch 라는 통합을 통해 이 메커니즘을 지원합니다. PagerDuty 구성을 기본 deadmansswitch 수신자에 추가하면 됩니다. 위에서 설명한 프로세스를 사용하여 이 구성을 추가합니다.

Dead man의 스위치 경고가 15분 동안 자동으로 작동될 경우 운영자를 호출하도록 Dead Man의 Snitch를 구성합니다. 기본 Alertmanager 설정을 사용하면 5분마다 Dead man의 스위치 경고가 반복됩니다. 15분 후에 Dead Man의 Snitch가 트리거되면 알림이 2번 이상 실패했음을 나타냅니다.

PagerDuty를 위한 Dead Man의 Snitch 구성 방법 알아보기.

5.3.4. 경고 규칙

OpenShift Container Platform 클러스터 모니터링에는 기본적으로 구성된 다음 경고 규칙이 제공됩니다. 현재는 사용자 지정 경고 규칙을 추가할 수 없습니다.

일부 경고 규칙에는 이름이 동일합니다. 이것은 의도적입니다. 임계값이 다르거나 심각도가 다르거나 둘 다 있는 동일한 이벤트에 대해 경고합니다. 억제 규칙을 사용하면 심각도가 더 높은 심각도가 실행되면 더 낮은 심각도가 억제됩니다.

경고 규칙에 대한 자세한 내용은 구성 파일을 참조하십시오.

경고심각도설명

ClusterMonitoringOperatorErrors

심각

Cluster Monitoring Operator에서 X% 오류가 발생했습니다.

AlertmanagerDown

심각

Alertmanager가 Prometheus 대상 검색에서 사라졌습니다.

ClusterMonitoringOperatorDown

심각

ClusterMonitoringOperator가 Prometheus 대상 검색에서 사라졌습니다.

KubeAPIDown

심각

KubeAPI가 Prometheus 대상 검색에서 사라졌습니다.

KubeControllerManagerDown

심각

kubecontrollermanager가 Prometheus 대상 검색에서 사라졌습니다.

KubeSchedulerDown

심각

kubescheduler가 Prometheus 대상 검색에서 사라졌습니다.

KubeStateMetricsDown

심각

KubeStateMetrics는 Prometheus 대상 검색에서 사라졌습니다.

KubeletDown

심각

kubelet이 Prometheus 대상 검색에서 사라졌습니다.

NodeExporterDown

심각

NodeExporter는 Prometheus 대상 검색에서 사라졌습니다.

PrometheusDown

심각

Prometheus는 Prometheus 대상 검색에서 사라졌습니다.

PrometheusOperatorDown

심각

prometheusOperator는 Prometheus 대상 검색에서 사라졌습니다.

KubePodCrashLooping

심각

네임스페이스/포드 (컨테이너)가 재시작 시간 / 초

KubePodNotReady

심각

네임 스페이스/Pod 가 준비되지 않았습니다.

KubeDeploymentGenerationMismatch

심각

배포 네임 스페이스/배포 생성 불일치

KubeDeploymentReplicasMismatch

심각

배포 네임 스페이스/배포 복제본 불일치

KubeStatefulSetReplicasMismatch

심각

StatefulSet 네임 스페이스/StatefulSet 복제본 불일치

KubeStatefulSetGenerationMismatch

심각

StatefulSet 네임 스페이스/StatefulSet 생성 불일치

KubeDaemonSetRolloutStuck

심각

원하는 Pod의 X%만 예약되고 데몬 세트 네임 스페이스/DaemonSet준비가 완료되었습니다.

KubeDaemonSetNotScheduled

경고

daemonset 네임스페이스/DaemonSet 의 여러 Pod는 예약되지 않습니다.

KubeDaemonSetMisScheduled

경고

데몬 세트 네임스페이스/DaemonSet 의 여러 Pod가 실행되지 않아야 하는 위치입니다.

KubeCronJobRunning

경고

CronJob 네임스페이스/CronJob 은 완료하는 데 1시간 이상 걸립니다.

KubeJobCompletion

경고

작업 네임스페이스/Job 을 완료하는 데 1시간 이상 걸립니다.

KubeJobFailed

경고

작업 네임스페이스/Job 을 완료하지 못했습니다.

KubeCPUOvercommit

경고

Pod에서 과다 할당된 CPU 리소스 요청은 노드 오류를 허용하지 않습니다.

KubeMemOvercommit

경고

Pod에서 과다 할당된 메모리 리소스 요청은 노드 오류를 허용하지 않습니다.

KubeCPUOvercommit

경고

네임스페이스에서 과다 할당된 CPU 리소스 요청 할당량입니다.

KubeMemOvercommit

경고

네임스페이스에서 과다 할당된 메모리 리소스 요청 할당량입니다.

alerKubeQuotaExceeded

경고

네임스페이스 네임스페이스에서 리소스의 X% 사용.

KubePersistentVolumeUsageCritical

심각

네임스페이스에서 PersistentVolumeClaim 이 클레임한 영구 볼륨은 X% 사용 가능합니다.

KubePersistentVolumeFullInFourDays

심각

최근 샘플링에 따라 네임스페이스에서 PersistentVolumeClaim에서 클레임 한 영구 볼륨은 4일 내에 채워질 것으로 예상됩니다. 현재 X 바이트를 사용할 수 있습니다.

KubeNodeNotReady

경고

노드 가 1시간 이상 준비되지 않았습니다

KubeVersionMismatch

경고

X 버전의 Kubernetes 구성 요소가 실행되고 있습니다.

KubeClientErrors

경고

Kubernetes API 서버 클라이언트 '작업/인스턴스'에 X% 오류가 발생했습니다.

KubeClientErrors

경고

Kubernetes API 서버 클라이언트 '작업/인스턴스'에 X 오류/초가 발생했습니다.

KubeletTooManyPods

경고

kubelet 인스턴스는 110개 제한에 가까운 X Pod를 실행하고 있습니다.

KubeAPILatencyHigh

경고

API 서버에는 Verb ResourceX 초의 99번째 백분위 대기 시간이 있습니다.

KubeAPILatencyHigh

심각

API 서버에는 Verb ResourceX 초의 99번째 백분위 대기 시간이 있습니다.

KubeAPIErrorsHigh

심각

API 서버가 요청의 X%에 대해 오류가 발생했습니다.

KubeAPIErrorsHigh

경고

API 서버가 요청의 X%에 대해 오류가 발생했습니다.

KubeClientCertificateExpiration

경고

Kubernetes API 인증서가 7일 이내에 만료됩니다.

KubeClientCertificateExpiration

심각

Kubernetes API 인증서가 1일 이내에 만료됩니다.

AlertmanagerConfigInconsistent

심각

요약: 동기화되지 않은 구성. 설명: Alertmanager 클러스터 서비스의 인스턴스 구성이 동기화되지 않았습니다.

AlertmanagerFailedReload

경고

요약: Alertmanager의 설정을 다시 로드하지 못했습니다. 설명: Alertmanager 설정을 다시 로드하지 못했습니다. Namespace/Pod 에 실패했습니다.

TargetDown

경고

요약: 대상은 다운됩니다. 설명: 작업 대상의 X%가 다운되었습니다.

DeadMansSwitch

none

요약: 경고 DeadMansSwitch. 설명: DeadMansSwitch는 전체 경고 파이프라인이 작동하는지 확인합니다.

NodeDiskRunningFull

경고

노드 내보내기 네임스페이스/Pod장치 장치가 다음 24시간 내에 완전히 실행됩니다.

NodeDiskRunningFull

심각

다음 2시간 내에 node -exporter 네임스페이스/Pod장치 장치가 완전히 실행됩니다.

PrometheusConfigReloadFailed

경고

요약: Prometheus 구성을 다시 로드하지 못했습니다. 설명: Namespace/Pod에 대해 Prometheus 구성을 다시 로드하지 못했습니다

PrometheusNotificationQueueRunningFull

경고

요약: Prometheus의 경고 알림 대기열이 완전히 실행됩니다. 설명: Prometheus의 경고 알림 대기열이 네임 스페이스/Pod에 대해 전체 실행 중입니다

PrometheusErrorSendingAlerts

경고

요약: Prometheus에서 경고를 보내는 동안 오류가 발생했습니다. 설명: Prometheus 네임스페이스/Pod 에서 Alertmanager로 경고를 보내는 동안 오류 발생

PrometheusErrorSendingAlerts

심각

요약: Prometheus에서 경고를 보내는 동안 오류가 발생했습니다. 설명: Prometheus 네임스페이스/Pod 에서 Alertmanager로 경고를 보내는 동안 오류 발생

PrometheusNotConnectedToAlertmanagers

경고

요약: Prometheus는 Alertmanagers에 연결되어 있지 않습니다. 설명: Prometheus 네임 스페이스/Pod 가 Alertmanagers에 연결되어 있지 않습니다

PrometheusTSDBReloadsFailing

경고

요약: Prometheus는 디스크에서 데이터 블록을 다시 로드하는 데 문제가 있습니다. 설명: 인스턴스의 작업에 지난 4시간 동안 X 다시 로드 오류가 발생했습니다.

PrometheusTSDBCompactionsFailing

경고

요약: Prometheus는 샘플 블록을 압축하는 데 문제가 있습니다. 설명: 인스턴스의 작업에 지난 4시간 동안 X 압축 오류가 발생했습니다.

PrometheusTSDBWALCorruptions

경고

요약: Prometheus write-ahead 로그가 손상되었습니다. 설명: 인스턴스의 작업에 는 WAL( write-ahead) 로그가 손상되었습니다.

PrometheusNotIngestingSamples

경고

요약: Prometheus는 샘플을 수집하지 않습니다. 설명: Prometheus 네임스페이스/Pod 가 샘플을 수집하지 않습니다.

PrometheusTargetScrapesDuplicate

경고

요약: Prometheus에는 거부된 많은 샘플이 있습니다. 설명: 네임스페이스/Pod 에는 중복 타임스탬프로 인해 거부되지만 다른 값이 있습니다.

EtcdInsufficientMembers

심각

etcd 클러스터 "Job": insufficient members(X).

EtcdNoLeader

심각

etcd 클러스터 "작업": 멤버 인스턴스는 리더가 없습니다.

EtcdHighNumberOfLeaderChanges

경고

etcd 클러스터 "작업": 인스턴스 인스턴스는 지난 1 시간 이내에 X 리더 변경 사항을 보았습니다.

EtcdHighNumberOfFailedGRPCRequests

경고

etcd 클러스터 "작업": etcd 인스턴스 인스턴스에서 GRPC_Method 에 대한 요청의 x%가 실패했습니다.

EtcdHighNumberOfFailedGRPCRequests

심각

etcd 클러스터 "작업": etcd 인스턴스 인스턴스에서 GRPC_Method 에 대한 요청의 x%가 실패했습니다.

EtcdGRPCRequestsSlow

심각

etcd 클러스터 "작업": GRPC_Method 에 대한 gRPC 요청은 etcd 인스턴스 _Instance에서 X_s를 가져옵니다.

EtcdMemberCommunicationSlow

경고

etcd 클러스터 "작업": To 와 멤버 통신이 etcd 인스턴스 _Instance에서 X_s를 가져옵니다.

EtcdHighNumberOfFailedProposals

경고

etcd 클러스터 "작업": etcd 인스턴스 인스턴스의 마지막 1시간 내에 제안 오류가 발생합니다.

EtcdHighFsyncDurations

경고

etcd 클러스터 "작업": 99번째 백분율 fync 기간은 etcd 인스턴스에서 X_s입니다. _Instance.

EtcdHighCommitDurations

경고

etcd 클러스터 "작업": etcd 인스턴스에서 X_s의 99번째 백분위 커밋 기간(_I) _Instance.

FdExhaustionClose

경고

작업 인스턴스 인스턴스에서 파일 설명자가 곧 소진됩니다

FdExhaustionClose

심각

작업 인스턴스 인스턴스에서 파일 설명자가 곧 소진됩니다

5.4. etcd 모니터링 구성

etcd 서비스가 올바르게 실행되지 않으면 전체 OpenShift Container Platform 클러스터가 성공적으로 작동하지 않을 수 있습니다. 따라서 etcd 모니터링을 구성하는 것이 좋습니다.

다음 단계에 따라 etcd 모니터링을 구성하십시오.

절차

  1. 모니터링 스택이 실행 중인지 확인합니다.

    $ oc -n openshift-monitoring get pods
    NAME                                           READY     STATUS              RESTARTS   AGE
    alertmanager-main-0                            3/3       Running             0          34m
    alertmanager-main-1                            3/3       Running             0          33m
    alertmanager-main-2                            3/3       Running             0          33m
    cluster-monitoring-operator-67b8797d79-sphxj   1/1       Running             0          36m
    grafana-c66997f-pxrf7                          2/2       Running             0          37s
    kube-state-metrics-7449d589bc-rt4mq            3/3       Running             0          33m
    node-exporter-5tt4f                            2/2       Running             0          33m
    node-exporter-b2mrp                            2/2       Running             0          33m
    node-exporter-fd52p                            2/2       Running             0          33m
    node-exporter-hfqgv                            2/2       Running             0          33m
    prometheus-k8s-0                               4/4       Running             1          35m
    prometheus-k8s-1                               0/4       ContainerCreating   0          21s
    prometheus-operator-6c9fddd47f-9jfgk           1/1       Running             0          36m
  2. 클러스터 모니터링 스택의 구성 파일을 엽니다.

    $ oc -n openshift-monitoring edit configmap cluster-monitoring-config
  3. config.yaml: |+ 에서 etcd 섹션을 추가합니다.

    1. 마스터 노드의 정적 Pod에서 etcd 를 실행하는 경우 선택기를 사용하여 etcd 노드를 지정할 수 있습니다.

      ...
      data:
        config.yaml: |+
          ...
          etcd:
            targets:
              selector:
                openshift.io/component: etcd
                openshift.io/control-plane: "true"
    2. 별도의 호스트에서 etcd 를 실행하는 경우 IP 주소를 사용하여 노드를 지정해야 합니다.

      ...
      data:
        config.yaml: |+
          ...
          etcd:
            targets:
             ips:
             - "127.0.0.1"
             - "127.0.0.2"
             - "127.0.0.3"

      etcd 노드의 IP 주소가 변경되면 이 목록을 업데이트해야 합니다.

  4. etcd 서비스 모니터가 실행 중인지 확인합니다.

    $ oc -n openshift-monitoring get servicemonitor
    NAME                  AGE
    alertmanager          35m
    etcd                  1m 1
    kube-apiserver        36m
    kube-controllers      36m
    kube-state-metrics    34m
    kubelet               36m
    node-exporter         34m
    prometheus            36m
    prometheus-operator   37m
    1
    etcd 서비스 모니터입니다.

    etcd 서비스 모니터를 시작하는 데 최대 1분이 걸릴 수 있습니다.

  5. 이제 웹 인터페이스로 이동하여 etcd 모니터링 상태에 대한 자세한 정보를 확인할 수 있습니다.

    1. URL을 가져오려면 다음을 실행합니다.

      $ oc -n openshift-monitoring get routes
      NAME                HOST/PORT                                                                           PATH      SERVICES            PORT      TERMINATION   WILDCARD
      ...
      prometheus-k8s      prometheus-k8s-openshift-monitoring.apps.msvistun.origin-gce.dev.openshift.com                prometheus-k8s      web       reencrypt     None
    2. https 를 사용하여 prometheus-k8s 에 대해 나열된 URL로 이동합니다. 로그인합니다.
  6. 사용자가 cluster-monitoring-view 역할에 속하는지 확인합니다. 이 역할은 클러스터 모니터링 UI를 볼 수 있는 액세스를 제공합니다.

    예를 들어 사용자 developer를 cluster -monitoring-view 역할에 추가하려면 다음을 실행합니다.

    $ oc adm policy add-cluster-role-to-user cluster-monitoring-view developer
  7. 웹 인터페이스에서 cluster-monitoring-view 역할에 속하는 사용자로 로그인합니다.
  8. Status(상태 )를 클릭한 다음 Targets(대상) 를 클릭합니다. etcd 항목이 표시되면 etcd 가 모니터링됩니다.

    etcd 인증서 없음
  9. etcd 가 모니터링되는 동안 Prometheus는 아직 etcd 에 대해 인증할 수 없으므로 메트릭을 수집할 수 없습니다.

    etcd 에 대해 Prometheus 인증을 구성하려면 다음을 수행합니다.

    1. 마스터 노드의 /etc/etcd/ca/ca.crt/etc/etcd/ca/ca.key 자격 증명 파일을 로컬 시스템으로 복사합니다.

      $ ssh -i gcp-dev/ssh-privatekey cloud-user@35.237.54.213
    2. 다음 내용을 사용하여 openssl.cnf 파일을 생성합니다.

      [ req ]
      req_extensions = v3_req
      distinguished_name = req_distinguished_name
      [ req_distinguished_name ]
      [ v3_req ]
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, keyEncipherment, digitalSignature
      extendedKeyUsage=serverAuth, clientAuth
    3. etcd.key 개인 키 파일을 생성합니다.

      $ openssl genrsa -out etcd.key 2048
    4. etcd.csr 인증서 서명 요청 파일을 생성합니다.

      $ openssl req -new -key etcd.key -out etcd.csr -subj "/CN=etcd" -config openssl.cnf
    5. etcd.crt 인증서 파일을 생성합니다.

      $ openssl x509 -req -in etcd.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out etcd.crt -days 365 -extensions v3_req -extfile openssl.cnf
    6. 인증 정보를 OpenShift Container Platform에서 사용하는 형식으로 설정합니다.

      $ cat <<-EOF > etcd-cert-secret.yaml
      apiVersion: v1
      data:
        etcd-client-ca.crt: "$(cat ca.crt | base64 --wrap=0)"
        etcd-client.crt: "$(cat etcd.crt | base64 --wrap=0)"
        etcd-client.key: "$(cat etcd.key | base64 --wrap=0)"
      kind: Secret
      metadata:
        name: kube-etcd-client-certs
        namespace: openshift-monitoring
      type: Opaque
      EOF

      이렇게 하면 etcd-cert-secret.yaml 파일이 생성됩니다.

    7. 인증 정보 파일을 클러스터에 적용합니다.

      $ oc apply -f etcd-cert-secret.yaml
  10. 인증을 구성했으므로 웹 인터페이스의 Targets(대상) 페이지를 다시 방문하십시오. etcd 가 올바르게 모니터링되고 있는지 확인합니다. 변경 사항을 적용하는 데 몇 분이 걸릴 수 있습니다.

    etcd 모니터링 작동
  11. OpenShift Container Platform을 업데이트할 때 etcd 모니터링을 자동으로 업데이트하려면 Ansible 인벤토리 파일에서 이 변수를 true 로 설정합니다.

    openshift_cluster_monitoring_operator_etcd_enabled=true

    별도의 호스트에서 etcd 를 실행하는 경우 다음 Ansible 변수를 사용하여 IP 주소로 노드를 지정합니다.

    openshift_cluster_monitoring_operator_etcd_hosts=[<address1>, <address2>, ...]

    etcd 노드의 IP 주소가 변경되면 이 목록을 업데이트해야 합니다.

5.5. Prometheus, Alertmanager 및 Grafana에 액세스

OpenShift Container Platform 모니터링에는 클러스터 모니터링을 위한 Prometheus 인스턴스와 중앙 Alertmanager 클러스터가 포함되어 있습니다. OpenShift Container Platform Monitoring에는 Prometheus 및 Alertmanager 외에도 클러스터 모니터링 문제 해결을 위한 사전 빌드된 대시보드뿐만 아니라 Grafana 인스턴스도 포함되어 있습니다. 대시보드와 함께 모니터링 스택을 통해 제공되는 Grafana 인스턴스는 읽기 전용입니다.

Prometheus, Alertmanager 및 Grafana 웹 UI에 액세스하는 데 필요한 주소를 가져오려면 다음을 수행합니다.

절차

  1. 다음 명령을 실행합니다.

    $ oc -n openshift-monitoring get routes
    NAME                HOST/PORT
    alertmanager-main   alertmanager-main-openshift-monitoring.apps._url_.openshift.com
    grafana             grafana-openshift-monitoring.apps._url_.openshift.com
    prometheus-k8s      prometheus-k8s-openshift-monitoring.apps._url_.openshift.com

    https:// 앞에 이러한 주소를 추가해야 합니다. 암호화되지 않은 연결을 사용하여 웹 UI에 액세스할 수 없습니다.

  2. 인증은 OpenShift Container Platform ID에 대해 수행되며 OpenShift Container Platform의 다른 곳에서 사용되는 것과 동일한 자격 증명 또는 인증 수단을 사용합니다. cluster -monitoring-view 클러스터 역할과 같은 모든 네임스페이스에 대한 읽기 액세스 권한이 있는 역할을 사용해야 합니다.

6장. Red Hat 레지스트리에 액세스 및 구성

6.1. 인증 활성화 Red Hat 레지스트리

Red Hat Container Catalog를 통해 사용할 수 있는 모든 컨테이너 이미지는 이미지 레지스트리인 registry.access.redhat.com 에 호스팅됩니다. OpenShift Container Platform 3.11 Red Hat Container Catalog를 registry.access.redhat.com에서 registry. redhat.io 로 이동했습니다.

새 레지스트리 registry.redhat.io 는 OpenShift Container Platform의 이미지 및 호스팅 콘텐츠에 액세스할 수 있는 인증이 필요합니다. 새 레지스트리로 마이그레이션한 후 기존 레지스트리를 일정 기간 동안 사용할 수 있습니다.

참고

OpenShift Container Platform은 registry.redhat.io에서 이미지를 가져 오므로 이를 사용할 수 있도록 클러스터를 설정해야합니다.

새 레지스트리는 다음과 같은 방법으로 인증에 표준 OAuth 메커니즘을 사용합니다.

  • 인증 토큰: 관리자가 생성한 토큰은 시스템에 컨테이너 이미지 레지스트리에 대한 인증 기능을 제공하는 서비스 계정입니다. 서비스 계정은 사용자 계정 변경의 영향을 받지 않으므로 인증에 토큰을 사용하는 것은 안정적이고 유연한 인증 방법입니다. 이는 프로덕션 클러스터에 대해 지원되는 유일한 인증 옵션입니다.
  • 웹 사용자 이름 및 암호: 이는 access.redhat.com과 같은 리소스에 로그인하는 데 사용하는 표준 인증 정보 집합입니다. OpenShift Container Platform에서 이 인증 방법을 사용할 수는 있지만 프로덕션 배포에는 지원되지 않습니다. 이 인증 방법은 OpenShift Container Platform 외부의 독립형 프로젝트에서만 사용해야합니다.

사용자 이름 및 암호 또는 인증 토큰 중 하나의 자격 증명으로 Docker 로그인을 사용하여 새 레지스트리의 콘텐츠에 액세스할 수 있습니다.

모든 이미지 스트림은 새 레지스트리를 가리킵니다. 새 레지스트리에는 액세스에 대한 인증이 필요하므로 OpenShift 네임스페이스에 imagestreamsecret 이라는 새 시크릿이 있습니다.

다음 두 위치에 인증 정보를 배치해야 합니다.

  • OpenShift 네임 스페이스: OpenShift 네임스페이스의 이미지 스트림을 가져올 수 있도록 인증 정보가 OpenShift 네임스페이스에 있어야 합니다.
  • 호스트: Kubernetes에서 이미지를 가져올 때 호스트의 인증 정보를 사용하므로 호스트에 인증 정보가 있어야합니다.

새 레지스트리에 액세스하려면 다음을 수행합니다.

  • 이미지 가져오기 시크릿 imagestreamsecret 이 OpenShift 네임스페이스에 있는지 확인합니다. 해당 시크릿에는 새 레지스트리에 액세스할 수 있는 인증 정보가 있습니다.
  • 모든 클러스터 노드에 마스터에서 복사된 /var/lib/origin/.docker/config.json 이 Red Hat 레지스트리에 액세스할 수 있도록 합니다.

6.1.1. 사용자 계정 생성

Red Hat 제품에 대한 권한이 있는 Red Hat 고객인 경우 해당 사용자 자격 증명이 있는 계정이 있습니다. Red Hat 고객 포털에 로그인하는 데 사용하는 사용자 이름과 암호입니다.

계정이 없는 경우 다음 옵션 중 하나에 등록하여 무료로 계정을 얻을 수 있습니다.

6.1.2. Red Hat 레지스트리에 대한 서비스 계정 및 인증 토큰 생성

조직에서 공유 계정을 관리하는 경우 토큰을 생성해야 합니다. 관리자는 조직과 연결된 모든 토큰을 생성, 보기 및 삭제할 수 있습니다.

사전 요구 사항

  • 사용자 인증 정보

절차

Docker 로그인을 완료하기 위해 토큰을 생성하려면 다음을 수행합니다.

  1. registry.redhat.io 로 이동합니다.
  2. RHN(Red Hat Network) 사용자 이름과 암호로 로그인합니다.
  3. 메시지가 표시되면 조건 수락.

    • 즉시 약관을 수락하라는 메시지가 표시되지 않으면 다음 단계를 진행하면 메시지가 표시됩니다.
  4. 레지스트리 서비스 계정 페이지에서 서비스 계정 생성을클릭합니다.

    1. 서비스 계정의 이름을 입력합니다. 앞에 임의의 문자열이 붙습니다.
    2. 설명을 입력합니다.
    3. 생성을 클릭합니다.
  5. 서비스 계정으로 다시 이동합니다.
  6. 생성한 서비스 계정을 클릭합니다.
  7. 앞에 있는 문자열을 포함하여 사용자 이름을 복사합니다.
  8. 토큰을 복사합니다.

6.1.3. 설치 및 업그레이드를 위한 레지스트리 인증 정보 관리

Ansible 설치 프로그램을 사용하여 설치 또는 업그레이드 중에 레지스트리 자격 증명을 관리할 수도 있습니다.

이렇게 하면 다음 설정이 설정됩니다.

  • OpenShift 네임스페이스의 imagestreamsecret.
  • 모든 노드의 자격 증명.

openshift_examples_registryurl 또는 oreg_url 에 기본값 registry.redhat.io 를 사용하는 경우 Ansible 설치 프로그램에서 자격 증명이 필요합니다.

사전 요구 사항

  • 사용자 인증 정보
  • 서비스 계정
  • 서비스 계정 토큰

절차

Ansible 설치 프로그램을 사용하여 설치 또는 업그레이드 중에 레지스트리 인증 정보를 관리하려면 다음을 수행합니다.

  • 설치 또는 업그레이드 중에 설치 프로그램 인벤토리에 oreg_auth_useroreg_auth_password 변수를 지정합니다.
참고

토큰을 생성한 경우 oreg_auth_password 를 토큰 값으로 설정합니다.

인증된 추가 레지스트리에 액세스해야 하는 클러스터는 openshift_additional_registry_credentials 를 설정하여 레지스트리 목록을 구성할 수 있습니다. 각 레지스트리에는 host 및 password 값이 필요하며 user를 설정하여 사용자 이름을 지정할 수 있습니다. 기본적으로 지정된 인증 정보는 지정된 레지스트리에서 이미지 openshift3/ose-pod 를 검사하여 유효성을 검사합니다.

대체 이미지를 지정하려면 다음 중 하나를 수행합니다.

  • test_image 를 설정합니다.
  • test_login 을 False로 설정하여 자격 증명 유효성 검사를 비활성화합니다.

레지스트리가 안전하지 않은 경우 tls_verify 를 False로 설정합니다.

이 목록의 모든 자격 증명에는 OpenShift 네임스페이스에서 생성된 imagestreamsecret 과 모든 노드에 배포된 자격 증명이 있습니다.

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

openshift_additional_registry_credentials=[{'host':'registry.example.com','user':'name','password':'pass1','test_login':'False'},{'host':'registry2.example.com','password':'token12345','tls_verify':'False','test_image':'mongodb/mongodb'}]

6.1.4. Red Hat 레지스트리의 서비스 계정 사용

서비스 계정을 생성하고 Red Hat 레지스트리에 대해 생성된 토큰을 생성한 후에는 추가 작업을 수행할 수 있습니다.

참고

이 섹션에서는 설치 및 업그레이드를 위한 레지스트리 자격 증명 관리 섹션에 설명된 인벤토리 변수를 제공하여 설치 중에 자동으로 수행할 수 있는 수동 단계를 제공합니다.

사전 요구 사항

  • 사용자 인증 정보
  • 서비스 계정
  • 서비스 계정 토큰

절차

레지스트리 서비스 계정 페이지에서 계정 이름을 클릭합니다. 여기에서 다음 작업을 수행할 수 있습니다.

  • 토큰 정보 탭에서 사용자 이름( 임의 문자열이 앞에 추가한 이름) 및 암호(토큰)를 볼 수 있습니다. 이 탭에서 토큰을 다시 생성할 수 있습니다.
  • OpenShift Secret 탭에서 다음을 수행할 수 있습니다.

    1. 탭에서 링크를 클릭하여 시크릿을 다운로드합니다.
    2. 클러스터에 보안을 제출합니다.

      # oc create -f <account-name>-secret.yml --namespace=openshift
    3. 다음과 같이 imagePullSecrets 필드를 사용하여 Kubernetes Pod 구성에 보안에 대한 참조를 추가하여 Kubernetes 구성을 업데이트합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: somepod
        namespace: all
        spec:
          containers:
            - name: web
            image: registry.redhat.io/REPONAME
      
          imagePullSecrets:
            - name: <numerical-string-account-name>-pull-secret
  • Docker 로그인 탭에서 docker login 을 실행할 수 있습니다. 예를 들면 다음과 같습니다.

    # docker login -u='<numerical-string|account-name>'
      -p=<token>

    성공적으로 로그인한 후 ~/.docker/config.json/var/lib/origin/.docker/config.json 에 복사하고 노드를 다시 시작합니다.

    # cp -r ~/.docker /var/lib/origin/
      systemctl restart atomic-openshift-node
  • Docker 구성 탭에서 다음을 수행할 수 있습니다.

    1. 탭에서 링크를 클릭하여 자격 증명 구성을 다운로드합니다.
    2. Docker 구성 디렉터리에 파일을 배치하여 디스크에 구성을 작성합니다. 이렇게 하면 기존 자격 증명을 덮어씁니다. 예를 들면 다음과 같습니다.

      # mv <account-name>-auth.json ~/.docker/config.json

7장. 마스터 및 노드 구성

7.1. 설치 후 마스터 및 노드 구성 사용자 정의

openshift start 명령(마스터 서버용) 및 hyperkube 명령(노드 서버용)은 개발 또는 실험 환경에서 서버를 시작하기에 충분한 제한된 인수 세트를 사용합니다. 그러나 이러한 인수는 프로덕션 환경에 필요한 전체 구성 및 보안 옵션 세트를 설명하고 제어하는 데 충분하지 않습니다.

마스터 구성 파일, /etc/origin/master/master-config.yaml노드 구성 맵에 이러한 옵션을 제공해야 합니다. 이러한 파일은 기본 플러그인 덮어쓰기, etcd에 연결, 서비스 계정 자동 생성, 이미지 이름 구축, 프로젝트 요청 사용자 지정, 볼륨 플러그인 구성 등의 옵션을 정의합니다.

이 주제에서는 OpenShift Container Platform 마스터 및 노드 호스트를 사용자 지정하는 데 사용할 수 있는 옵션에 대해 설명하고 설치 후 구성을 변경하는 방법을 보여줍니다.

이러한 파일은 기본값 없이 완전히 지정됩니다. 따라서 빈 값은 해당 매개 변수에 빈 값으로 시작하려고 함을 나타냅니다. 이렇게 하면 구성이 정확히 무엇인지 쉽게 이유할 수 있지만 지정할 모든 옵션을 기억하기가 어렵습니다. 이를 용이하게 하기 위해 --write-config 옵션으로 구성 파일을 만든 다음 --config 옵션과 함께 사용할 수 있습니다 .

7.2. 설치 종속성

프로덕션 환경은 표준 클러스터 설치 프로세스를 사용하여 설치해야 합니다. 프로덕션 환경에서는 HA(고가용성 )의 목적으로 여러 마스터를 사용하는 것이 좋습니다. 마스터 3개로 구성된 클러스터 아키텍처를 사용하는 것이 권장되며, HAproxy 가 권장되는 솔루션입니다.

경고

마스터 호스트에 etcd가 설치된 경우 etcd가 권한이 있는 마스터를 결정할 수 없기 때문에 3개 이상의 마스터를 사용하도록 클러스터를 구성해야 합니다. 마스터 두 개만 성공적으로 실행하는 유일한 방법은 마스터 이외의 호스트에 etcd를 설치하는 것입니다.

7.3. 마스터 및 노드 구성

마스터 및 노드 구성 파일을 구성하는 데 사용하는 방법은 OpenShift Container Platform 클러스터를 설치하는 데 사용된 방법과 일치해야 합니다. 표준 클러스터 설치 프로세스를 수행한 경우 Ansible 인벤토리 파일에서 구성을 변경합니다.

7.4. Ansible을 사용하여 구성 변경

이 섹션에서는 Ansible에 대해 익숙한 것으로 가정합니다.

사용 가능한 호스트 구성 옵션의 일부만 Ansible에 노출됩니다. OpenShift Container Platform을 설치한 후 Ansible은 대체된 일부 값을 사용하여 인벤토리 파일을 생성합니다. 이 인벤토리 파일을 수정하고 Ansible 설치 프로그램 플레이북을 다시 실행하는 방법은 OpenShift Container Platform 클러스터를 사용자 지정하는 방법입니다.

OpenShift Container Platform은 Ansible 플레이북 및 인벤토리 파일을 사용하여 클러스터 설치를 위해 Ansible 사용을 지원하지만 Puppet,Chef 또는 Salt 등의 다른 관리 툴도 사용할 수 있습니다.

사용 사례: HTPasswd 인증을 사용하도록 클러스터 구성

참고
  • 이 사용 사례에서는 플레이북에서 참조하는 모든 노드에 SSH 키를 이미 설정했다고 가정합니다.
  • htpasswd 유틸리티는 httpd-tools 패키지에 있습니다.

    # yum install httpd-tools

Ansible 인벤토리를 수정하고 구성을 변경하려면 다음을 수행합니다.

  1. ./hosts 인벤토리 파일을 엽니다.
  2. 파일의 [OSEv3:vars] 섹션에 다음 새 변수를 추가합니다.

    # htpasswd auth
    openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider'}]
    # Defining htpasswd users
    #openshift_master_htpasswd_users={'<name>': '<hashed-password>', '<name>': '<hashed-password>'}
    # or
    #openshift_master_htpasswd_file=/etc/origin/master/htpasswd

    HTPasswd 인증의 경우 openshift_master_identity_providers 변수는 인증 유형을 활성화합니다. HTPasswd를 사용하는 세 가지 인증 옵션을 구성할 수 있습니다.

    • /etc/origin/ master/htpasswd가 이미 구성되어 있으며 호스트에 있는 경우 openshift_master _identity_providers 만 지정합니다.
    • 로컬 htpasswd 파일을 호스트에 복사하려면 openshift_master_identity _providers 및 openshift_master_htpasswd_file 을 둘 다 지정합니다.
    • openshift_master_identity_providersopenshift_master_htpasswd_users 를 둘 다 지정하여 호스트에서 새 htpasswd 파일을 생성합니다.

    OpenShift Container Platform에는 HTPasswd 인증을 구성하는 데 해시된 암호가 필요하므로 다음 섹션에 표시된 대로 htpasswd 명령을 사용하여 사용자의 해시된 암호를 생성하거나 사용자와 연결된 해시된 암호를 사용하여 플랫 파일을 생성할 수 있습니다.

    다음 예제에서는 인증 방법을 기본에서 모든 설정을 거부하고, 지정된 파일을 사용하여 jsmithbloblaw 사용자에 대한 사용자 ID 및 암호를 생성합니다.

    # htpasswd auth
    openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider'}]
    # Defining htpasswd users
    openshift_master_htpasswd_users={'jsmith': '$apr1$wIwXkFLI$bAygtKGmPOqaJftB', 'bloblaw': '7IRJ$2ODmeLoxf4I6sUEKfiA$2aDJqLJe'}
    # or
    #openshift_master_htpasswd_file=/etc/origin/master/htpasswd
  3. 이러한 수정 사항을 적용하기 위해 ansible 플레이북을 다시 실행합니다.

    $ ansible-playbook -b -i ./hosts ~/src/openshift-ansible/playbooks/deploy_cluster.yml

    플레이북은 구성을 업데이트하고 OpenShift Container Platform 마스터 서비스를 다시 시작하여 변경 사항을 적용합니다.

이제 Ansible을 사용하여 마스터 및 노드 구성 파일을 수정했지만 간단한 사용 사례일 뿐입니다. 여기에서 Ansible에 노출되는 마스터 및 노드 구성 옵션을 확인하고 고유한 Ansible 인벤토리를 사용자 지정할 수 있습니다.

7.4.1. htpasswd 명령 사용

HTPasswd 인증을 사용하도록 OpenShift Container Platform 클러스터를 구성하려면 인벤토리 파일에 포함하려면 해시된 암호가 있는 사용자가 하나 이상 필요합니다.

다음을 수행할 수 있습니다.

사용자 및 해시된 암호를 생성하려면 다음을 수행합니다.

  1. 다음 명령을 실행하여 지정된 사용자를 추가합니다.

    $ htpasswd -n <user_name>
    참고

    명령줄에 암호를 제공하기 위해 -b 옵션을 포함할 수 있습니다.

    $ htpasswd -nb <user_name> <password>
  2. 사용자에 대해 일반 텍스트 암호를 입력하고 확인합니다.

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

    $ htpasswd -n myuser
    New password:
    Re-type new password:
    myuser:$apr1$vdW.cI3j$WSKIOzUPs6Q

    이 명령에서는 해시된 버전의 암호를 생성합니다.

그런 다음 HTPasswd 인증을 구성할 때 해시된 암호를 사용할 수 있습니다. 해시된 암호는 : 뒤에 있는 문자열입니다. 위의 예에서 다음을 입력합니다.

openshift_master_htpasswd_users={'myuser': '$apr1$wIwXkFLI$bAygtISk2eKGmqaJftB'}

사용자 이름과 해시된 암호로 플랫 파일을 생성하려면 다음을 수행합니다.

  1. 다음 명령을 실행합니다.

    $ htpasswd -c /etc/origin/master/htpasswd <user_name>
    참고

    명령줄에 암호를 제공하기 위해 -b 옵션을 포함할 수 있습니다.

    $ htpasswd -c -b <user_name> <password>
  2. 사용자에 대해 일반 텍스트 암호를 입력하고 확인합니다.

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

    htpasswd -c /etc/origin/master/htpasswd user1
    New password:
    Re-type new password:
    Adding password for user user1

    명령은 사용자 이름과 해시된 사용자 암호의 버전을 포함하는 파일을 생성합니다.

그런 다음 HTPasswd 인증을 구성할 때 암호 파일을 사용할 수 있습니다.

참고

htpasswd 명령에 대한 자세한 내용은 HTPasswd Identity Provider 를 참조하십시오.

7.5. 수동 구성 변경

사용 사례: HTPasswd 인증을 사용하도록 클러스터 구성

구성 파일을 수동으로 수정하려면 다음을 수행합니다.

  1. 수정할 구성 파일을 엽니다. 이 경우에는 /etc/origin/master/master-config.yaml 파일입니다.
  2. 파일의 identityProviders 스탠자에 다음 새 변수를 추가합니다.

    oauthConfig:
      ...
      identityProviders:
      - name: my_htpasswd_provider
        challenge: true
        login: true
        mappingMethod: claim
        provider:
          apiVersion: v1
          kind: HTPasswdPasswordIdentityProvider
          file: /etc/origin/master/htpasswd
  3. 변경 사항을 저장하고 파일을 종료합니다.
  4. 변경 사항을 적용하려면 마스터를 다시 시작하십시오.

    # master-restart api
    # master-restart controllers

이제 마스터와 노드 구성 파일을 수동으로 수정했지만 간단한 사용 사례일 뿐입니다. 여기에서 모든 마스터노드 구성 옵션을 확인하고 추가 수정을 수행하여 자체 클러스터를 추가로 사용자 지정할 수 있습니다.

참고

클러스터에서 노드를 수정하려면 필요에 따라 노드 구성 맵을 업데이트합니다. node-config.yaml 파일을 수동으로 편집하지 마십시오.

7.6. 마스터 구성 파일

이 섹션에서는 master-config.yaml 파일에 언급된 매개변수를 검토합니다.

새 마스터 구성 파일을 생성하여 설치된 OpenShift Container Platform 버전에 유효한 옵션을 확인할 수 있습니다.

중요

master-config.yaml 파일을 수정할 때마다 변경 사항을 적용하려면 마스터를 다시 시작해야 합니다. OpenShift Container Platform 서비스 재시작을 참조하십시오.

7.6.1. 승인 제어 구성

표 7.1. 승인 제어 구성 매개변수
매개변수 이름설명

AdmissionConfig

승인 제어 플러그인 구성이 포함되어 있습니다. OpenShift Container Platform에는 API 오브젝트를 생성하거나 수정할 때마다 트리거되는 승인 컨트롤러 플러그인의 구성 가능한 목록이 있습니다. 이 옵션을 사용하면 기본 플러그인 목록을 재정의할 수 있습니다(예: 일부 플러그인 비활성화, 다른 플러그인 추가, 순서 변경, 구성 지정). 플러그인 목록과 해당 구성은 모두 Ansible에서 제어할 수 있습니다.

APIServerArguments

API 서버의 명령줄 인수와 일치하는 Kube API 서버로 직접 전달될 키-값 쌍입니다. 이러한 값은 마이그레이션되지 않지만 존재하지 않는 값을 참조하면 서버가 시작되지 않습니다. 이러한 값은 KubernetesMasterConfig 의 다른 설정을 재정의할 수 있으므로 잘못된 구성이 발생할 수 있습니다. 이벤트를 etcd에 저장하려면 event-ttl 값과 함께 APIServerArguments 를 사용합니다. 기본값은 2h 이지만 메모리 증가를 방지하기 위해 less로 설정할 수 있습니다.

apiServerArguments:
  event-ttl:
  - "15m"

ControllerArguments

컨트롤러 관리자의 명령줄 인수와 일치하는 Kube 컨트롤러 관리자에 직접 전달될 키-값 쌍입니다. 이러한 값은 마이그레이션되지 않지만 존재하지 않는 값을 참조하면 서버가 시작되지 않습니다. 이러한 값은 KubernetesMasterConfig 의 다른 설정을 재정의할 수 있으므로 잘못된 구성이 발생할 수 있습니다.

DefaultAdmissionConfig

다양한 승인 플러그인을 활성화하거나 비활성화하는 데 사용됩니다. 이 유형이 pluginConfig 아래에 구성 오브젝트로 표시되면 승인 플러그인에서 지원하는 경우 기본적으로 승인 플러그인이 활성화됩니다.

PluginConfig

승인 제어 플러그인별로 구성 파일을 지정할 수 있습니다.

PluginOrderOverride

마스터에 설치할 승인 제어 플러그인 이름 목록입니다. 순서가 매우 중요합니다. 비어 있는 경우 기본 플러그인 목록이 사용됩니다.

SchedulerArguments

스케줄러의 명령줄 인수와 일치하는 Kube 스케줄러로 직접 전달할 키-값 쌍입니다. 이러한 값은 마이그레이션되지 않지만 존재하지 않는 값을 참조하면 서버가 시작되지 않습니다. 이러한 값은 KubernetesMasterConfig 의 다른 설정을 재정의할 수 있으므로 잘못된 구성이 발생할 수 있습니다.

7.6.2. 자산 구성

표 7.2. 자산 구성 매개변수
매개변수 이름설명

AssetConfig

해당하는 경우 자산 서버는 정의된 매개 변수를 기반으로 시작됩니다. 예를 들면 다음과 같습니다.

assetConfig:
  logoutURL: ""
  masterPublicURL: https://master.ose32.example.com:8443
  publicURL: https://master.ose32.example.com:8443/console/
  servingInfo:
    bindAddress: 0.0.0.0:8443
    bindNetwork: tcp4
    certFile: master.server.crt
    clientCA: ""
    keyFile: master.server.key
    maxRequestsInFlight: 0
    requestTimeoutSeconds: 0

corsAllowedOrigins

다른 호스트 이름을 사용하여 웹 애플리케이션에서 API 서버에 액세스하려면 구성 필드에 corsAllowedOrigins 를 지정하거나 openshift 시작--cors-allowed-origins 옵션을 지정하여 해당 호스트 이름을 허용해야 합니다. 해당 값에 고정 또는 이스케이핑이 수행되지 않습니다. 사용 예시는 웹 콘솔을 참조하십시오.

DisabledFeatures

시작할 수 없는 기능 목록입니다. 이 값을 null 로 설정할 수 있습니다. 누구나 기능을 수동으로 비활성화하고 권장되지 않는 경우가 많습니다.

확장

하위 컨텍스트 아래에 있는 자산 서버 파일 시스템에서 제공할 파일입니다.

ExtensionDevelopment

true 로 설정하면 자산 서버에 시작 시가 아닌 모든 요청에 대해 확장 스크립트 및 스타일시트를 다시 로드하도록 지시합니다. 서버를 변경할 때마다 서버를 다시 시작하지 않고도 확장 프로그램을 개발할 수 있습니다.

ExtensionProperties

글로벌 변수 OPENSHIFT_EXTENSION_PROPERTIES 아래에 콘솔에 삽입되는 키(문자열) 및 값-(문자열) 쌍입니다.

ExtensionScripts

웹 콘솔이 로드될 때 스크립트로 로드할 자산 서버 파일의 파일 경로입니다.

ExtensionStylesheets

웹 콘솔이 로드될 때 스타일 시트로 로드할 자산 서버 파일의 파일 경로입니다.

LoggingPublicURL

로깅을 위한 공용 엔드포인트(선택 사항).

LogoutURL

웹 콘솔에서 로그아웃한 후 웹 브라우저를 로 리디렉션하는 절대 URL(선택 사항)입니다. 지정하지 않으면 기본 제공 로그아웃 페이지가 표시됩니다.

MasterPublicURL

웹 콘솔에서 OpenShift Container Platform 서버에 액세스하는 방법.

MetricsPublicURL

지표의 공용 엔드포인트(선택 사항).

PublicURL

자산 서버의 URL입니다.

7.6.3. 인증 및 권한 부여 구성

표 7.3. 인증 및 권한 부여 매개 변수
매개변수 이름설명

authConfig

인증 및 권한 부여 구성 옵션이 있습니다.

AuthenticationCacheSize

는 캐시해야 하는 인증 결과 수를 나타냅니다. 0인 경우 기본 캐시 크기가 사용됩니다.

AuthorizationCacheTTL

권한 부여 결과를 캐시해야 하는 기간을 나타냅니다. 유효한 기간 문자열(예:)이 사용됩니다. "5m"). 비어 있는 경우 기본 시간 초과가 발생합니다. 0인 경우(예:). "0m"), 캐싱이 비활성화됩니다.

7.6.4. 컨트롤러 구성

표 7.4. 컨트롤러 구성 매개변수
매개변수 이름설명

컨트롤러

시작해야 하는 컨트롤러 목록입니다. none 으로 설정하면 자동으로 시작되지 않습니다. 기본값은 *이며 모든 컨트롤러를 시작합니다. *를 사용할 때는 이름 앞에 - 앞에 를 추가하여 컨트롤러를 제외할 수 있습니다. 현재 다른 값은 인식되지 않습니다.

ControllerLeaseTTL

컨트롤러 선택을 활성화하여 마스터에 컨트롤러가 시작되기 전에 리스를 획득하고 이 값으로 정의된 몇 초 내에 갱신하도록 지시합니다. 이 값을 부정적으로 설정하면 pauseControllers=true 가 강제 적용됩니다. 이 값은 기본값이 꺼져(0 또는 생략됨) 컨트롤러 선택을 -1로 비활성화할 수 있습니다.

PauseControllers

마스터에 컨트롤러를 자동으로 시작하지 않도록 지시하지만, 대신 서버에 대한 알림이 수신될 때까지 기다린 후 이를 시작하도록 지시합니다.

7.6.5. etcd 구성

표 7.5. etcd 구성 매개변수
매개변수 이름설명

주소

etcd에 대한 클라이언트 연결에 대해 공개된 host:port입니다.

etcdClientInfo

etcd에 연결하는 방법에 대한 정보가 포함되어 있습니다. etcd가 임베디드 또는 임베드되지 않은 것으로 실행되는지 여부 및 호스트를 지정합니다. 나머지 구성은 Ansible 인벤토리에서 처리합니다. 예를 들면 다음과 같습니다.

etcdClientInfo:
  ca: ca.crt
  certFile: master.etcd-client.crt
  keyFile: master.etcd-client.key
  urls:
  - https://m1.aos.example.com:4001

etcdConfig

해당하는 경우 정의된 매개변수를 기반으로 etcd가 시작됩니다. 예를 들면 다음과 같습니다.

etcdConfig:
  address: master.ose32.example.com:4001
  peerAddress: master.ose32.example.com:7001
  peerServingInfo:
    bindAddress: 0.0.0.0:7001
    certFile: etcd.server.crt
    clientCA: ca.crt
    keyFile: etcd.server.key
  servingInfo:
    bindAddress: 0.0.0.0:4001
    certFile: etcd.server.crt
    clientCA: ca.crt
    keyFile: etcd.server.key
  storageDirectory: /var/lib/origin/openshift.local.etcd

etcdStorageConfig

API 리소스가 etcd에 저장되는 방법에 대한 정보가 포함되어 있습니다. 이러한 값은 etcd가 클러스터의 백업 저장소인 경우에만 관련이 있습니다.

KubernetesStoragePrefix

Kubernetes 리소스가 루트로 제공될 etcd 내 경로입니다. 이 값은 변경되는 경우 etcd 의 기존 개체가 더 이상 존재하지 않음을 의미합니다. 기본값은 kubernetes.io 입니다.

KubernetesStorageVersion

etcd 의 Kubernetes 리소스를 직렬화해야 하는 API 버전입니다. 이 값은 etcd에서 읽은 모든 클라이언트에 새 버전을 읽을 수 있는 코드가 있어야 합니다.

OpenShiftStoragePrefix

OpenShift Container Platform 리소스가 루트로 제공될 etcd 내 경로입니다. 이 값은 변경되는 경우 etcd의 기존 개체가 더 이상 존재하지 않음을 의미합니다. 기본값은 openshift.io 입니다.

OpenShiftStorageVersion

etcd 의 OS 리소스를 직렬화해야 하는 API 버전입니다. 이 값은 etcd 에서 읽은 모든 클라이언트에 새 버전을 읽을 수 있는 코드가 있어야 합니다.

PeerAddress

etcd 에 대한 피어 연결의 공개된 host:port입니다.

PeerServingInfo

etcd 피어 서비스를 시작하는 방법을 설명합니다.

ServingInfo

서비스 제공을 시작하는 방법을 설명합니다. 예를 들면 다음과 같습니다.

servingInfo:
  bindAddress: 0.0.0.0:8443
  bindNetwork: tcp4
  certFile: master.server.crt
  clientCA: ca.crt
  keyFile: master.server.key
  maxRequestsInFlight: 500
  requestTimeoutSeconds: 3600

StorageDir

etcd 스토리지 디렉터리의 경로입니다.

7.6.6. 설정 부여

표 7.6. 구성 매개변수 부여
매개변수 이름설명

GrantConfig