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 끝점 게시 전략과 관련된 다음 개념을 보여줍니다.
- 클러스터에서 사용 가능한 모든 노드에는 외부 액세스가 가능한 자체 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 복제본은 예약된 노드 호스트에서 포트 80
및 443
을 요청하므로 동일한 노드의 다른 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 레코드를 생성했습니다.
프로세스
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
.
oc label node
명령을 사용하여 노드에 라벨을 추가합니다.$ oc label node <node_name> <key>=<value> 1
- 1
- 여기서
<value
>는IngressController
CR의nodePlacement
섹션에 지정된 키-값 쌍과 일치해야 합니다.
IngressController
오브젝트를 생성합니다.$ oc create -f <ingress_controller_cr>.yaml
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
새 프로젝트를 생성하려면 다음 명령을 입력합니다.
$ oc new-project <project_name>
새 네임스페이스에 레이블을 지정하려면 다음 명령을 입력합니다.
$ oc label namespace <project_name> <key>=<value> 1
- 1
- 여기서 &
lt;key>=&
lt;value>는 Ingress 컨트롤러 CR의namespaceSelector
섹션에 있는 값과 일치해야 합니다.
클러스터에 새 애플리케이션을 생성합니다.
$ oc new-app --image=<image_name> 1
- 1
- <
image_name
>의 예는quay.io/openshifttest/hello-openshift:multiarch
입니다.
Pod에서 서비스를 사용하여 클러스터 외부에 애플리케이션을 노출할 수 있도록 서비스의
Route
오브젝트를 생성합니다.$ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name> 1
참고--hostname
인수에서 사용자 정의 Ingress 컨트롤러의 도메인 이름을 지정해야 합니다. 이 작업을 수행하지 않으면 Ingress Operator는 기본 Ingress 컨트롤러를 사용하여 클러스터의 모든 경로를 제공합니다.경로에
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" } ], }
기본 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>]}]}}}'
검증
다음 명령을 입력하여 DNS 항목이 클러스터 내부 및 외부에서 라우팅될 수 있는지 확인합니다. 이 명령은 절차의 앞부분에서
oc label node
명령을 실행하여 레이블을 수신한 노드의 IP 주소를 출력합니다.$ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
클러스터가 DNS 확인을 위해 외부 DNS 서버의 IP 주소를 사용하는지 확인하려면 다음 명령을 입력하여 클러스터 연결을 확인합니다.
$ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port> 1
출력 예
Hello OpenShift!