컨테이너용 Application Gateway를 사용한 다중 사이트 호스팅 - 게이트웨이 API
이 문서는 Gateway API의 리소스를 사용하여 동일한 Kubernetes Gateway 리소스/컨테이너용 Application Gateway 프런트 엔드에서 다중 사이트를 호스팅하는 방법을 보여주는 예제 애플리케이션을 설정하는 데 도움이 됩니다. 다음 단계가 제공됩니다.
배경
컨테이너용 Application Gateway는 동일한 포트에서 둘 이상의 웹 애플리케이션을 구성할 수 있도록 하여 다중 사이트 호스팅을 지원합니다. 고유한 백 엔드 서비스를 사용하여 둘 이상의 고유한 사이트를 호스트할 수 있습니다. 다음과 같은 예제 시나리오를 참조하세요.
필수 조건
BYO 배포 전략을 사용한 경우 컨테이너 리소스용 Application Gateway와 ALB 컨트롤러를 설정했는지 확인합니다.
ALB 관리형 배포 전략을 사용한 경우 ApplicationLoadBalancer 사용자 지정 리소스를 통해 ALB 컨트롤러 및 컨테이너용 Application Gateway 리소스를 프로비전했는지 확인합니다.
샘플 HTTP 애플리케이션을 배포합니다.
클러스터에 다음 배포.yaml 파일을 적용하여 경로, 쿼리 및 헤더 기반 라우팅을 보여 주는 샘플 웹 애플리케이션을 만듭니다.kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
이 명령은 클러스터에 다음을 만듭니다.
test-infra
라는 네임스페이스test-infra
네임스페이스에 있는backend-v1
및backend-v2
라는 두 서비스test-infra
네임스페이스에 있는backend-v1
및backend-v2
라는 두 배포
필수 게이트웨이 API 리소스 배포
- 게이트웨이 만들기
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: gateway-01
namespace: test-infra
annotations:
alb.networking.azure.io/alb-namespace: alb-test-infra
alb.networking.azure.io/alb-name: alb-test
spec:
gatewayClassName: azure-alb-external
listeners:
- name: http-listener
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: Same
EOF
참고 항목
ALB 컨트롤러는 ARM에서 컨테이너용 Application Gateway 리소스를 만들 때 프런트 엔드 리소스에 fe-<임의로 생성된 문자 8개>와 같은 명명 규칙을 사용합니다.
Azure에서 만들어진 프런트 엔드의 이름을 변경하려면 자체 배포 전략 가져오기를 따르는 것이 좋습니다.
게이트웨이 리소스가 만들어지면 상태가 유효한지, 수신기가 프로그래밍되어 있는지, 주소가 게이트웨이에 할당되어 있는지 확인합니다.
kubectl get gateway gateway-01 -n test-infra -o yaml
게이트웨이가 성공적으로 만들어진 경우의 출력 예제입니다.
status:
addresses:
- type: Hostname
value: xxxx.yyyy.alb.azure.com
conditions:
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Valid Gateway
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Application Gateway For Containers resource has been successfully updated.
observedGeneration: 1
reason: Programmed
status: "True"
type: Programmed
listeners:
- attachedRoutes: 0
conditions:
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: ""
observedGeneration: 1
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Listener is accepted
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Application Gateway For Containers resource has been successfully updated.
observedGeneration: 1
reason: Programmed
status: "True"
type: Programmed
name: https-listener
supportedKinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
게이트웨이가 만들어지면 contoso.com
및 fabrikam.com
도메인 이름에 대한 두 개의 HTTPRoute 리소스를 만듭니다. 각 도메인은 트래픽을 다른 백 엔드 서비스로 전달합니다.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: contoso-route
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
hostnames:
- "contoso.com"
rules:
- backendRefs:
- name: backend-v1
port: 8080
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: fabrikam-route
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
hostnames:
- "fabrikam.com"
rules:
- backendRefs:
- name: backend-v2
port: 8080
EOF
HTTPRoute 리소스가 만들어지면 두 HTTPRoute 리소스가 허용됨으로 표시되고 컨테이너용 Application Gateway 리소스가 프로그래밍되었는지 확인합니다.
kubectl get httproute contoso-route -n test-infra -o yaml
kubectl get httproute fabrikam-route -n test-infra -o yaml
각 HTTPRoute에 대해 컨테이너용 Application Gateway 리소스의 상태가 성공적으로 업데이트되었는지 확인합니다.
status:
parents:
- conditions:
- lastTransitionTime: "2023-06-19T22:18:23Z"
message: ""
observedGeneration: 1
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
- lastTransitionTime: "2023-06-19T22:18:23Z"
message: Route is Accepted
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2023-06-19T22:18:23Z"
message: Application Gateway For Containers resource has been successfully updated.
observedGeneration: 1
reason: Programmed
status: "True"
type: Programmed
controllerName: alb.networking.azure.io/alb-controller
parentRef:
group: gateway.networking.k8s.io
kind: Gateway
name: gateway-01
namespace: test-infra
애플리케이션에 대한 액세스 테스트
이제 프런트 엔드에 할당된 FQDN을 통해 샘플 애플리케이션에 일부 트래픽을 전송할 준비가 되었습니다. 다음 명령을 사용하여 FQDN을 가져옵니다.
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
프런트 엔드 FQDN에 대해 curl 명령 contoso.com
을 사용하여 서버 이름 표시기를 지정하면 backend-v1 서비스에서 응답을 반환합니다.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
응답을 통해 다음을 확인해야 합니다.
{
"path": "/",
"host": "contoso.com",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"Accept": [
"*/*"
],
"User-Agent": [
"curl/7.81.0"
],
"X-Forwarded-For": [
"xxx.xxx.xxx.xxx"
],
"X-Forwarded-Proto": [
"http"
],
"X-Request-Id": [
"dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
]
},
"namespace": "test-infra",
"ingress": "",
"service": "",
"pod": "backend-v1-5b8fd96959-f59mm"
}
프런트 엔드 FQDN에 대해 curl 명령 fabrikam.com
을 사용하여 서버 이름 표시기를 지정하면 backend-v1 서비스에서 응답을 반환합니다.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve fabrikam.com:80:$fqdnIp http://fabrikam.com
응답을 통해 다음을 확인해야 합니다.
{
"path": "/",
"host": "fabrikam.com",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"Accept": [
"*/*"
],
"User-Agent": [
"curl/7.81.0"
],
"X-Forwarded-For": [
"xxx.xxx.xxx.xxx"
],
"X-Forwarded-Proto": [
"http"
],
"X-Request-Id": [
"adae8cc1-8030-4d95-9e05-237dd4e3941b"
]
},
"namespace": "test-infra",
"ingress": "",
"service": "",
"pod": "backend-v2-594bd59865-ppv9w"
}
축하합니다. ALB 컨트롤러를 설치하고 백 엔드 애플리케이션을 배포했으며, 컨테이너용 Application Gateway의 게이트웨이 API를 통해 서로 다른 호스트 이름을 사용하여 서로 다른 두 가지 백 엔드 서비스로 트래픽을 라우팅했습니다.