2.13. OpenShift 컨테이너 플랫폼 네트워킹을 통한 게이트웨이 API
OpenShift Container Platform은 Ingress Operator와 함께 Gateway API를 사용하여 네트워크 트래픽을 구성하는 추가적인 방법을 제공합니다.
Gateway API는 사용자 정의 네트워크(UDN)를 지원하지 않습니다.
2.13.1. Gateway API 개요 링크 복사링크가 클립보드에 복사되었습니다!
Gateway API는 오픈 소스이고 커뮤니티에서 관리하는 Kubernetes 네트워킹 메커니즘입니다. 이는 클러스터의 전송 계층 L4와 애플리케이션 계층 L7 내에서의 라우팅에 초점을 맞춥니다. 다양한 공급업체가 Gateway API의 다양한 구현을 제공합니다.
이 프로젝트는 폭넓은 커뮤니티 지원을 바탕으로 이식 가능한 API를 사용하여 표준화된 생태계를 제공하기 위한 노력입니다. Gateway API 기능을 Ingress Operator에 통합함으로써 기존 커뮤니티와 업스트림 개발 노력에 부합하는 네트워킹 솔루션을 구축할 수 있습니다.
Gateway API는 Ingress Operator의 기능을 확장하여 더욱 세부적인 클러스터 트래픽과 라우팅 구성을 처리합니다. 이러한 기능을 사용하면 Gateway API 사용자 정의 리소스 정의(CRD) 인스턴스를 만들 수 있습니다. OpenShift Container Platform 클러스터의 경우 Ingress Operator는 다음 리소스를 생성합니다.
- 게이트웨이
- 이 리소스는 트래픽이 클러스터 내의 서비스로 어떻게 변환될 수 있는지 설명합니다. 예를 들어, 특정 로드 밸런서 구성.
- GatewayClass
-
이 리소스는 공통 구성과 동작을 공유하는
Gateway
객체 세트를 정의합니다. 예를 들어, 공개 또는 비공개 애플리케이션에 사용되는Gateway
리소스 세트를 구별하기 위해 두 개의 별도GatewayClass
객체를 생성할 수 있습니다. - HTTP 경로
- 이 리소스는 게이트웨이에서 서비스로 가는 HTTP 요청의 라우팅 동작을 지정하며, 특히 HTTP 또는 종료된 HTTPS 연결을 다중화하는 데 유용합니다.
- GRPCRoute
- 이 리소스는 gRPC 요청의 라우팅 동작을 지정합니다.
- ReferenceGrant
- 이 리소스는 네임스페이스 간 참조를 활성화합니다. 예를 들어, 다른 네임스페이스에 있는 백엔드로 트래픽을 전달하는 경로를 활성화합니다.
OpenShift Container Platform에서 Gateway API 구현은 gateway.networking.k8s.io/v1을
기반으로 하며, 이 버전의 모든 필드가 지원됩니다.
2.13.1.1. Gateway API의 이점 링크 복사링크가 클립보드에 복사되었습니다!
Gateway API는 다음과 같은 이점을 제공합니다.
-
이식성: OpenShift Container Platform은 Ingress 성능을 개선하기 위해 HAProxy를 사용하는 반면, Gateway API는 특정 동작을 제공하기 위해 공급업체별 주석에 의존하지 않습니다. HAProxy와 비슷한 성능을 얻으려면
Gateway
객체를 수평적으로 확장하거나 연관된 노드를 수직적으로 확장해야 합니다. -
관심사 분리: Gateway API는 리소스에 대한 역할 기반 접근 방식을 사용하며 대규모 조직이 책임과 팀을 구성하는 방식에 더 잘 맞습니다. 플랫폼 엔지니어는
GatewayClass
리소스에 집중할 수 있고, 클러스터 관리자는Gateway
리소스 구성에 집중할 수 있으며, 애플리케이션 개발자는HTTPRoute
리소스를 사용하여 서비스를 라우팅하는 데 집중할 수 있습니다. - 확장성: 추가 기능은 표준화된 CRD로 개발됩니다.
2.13.1.2. 게이트웨이 API의 한계 링크 복사링크가 클립보드에 복사되었습니다!
Gateway API에는 다음과 같은 제한 사항이 있습니다.
- 버전 비호환성: Gateway API 생태계는 빠르게 변화하며, 일부 구현은 다른 구현과 호환되지 않습니다. 이는 해당 기능 세트가 Gateway API의 서로 다른 버전을 기반으로 하기 때문입니다.
- 리소스 오버헤드: Gateway API는 더 유연하지만 여러 리소스 유형을 사용하여 결과를 얻습니다. 규모가 작은 애플리케이션의 경우 기존 Ingress의 단순성이 더 적합할 수 있습니다.
2.13.2. OpenShift 컨테이너 플랫폼을 위한 게이트웨이 API 구현 링크 복사링크가 클립보드에 복사되었습니다!
Ingress Operator는 다른 공급업체 구현이 OpenShift Container Platform 클러스터에 정의된 CRD를 활용할 수 있도록 Gateway API CRD의 수명 주기를 관리합니다.
어떤 상황에서는 Gateway API가 공급업체 구현에서 지원하지 않는 하나 이상의 필드를 제공하지만, 해당 구현은 스키마상 나머지 필드와 호환됩니다. 이러한 "데드 필드"로 인해 Ingress 워크로드가 중단되고, 애플리케이션과 서비스가 부적절하게 프로비저닝되고, 보안 관련 문제가 발생할 수 있습니다. OpenShift Container Platform은 특정 버전의 Gateway API CRD를 사용하므로 Gateway API의 타사 구현을 사용하려면 모든 필드가 예상대로 작동하도록 OpenShift Container Platform 구현을 준수해야 합니다.
OpenShift Container Platform 4.19 클러스터 내에서 생성된 모든 CRD는 Ingress Operator에 의해 호환 가능한 버전이 지정되고 유지 관리됩니다. CRD가 이미 존재하지만 이전에 Ingress Operator에서 관리하지 않은 경우, Ingress Operator는 이러한 구성이 OpenShift Container Platform에서 지원하는 Gateway API 버전과 호환되는지 확인하고 CRD 계승에 대한 승인을 요구하는 관리 게이트를 만듭니다.
Gateway API CRD가 포함된 이전 OpenShift Container Platform 버전에서 클러스터를 업데이트하는 경우 해당 리소스를 OpenShift Container Platform에서 지원하는 버전과 정확히 일치하도록 변경합니다. 그렇지 않으면 해당 CRD가 OpenShift Container Platform에서 관리되지 않고 Red Hat에서 지원하지 않는 기능을 포함할 수 있으므로 클러스터를 업데이트할 수 없습니다.
2.13.3. Ingress Operator를 위한 Gateway API 시작하기 링크 복사링크가 클립보드에 복사되었습니다!
첫 번째 단계에서 보여준 것처럼 GatewayClass를 생성하면 클러스터에서 사용할 Gateway API가 구성됩니다.
프로세스
GatewayClass
객체를 생성합니다.다음 정보를 포함하는 YAML 파일
openshift-default.yaml
을 만듭니다.예제
GatewayClass
CRCopy to Clipboard Copied! Toggle word wrap Toggle overflow 중요Ingress Operator가 관리할 수 있도록 컨트롤러 이름은 표시된 대로 정확히 지정되어야 합니다. 이 필드를 다른 값으로 설정하면 Ingress Operator는
GatewayClass
개체와 관련된 모든Gateway
,GRPCRoute
,HTTPRoute
개체를 무시합니다. 컨트롤러 이름은 OpenShift Container Platform의 Gateway API 구현과 연결되어 있으며, 허용되는 컨트롤러 이름은openshift.io/gateway-controller/v1
뿐입니다.다음 명령을 실행하여
GatewayClass
리소스를 만듭니다.oc create -f openshift-default.yaml
$ oc create -f openshift-default.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
gatewayclass.gateway.networking.k8s.io/openshift-default created
gatewayclass.gateway.networking.k8s.io/openshift-default created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow GatewayClass
리소스를 생성하는 동안 Ingress Operator는 Red Hat OpenShift Service Mesh의 경량 버전, Istio 사용자 정의 리소스 및openshift-ingress
네임스페이스에 새 배포를 설치합니다.선택 사항: 새로운 배포인
istiod-openshift-gateway가
준비되고 사용 가능한지 확인하세요.oc get deployment -n openshift-ingress
$ oc get deployment -n openshift-ingress
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
다음 명령을 실행하여 비밀을 생성합니다.
oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
$ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Ingress Operator의 도메인을 가져옵니다.
DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
$ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gateway
객체를 생성합니다.다음 정보를 포함하는 YAML 파일
example-gateway.yaml
을 만듭니다.게이트웨이
CR 예시Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
Gateway
객체는openshift-ingress
네임스페이스에 생성되어야 합니다.- 2
Gateway
객체는 이전에 생성된GatewayClass
객체의 이름을 참조해야 합니다.- 3
- HTTPS 리스너는 클러스터 도메인의 하위 도메인과 일치하는 HTTPS 요청을 수신합니다. 이 리스너를 사용하면 Gateway API
HTTPRoute
리소스를 사용하여 애플리케이션에 대한 수신을 구성할 수 있습니다. - 4
- 호스트 이름은 Ingress Operator 도메인의 하위 도메인이어야 합니다. 도메인을 사용하는 경우 리스너는 해당 도메인의 모든 트래픽을 처리하려고 시도합니다.
- 5
- 이전에 생성된 비밀의 이름입니다.
다음 명령을 실행하여 리소스를 적용합니다.
oc apply -f example-gateway.yaml
$ oc apply -f example-gateway.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 선택 사항:
Gateway
객체를 생성하면 Red Hat OpenShift Service Mesh가 동일한 이름으로 배포 및 서비스를 자동으로 프로비저닝합니다. 다음 명령을 실행하여 이를 확인하세요.배포를 확인하려면 다음 명령을 실행하세요.
oc get deployment -n openshift-ingress example-gateway-openshift-default
$ oc get deployment -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 서비스를 확인하려면 다음 명령을 실행하세요.
oc get service -n openshift-ingress example-gateway-openshift-default
$ oc get service -n openshift-ingress example-gateway-openshift-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
선택 사항: Ingress Operator는 리스너의 호스트 이름을 사용하여
DNSRecord
CR을 자동으로 생성하고,gateway.networking.k8s.io/gateway-name=example-gateway
레이블을 추가합니다. 다음 명령을 실행하여 DNS 레코드 상태를 확인하세요.oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
$ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
이미 생성된 네임스페이스와
example-app/example-app
이라는 애플리케이션으로 요청을 전달하는HTTPRoute
리소스를 만듭니다.다음 정보를 포함하는 YAML 파일
example-route.yaml
을 만듭니다.예제
HTTPRoute
CRCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 리소스를 적용합니다.
oc apply -f example-route.yaml
$ oc apply -f example-route.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
httproute.gateway.networking.k8s.io/example-route created
httproute.gateway.networking.k8s.io/example-route created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여
Gateway
개체가 배포되었고 조건이Programmed
인지 확인하세요.oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
$ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
gateway.gateway.networking.k8s.io/example-gateway condition met
gateway.gateway.networking.k8s.io/example-gateway condition met
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 구성된
HTTPRoute
객체 호스트 이름으로 요청을 보냅니다.curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
$ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.13.4. 게이트웨이 API 배포 토폴로지 링크 복사링크가 클립보드에 복사되었습니다!
게이트웨이 API는 공유 게이트웨이 또는 전용 게이트웨이라는 두 가지 토폴로지를 수용하도록 설계되었습니다. 각 토폴로지마다 장점이 다르고 보안에 미치는 영향도 다릅니다.
- 전용 게이트웨이
-
경로와 모든 로드 밸런서 또는 프록시는 동일한 네임스페이스에서 제공됩니다.
Gateway
객체는 특정 애플리케이션 네임스페이스에 대한 경로를 제한합니다. 이는 OpenShift Container Platform에서 Gateway API 리소스를 배포할 때의 기본 토폴로지입니다. - 공유 게이트웨이
-
경로는 여러 네임스페이스 또는 여러 호스트 이름으로 제공됩니다.
Gateway
객체 필터는spec.listeners.allowedRoutes.namespaces
필드를 사용하여 애플리케이션 네임스페이스의 경로를 허용합니다.
2.13.4.1. 전용 게이트웨이 예 링크 복사링크가 클립보드에 복사되었습니다!
다음 예에서는 전용 Gateway
리소스인 fin-gateway를
보여줍니다.
전용 게이트웨이
리소스 예시
- 1
spec.listeners[].allowedRoutes를
설정하지 않고Gateway
리소스를 생성하면namespaces.from
필드의 값이Same
으로 암묵적으로 설정됩니다.
다음 예제에서는 전용 Gateway
개체에 연결되는 연관된 HTTPRoute
리소스인 sales-db
를 보여줍니다.
HTTPRoute
리소스 예시
HTTPRoute
리소스는 게이트웨이에 연결하기 위해 parentRefs
필드의 값으로 Gateway
개체의 이름을 가져야 합니다. 암묵적으로 해당 경로는 Gateway
개체와 같은 네임스페이스에 있다고 가정합니다.