28.4. Ingress 컨트롤러 끝점 게시 전략 구성


endpointPublishingStrategy 는 Ingress 컨트롤러 끝점을 다른 네트워크에 게시하고 로드 밸런서 통합을 활성화하며 다른 시스템에 대한 액세스를 제공하는 데 사용됩니다.

중요

RHOSP(Red Hat OpenStack Platform)에서 LoadBalancerService 끝점 게시 전략은 클라우드 공급자가 상태 모니터를 생성하도록 구성된 경우에만 지원됩니다. RHOSP 16.2의 경우 이 전략은 Amphora Octavia 공급자를 사용하는 경우에만 가능합니다.

자세한 내용은 RHOSP 설치 설명서의 "RHOSP Cloud Controller Manager 옵션 설정" 섹션을 참조하십시오.

28.4.1. Ingress 컨트롤러 끝점 게시 전략

NodePortService 끝점 게시 전략

NodePortService 끝점 게시 전략에서는 Kubernetes NodePort 서비스를 사용하여 Ingress 컨트롤러를 게시합니다.

이 구성에서는 Ingress 컨트롤러를 배포하기 위해 컨테이너 네트워킹을 사용합니다. 배포를 게시하기 위해 NodePortService가 생성됩니다. 특정 노드 포트는 OpenShift Container Platform에 의해 동적으로 할당됩니다. 그러나 정적 포트 할당을 지원하기 위해 관리형 NodePortService의 노드 포트 필드에 대한 변경 사항은 유지됩니다.

그림 28.3. NodePortService 다이어그램

OpenShift Container Platform Ingress NodePort 끝점 게시 전략

위의 그래픽에서는 OpenShift Container Platform Ingress NodePort 끝점 게시 전략과 관련된 다음 개념을 보여줍니다.

  • 클러스터에서 사용 가능한 모든 노드에는 외부 액세스가 가능한 자체 IP 주소가 있습니다. 클러스터에서 실행 중인 서비스는 모든 노드의 고유한 NodePort에 바인딩됩니다.
  • 클라이언트가 다운된 노드에 연결하는 경우(예: 10.0.128.4 IP 주소를 hammer)에 연결하면 노드 포트는 서비스를 실행하는 사용 가능한 노드에 클라이언트를 직접 연결합니다. 이 시나리오에서는 로드 밸런싱이 필요하지 않습니다. 이미지에서 볼 수 있듯이 10.0.128.4 주소가 다운되어 다른 IP 주소를 대신 사용해야 합니다.
참고

Ingress Operator는 서비스의 .spec.ports[].nodePort 필드에 대한 업데이트를 무시합니다.

기본적으로 포트는 자동으로 할당되며 통합을 위해 포트 할당에 액세스할 수 있습니다. 그러나 동적 포트에 대한 응답으로 쉽게 재구성할 수 없는 기존 인프라와 통합하기 위해 정적 포트 할당이 필요한 경우가 있습니다. 정적 노드 포트와 통합하기 위해 관리 서비스 리소스를 직접 업데이트할 수 있습니다.

자세한 내용은 NodePort에 대한 Kubernetes 서비스 설명서를 참조하십시오.

HostNetwork 끝점 게시 전략

HostNetwork 끝점 게시 전략에서는 Ingress 컨트롤러가 배포된 노드 포트에 Ingress 컨트롤러를 게시합니다.

HostNetwork 끝점 게시 전략이 있는 Ingress 컨트롤러는 노드당 하나의 Pod 복제본만 가질 수 있습니다. n개의 복제본이 필요한 경우에는 해당 복제본을 예약할 수 있는 n개 이상의 노드를 사용해야 합니다. 각 pod 복제본은 예약된 노드 호스트에서 포트 80443을 요청하므로 동일한 노드의 다른 pod가 해당 포트를 사용하는 경우 복제본을 노드에 예약할 수 없습니다.

HostNetwork 오브젝트에는 httpPort: 80,httpsPort: 443, statsPort: 1936 이라는 선택적 바인딩 포트에 대해 다음과 같은 기본값이 있는 hostNetwork 필드가 있습니다. 네트워크에 다른 바인딩 포트를 지정하면 HostNetwork 전략에 대해 동일한 노드에 여러 Ingress 컨트롤러를 배포할 수 있습니다.

예제

apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
  name: internal
  namespace: openshift-ingress-operator
spec:
  domain: example.com
  endpointPublishingStrategy:
    type: HostNetwork
    hostNetwork:
      httpPort: 80
      httpsPort: 443
      statsPort: 1936

28.4.1.1. Ingress 컨트롤러 끝점 게시 범위를 Internal로 구성

