Application Gateway for Containers를 사용하는 백 엔드 MTLS - 게이트웨이 API
이 문서는 게이트웨이 API에서 다음 리소스를 사용하는 예제 애플리케이션을 설정하는 데 도움이 됩니다. 다음 단계가 제공됩니다.
- 하나의 HTTPS 수신기를 사용하여 게이트웨이 리소스를 만듭니다.
- 백 엔드 서비스를 참조하는 HTTPRoute 리소스를 만듭니다.
- HTTPRoute에서 참조되는 백 엔드 서비스에 대한 클라이언트 및 CA 인증서가 있는 BackendTLSPolicy 리소스를 만듭니다.
배경
MTLS(상호 전송 계층 보안)는 인증서를 사용하여 통신을 암호화하고 서비스에 대한 클라이언트를 식별하는 프로세스입니다. 이를 통해 백 엔드 워크로드는 인증된 디바이스의 연결만 신뢰하여 보안 태세를 더욱 강화할 수 있습니다.
다음 그림을 참조하세요.
필수 조건
BYO 배포 전략을 따르는 경우 컨테이너 리소스 및 ALB 컨트롤러에 대한 Application Gateway를 설정해야 합니다.
ALB 관리 배포 전략을 따르는 경우 ALB 컨트롤러를 프로비전하고 ApplicationLoadBalancer 사용자 지정 리소스를 통해 컨테이너용 Application Gateway 리소스를 프로비전해야 합니다.
샘플 HTTP 애플리케이션 배포:
클러스터에 다음 deployment.yaml 파일을 적용하여 샘플 웹 애플리케이션을 만들고 샘플 비밀을 배포하여 mTLS(백 엔드 상호 인증)를 보여 줍니다.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/https-scenario/end-to-end-ssl-with-backend-mtls/deployment.yaml
이 명령은 클러스터에 다음을 만듭니다.
- 호출된 네임스페이스
test-infra
- 네임스페이스에서 호출
mtls-app
된test-infra
서비스 1개 - 네임스페이스에서 호출
mtls-app
된test-infra
배포 1개 - 네임스페이스에서 호출
mtls-app-nginx-cm
된test-infra
하나의 구성 맵 - 네임스페이스에서 ,
frontend.com
,gateway-client-cert
및ca.bundle
네임스페이스test-infra
라는backend.com
네 개의 비밀
- 호출된 네임스페이스
필수 게이트웨이 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: https-listener
port: 443
protocol: HTTPS
allowedRoutes:
namespaces:
from: Same
tls:
mode: Terminate
certificateRefs:
- kind : Secret
group: ""
name: frontend.com
EOF
참고 항목
ALB 컨트롤러는 ARM에서 컨테이너용 Application Gateway 리소스를 만들 때 프런트 엔드 리소스에 대해 다음과 같은 명명 규칙을 사용합니다. fe-<임의로 만들어진 문자 8개>
Azure에서 만들어진 프런트 엔드의 이름을 변경하려면 자체 배포 전략 가져오기를 따르는 것이 좋습니다.
게이트웨이 리소스가 만들어지면 상태 유효하고 수신기가 프로그래밍되고 주소가 게이트웨이에 할당되었는지 확인합니다.
kubectl get gateway gateway-01 -n test-infra -o yaml
성공적인 게이트웨이 만들기의 예제 출력:
status:
addresses:
- type: IPAddress
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
게이트웨이가 만들어지면 HTTPRoute 리소스를 만듭니다.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: https-route
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
rules:
- backendRefs:
- name: mtls-app
port: 443
EOF
HTTPRoute 리소스가 만들어지면 경로가 수락되고 컨테이너용 Application Gateway 리소스가 프로그래밍되었는지 확인합니다.
kubectl get httproute https-route -n test-infra -o yaml
Application Gateway for Containers 리소스의 상태 성공적으로 업데이트되었는지 확인합니다.
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
BackendTLSPolicy 만들기
kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: BackendTLSPolicy
metadata:
name: mtls-app-tls-policy
namespace: test-infra
spec:
targetRef:
group: ""
kind: Service
name: mtls-app
namespace: test-infra
default:
sni: backend.com
ports:
- port: 443
clientCertificateRef:
name: gateway-client-cert
group: ""
kind: Secret
verify:
caCertificateRef:
name: ca.bundle
group: ""
kind: Secret
subjectAltName: backend.com
EOF
BackendTLSPolicy 개체가 만들어지면 개체의 상태 검사 정책이 유효한지 확인합니다.
kubectl get backendtlspolicy -n test-infra mtls-app-tls-policy -o yaml
유효한 BackendTLSPolicy 개체 만들기의 예제 출력:
status:
conditions:
- lastTransitionTime: "2023-06-29T16:54:42Z"
message: Valid BackendTLSPolicy
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
애플리케이션에 대한 액세스 테스트
이제 프런트 엔드에 할당된 FQDN을 통해 일부 트래픽을 샘플 애플리케이션으로 보낼 준비가 되었습니다. 다음 명령을 사용하여 FQDN을 가져옵니다.
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
이 FQDN을 컬링하면 HTTPRoute에 구성된 대로 백 엔드에서 응답을 반환해야 합니다.
curl --insecure https://$fqdn/
축하합니다. ALB 컨트롤러를 설치하고, 백 엔드 애플리케이션을 배포하고, 컨테이너용 Azure Application Gateway의 수신을 통해 애플리케이션으로 트래픽을 라우팅했습니다.