클러스터 관리자가 클러스터가 비공개임을 지정하지 않고 새 클러스터를 설치하면 기본 Ingress 컨트롤러가 외부로 설정된 범위를 사용하여 생성됩니다. 클러스터 관리자는 외부 범위가 지정된 Ingress 컨트롤러를 Internal 로 변경할 수 있습니다.

사전 요구 사항

  • oc CLI를 설치했습니다.

프로세스

  • 외부 범위가 지정된 Ingress 컨트롤러를 Internal 로 변경하려면 다음 명령을 입력합니다.

    $ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
  • Ingress 컨트롤러의 상태를 확인하려면 다음 명령을 입력합니다.

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    • 진행 상태 조건은 추가 조치를 취해야 하는지 여부를 나타냅니다. 예를 들어 상태 조건은 다음 명령을 입력하여 서비스를 삭제해야 함을 나타낼 수 있습니다.

      $ oc -n openshift-ingress delete services/router-default

      서비스를 삭제하면 Ingress Operator가 서비스를 Internal 로 다시 생성합니다.

28.4.1.2. Ingress 컨트롤러 끝점 게시 범위를 외부로 구성

클러스터 관리자가 클러스터가 비공개임을 지정하지 않고 새 클러스터를 설치하면 기본 Ingress 컨트롤러가 외부로 설정된 범위를 사용하여 생성됩니다.

Ingress 컨트롤러의 범위는 설치 중 내부로 구성할 수 있으며 클러스터 관리자는 내부 Ingress 컨트롤러를 외부로 변경할 수 있습니다.

중요

일부 플랫폼에서는 서비스를 삭제하고 다시 생성해야 합니다.

범위를 변경하면 몇 분 동안 잠재적으로 Ingress 트래픽이 중단될 수 있습니다. 이는 서비스를 삭제하고 재생성해야 하는 플랫폼에 적용됩니다. 이 절차를 수행하면 OpenShift Container Platform에서 기존 서비스 로드 밸런서를 프로비저닝 해제하고 새 서비스 로드 밸런서를 프로비저닝하고 DNS를 업데이트할 수 있습니다.

사전 요구 사항

  • oc CLI를 설치했습니다.

프로세스

  • 내부 범위가 지정된 Ingress 컨트롤러를 외부로 변경하려면 다음 명령을 입력합니다.

    $ oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
  • Ingress 컨트롤러의 상태를 확인하려면 다음 명령을 입력합니다.

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    • 진행 상태 조건은 추가 조치를 취해야 하는지 여부를 나타냅니다. 예를 들어 상태 조건은 다음 명령을 입력하여 서비스를 삭제해야 함을 나타낼 수 있습니다.

      $ oc -n openshift-ingress delete services/router-default

      서비스를 삭제하면 Ingress Operator가 서비스를 외부로 다시 생성합니다.

28.4.1.3. Ingress 컨트롤러에 단일 NodePort 서비스 추가

각 프로젝트에 NodePort-type Service 를 생성하는 대신 사용자 정의 Ingress 컨트롤러를 생성하여 NodePortService 끝점 게시 전략을 사용할 수 있습니다. 포트 충돌을 방지하려면 Ingress 샤딩을 통해 HostNetwork Ingress 컨트롤러가 있을 수 있는 노드에 경로 세트를 적용하려면 Ingress 컨트롤러에 대해 이 구성을 고려하십시오.

각 프로젝트에 NodePort-type 서비스를 설정하기 전에 다음 고려 사항을 읽으십시오.

  • Nodeport Ingress 컨트롤러 도메인에 대한 와일드카드 DNS 레코드를 생성해야 합니다. Nodeport Ingress 컨트롤러 경로는 작업자 노드의 주소에서 연결할 수 있습니다. 경로에 필요한 DNS 레코드에 대한 자세한 내용은 "사용자 프로비저닝 DNS 요구 사항"을 참조하십시오.
  • 서비스의 경로를 노출하고 사용자 정의 Ingress 컨트롤러 도메인의 --hostname 인수를 지정해야 합니다.
  • 애플리케이션 Pod에 액세스할 수 있도록 경로의 NodePort-type 서비스에 할당된 포트를 추가해야 합니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.
  • 와일드카드 DNS 레코드를 생성했습니다.

프로세스

  1. Ingress 컨트롤러에 대한 CR(사용자 정의 리소스) 파일을 생성합니다.

    IngressController 오브젝트에 대한 정보를 정의하는 CR 파일의 예

    apiVersion: v1
    items:
    - apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: <custom_ic_name> 1
        namespace: openshift-ingress-operator
      spec:
        replicas: 1
        domain: <custom_ic_domain_name> 2
        nodePlacement:
          nodeSelector:
            matchLabels:
              <key>: <value> 3
        namespaceSelector:
         matchLabels:
           <key>: <value> 4
        endpointPublishingStrategy:
          type: NodePortService
    # ...

    1
    IngressController CR의 사용자 정의 이름을 지정합니다.
    2
    Ingress 컨트롤러 서비스의 DNS 이름입니다. 예를 들어 기본 ingresscontroller 도메인은 apps.ipi-cluster.example.com 이므로 < custom_ic_domain_name >을 nodeportsvc.ipi-cluster.example.com 으로 지정합니다.
    3
    사용자 정의 Ingress 컨트롤러를 포함하는 노드의 라벨을 지정합니다.
    4
    네임스페이스 집합의 라벨을 지정합니다. < key>:<value >를 <key>가 새 레이블의 고유 이름이며 < value >가 값인 -값 쌍의 맵으로 바꿉니다. 예: ingresscontroller: custom-ic.
  2. oc label node 명령을 사용하여 노드에 라벨을 추가합니다.

    $ oc label node <node_name> <key>=<value> 1
    1
    여기서 <value >는 IngressController CR의 nodePlacement 섹션에 지정된 키-값 쌍과 일치해야 합니다.
  3. IngressController 오브젝트를 생성합니다.

    $ oc create -f <ingress_controller_cr>.yaml
  4. IngressController CR에 대해 생성된 서비스의 포트를 찾습니다.

    $ oc get svc -n openshift-ingress

    router-nodeport-custom-ic3 서비스의 포트 80:32432/TCP 를 표시하는 출력 예

    NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                     AGE
    router-internal-default      ClusterIP   172.30.195.74    <none>        80/TCP,443/TCP,1936/TCP                     223d
    router-nodeport-custom-ic3   NodePort    172.30.109.219   <none>        80:32432/TCP,443:31366/TCP,1936:30499/TCP   155m

  5. 새 프로젝트를 생성하려면 다음 명령을 입력합니다.

    $ oc new-project <project_name>
  6. 새 네임스페이스에 레이블을 지정하려면 다음 명령을 입력합니다.

    $ oc label namespace <project_name> <key>=<value> 1
    1
    여기서 & lt;key>=& lt;value>는 Ingress 컨트롤러 CR의 namespaceSelector 섹션에 있는 값과 일치해야 합니다.
  7. 클러스터에 새 애플리케이션을 생성합니다.

    $ oc new-app --image=<image_name> 1
    1
    < image_name >의 예는 quay.io/openshifttest/hello-openshift:multiarch 입니다.
  8. Pod에서 서비스를 사용하여 클러스터 외부에 애플리케이션을 노출할 수 있도록 서비스의 Route 오브젝트를 생성합니다.

    $ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name> 1
    참고

    --hostname 인수에서 사용자 정의 Ingress 컨트롤러의 도메인 이름을 지정해야 합니다. 이 작업을 수행하지 않으면 Ingress Operator는 기본 Ingress 컨트롤러를 사용하여 클러스터의 모든 경로를 제공합니다.

  9. 경로에 Admitted 상태가 있고 사용자 정의 Ingress 컨트롤러에 대한 메타데이터가 포함되어 있는지 확인합니다.

    $ oc get route/hello-openshift -o json | jq '.status.ingress'

    출력 예

    # ...
    {
      "conditions": [
        {
          "lastTransitionTime": "2024-05-17T18:25:41Z",
          "status": "True",
          "type": "Admitted"
        }
      ],
      [
        {
          "host": "hello-openshift.nodeportsvc.ipi-cluster.example.com",
          "routerCanonicalHostname": "router-nodeportsvc.nodeportsvc.ipi-cluster.example.com",
          "routerName": "nodeportsvc", "wildcardPolicy": "None"
        }
      ],
    }

  10. 기본 Ingress 컨트롤러에서 NodePort-type 서비스를 관리하지 못하도록 기본 IngressController CR을 업데이트합니다. 기본 Ingress 컨트롤러는 다른 모든 클러스터 트래픽을 계속 모니터링합니다.

    $ oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'

검증

  1. 다음 명령을 입력하여 DNS 항목이 클러스터 내부 및 외부에서 라우팅될 수 있는지 확인합니다. 이 명령은 절차의 앞부분에서 oc label node 명령을 실행하여 레이블을 수신한 노드의 IP 주소를 출력합니다.

    $ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
  2. 클러스터가 DNS 확인을 위해 외부 DNS 서버의 IP 주소를 사용하는지 확인하려면 다음 명령을 입력하여 클러스터 연결을 확인합니다.

    $ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port> 1
    1 1
    여기서 <port >는 NodePort-type 서비스 의 노드 포트입니다. oc get svc -n openshift-ingress 명령의 예제 출력에 따라 80:32432/TCP HTTP 경로는 32432 가 노드 포트임을 의미합니다.

    출력 예

    Hello OpenShift!

28.4.2. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.