이 문서에서는 Azure Kubernetes Service (AKS) 클러스터에 대한 Istio 서비스 메시 애드온의 Egress 게이트웨이 배포 방법을 보여줍니다.
개요
Istio egress 게이트웨이는 메시 내 애플리케이션의 아웃바운드 트래픽을 모니터링하고 제한하는 중앙 통제 지점으로 기능할 수 있습니다. Istio 추가 기능을 사용하면 여러 네임스페이스에 여러 송신 게이트웨이를 배포할 수 있으므로 클러스터당 송신 게이트웨이, 네임스페이스당, 워크로드당 송신 게이트웨이 토폴로지 등을 설정할 수 있습니다. AKS는 Istio 추가 기능 송신 게이트웨이의 프로비전 및 수명 주기를 관리하는 동안 송신 게이트웨이를 통해 메시의 애플리케이션에서 트래픽을 라우팅하고 정책 및 원격 분석 컬렉션을 적용하는 Istio 사용자 지정 리소스를 만들어야 합니다.
Istio 추가 기능인 송신 게이트웨이는 Istio 송신 Pod에 고정 원본 IP 주소 접두사를 할당하는 정적 송신 게이트웨이 기능을 기반으로 구축되며 이 기능이 필요합니다. 방화벽 규칙 및 기타 아웃바운드 트래픽 필터링 메커니즘에 이 예측 가능한 송신 IP 범위를 사용할 수 있습니다. 정적 송신 게이트웨이 위에 Istio 송신 게이트웨이를 사용하면 심층 방어 송신 트래픽 제어에 Istio L7, ID 기반 정책 및 IP 기반 제한을 적용할 수 있습니다. 또한 Istio 송신 게이트웨이를 통해 아웃바운드 트래픽을 전달하면 여러 워크로드가 해당 애플리케이션 Pod/배포를 직접 수정하지 않고도 정적 송신 게이트웨이 노드 풀을 통해 트래픽을 라우팅할 수 있습니다.
제한 사항 및 요구 사항
- 클러스터당 최대
500
개의 Istio 애드온 송출 게이트웨이를 활성화할 수 있습니다. - Istio 송신 게이트웨이의 이름은 네임스페이스별로 고유해야 합니다.
- Istio 추가 기능 송신 게이트웨이 이름은 길이가
1-53
자여야 하고, 소문자 영숫자 문자, '-', 그리고 '.'로만 구성되어야 하며, 영숫자 문자로 시작하고 끝나야 합니다. 이름은 유효한 DNS(도메인 이름 시스템) 이름이어야 합니다. 이름 유효성 검사에 사용되는 regex는 .입니다^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
. - Istio 추가 기능과 함께 송신 트래픽 관리를 위해 Kubernetes Gateway API 를 사용하는 것은 수동 배포 모델에서만 지원됩니다.
- 정적 송신 게이트웨이는 현재 Azure CNI Pod 서브넷 클러스터에서 지원되지 않으므로 Istio 추가 기능 송신 게이트웨이도 Pod 서브넷 클러스터에서 지원되지 않습니다.
필수 조건
Istio 추가 기능 사용
이 가이드에서는 설명서를 따라 AKS 클러스터에서 Istio 추가 기능을 사용하도록 설정했다고 가정합니다.
aks-preview
Azure CLI 확장 설치
Azure CLI를 aks-preview
사용하는 경우 확장을 설치합니다.
aks-preview
버전 14.0.0b2
이상을 사용해야 합니다.
az extension add
명령을 사용하여aks-preview
확장을 설치합니다.az extension add --name aks-preview
az extension update
명령을 사용하여 확장의 최신 버전으로 업데이트합니다.az extension update --name aks-preview
정적 송신 게이트웨이 사용 및 구성
정적 송신 게이트웨이 설명서의 지침에 따라 클러스터에서 정적 송신 게이트웨이를 사용하도록 설정하고, 모드gateway
의 노드 풀을 만들고, 리소스를 만듭니다StaticGatewayConfiguration
.
Istio 이그레스 게이트웨이 활성화
비고
Istio 추가 기능 송신 게이트웨이 Pod는 gateway
노드 풀에 예약되지 않습니다.
gateway
노드 풀은 송신 트래픽을 라우팅하는 데만 사용되며 범용 워크로드를 제공하지 않습니다. 특정 노드에 예약된 송신 게이트웨이 Pod가 필요한 경우 AKS 시스템 노드 또는 azureservicemesh/istio.replica.preferred
노드 레이블을 사용하면 됩니다. Pod는 AKS 시스템 노드(레이블100
(으)로 지정됨)에 대한 가중 기본 설정 kubernetes.azure.com/mode: system
이(가) 있는 노드 선호도를 갖고 있으며, azureservicemesh/istio.replica.preferred: true
(으)로 레이블된 노드에 대해 가중 기본 설정 50
을(를) 갖고 있습니다.
az aks mesh enable-egress-gateway
를 사용하여 AKS 클러스터에서 Istio 송신 게이트웨이를 사용하도록 설정합니다. Istio 송신 게이트웨이의 이름과 필수 구성 요소 단계에서 만든 StaticGatewayConfiguration
의 이름을 지정해야 합니다. Istio 송신 게이트웨이를 배포할 네임스페이스를 지정할 수도 있습니다. 이 네임스페이스는 StaticGatewayConfiguration
가 생성된 동일한 네임스페이스여야 합니다. 네임스페이스를 지정하지 않으면, 송신 게이트웨이는 aks-istio-egress
네임스페이스에 프로비전됩니다.
게이트웨이 구성을 사용하여 Istio 송신 게이트웨이를 사용하도록 설정하기 전에 StaticGatewayConfiguration
에 egressIpPrefix
가 할당될 때까지 기다리는 것이 모범 사례입니다.
az aks mesh enable-egress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --istio-egressgateway-name $ISTIO_EGRESS_NAME --istio-egressgateway-namespace $ISTIO_EGRESS_NAMESPACE --gateway-configuration-name $ISTIO_SGC_NAME
이그레스 게이트웨이에 대한 서비스가 생성되는지 확인합니다.
kubectl get svc $ISTIO_EGRESS_NAME -n $ISTIO_EGRESS_NAMESPACE
송신 게이트웨이에 대한 ClusterIP
서비스가 표시됩니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
asm-egress-test ClusterIP 10.0.128.17 <none> 15021/TCP,80/TCP,443/TCP 6d4h
Istio 송신 게이트웨이에 대한 배포가 만들어지는지와 송신 게이트웨이 Pod에 kubernetes.azure.com/static-gateway-configuration
주석이 gatewayConfigurationName
으로 설정되어 있는지를 확인할 수도 있습니다.
ASM_REVISION=$(az aks show -g $RESOURCE_GROUP -n $CLUSTER_NAME | jq '.serviceMeshProfile.istio.revisions[0]' | sed 's/"//g')
kubectl get deployment $ISTIO_EGRESS_NAME-$ASM_REVISION -n $ISTIO_EGRESS_NAMESPACE -o jsonpath={.spec.template.metadata.annotations."kubernetes\.azure\.com\/static-gateway-configuration"}
az aks mesh enable-egress-gateway
명령을 다시 실행하여 또 다른 Istio 송신 게이트웨이를 만들 수 있습니다.
비고
Istio 추가 기능의 사소한 수정 버전 업그레이드를 수행하면 각 송신 게이트웨이에 대한 또 다른 배포가 새 컨트롤 플레인 수정 버전에 대해 만들어집니다.
Istio 송신 게이트웨이를 통해 트래픽 라우팅
outboundTrafficPolicy.mode
설정
기본적으로 Istio outboundTrafficPolicy.mode
는 ALLOW_ANY
로 설정되어 있으며, 이는 Envoy가 알 수 없는 서비스에 대한 요청을 통과시킨다는 의미입니다. 보안 모범 사례로 Istio 프록시가 Istio outboundTrafficPolicy.mode
REGISTRY_ONLY
의 서비스 레지스트리에 추가되지 않은 서비스에 대한 요청을 차단하도록 Istio를 설정해야 합니다. 를 사용하여 클러스터 외부의 호스트를 Istio의 서비스 레지스트리에 ServiceEntry
추가할 수 있습니다.
Istio 추가 기능 outboundTrafficPolicy.mode
를 사용하여 메시 전체 수준에서 를 구성하거나 Sidecar 사용자 정의 리소스를 사용하여 특정 네임스페이스 또는 워크로드를 대상으로 지정할 수 있습니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-shared-configmap-asm-1-24
namespace: aks-istio-system
data:
mesh: |-
outboundTrafficPolicy:
mode: REGISTRY_ONLY
샘플 애플리케이션 배포
이 예제에서는 Istio 애드온 송신 게이트웨이와 동일한 네임스페이스에 curl
애플리케이션을 배포합니다. 애플리케이션의 Pod가 사이드카와 함께 삽입되도록 ISTIO_EGRESS_NAMESPACE
에 istio.io/rev
레이블을 지정해야 합니다.
kubectl label namespace $ISTIO_EGRESS_NAMESPACE istio.io/rev=$ASM_REVISION
그런 다음 샘플 애플리케이션을 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/curl/curl.yaml -n $ISTIO_EGRESS_NAMESPACE
삽입된 사이드카 컨테이너와 함께 실행되는 curl
Pod가 표시됩니다.
NAME READY STATUS RESTARTS AGE
curl-5b549b49b8-bcgts 2/2 Running 0 13s
직접 curl
에서 edition.cnn.com
로 요청을 보내 보세요.
SOURCE_POD=$(kubectl get pod -n $ISTIO_EGRESS_NAMESPACE -l app=curl -o jsonpath={.items..metadata.name})
kubectl exec -n $ISTIO_EGRESS_NAMESPACE "$SOURCE_POD" -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
outboundTrafficPolicy.mode
를 REGISTRY_ONLY
로 설정하면 curl
에 대한 ServiceEntry
를 만들지 않았기 때문에 edition.cnn.com
요청이 실패해야 합니다.
outboundTrafficPolicy.mode
가 ALLOW_ANY
인 경우, 요청은 성공해야 합니다.
curl
Pod에서 Istio 추가 기능 송신 게이트웨이로 edition.cnn.com
요청을 실제로 라우팅하려면 ServiceEntry
를 만들고 다른 Istio 사용자 지정 리소스를 구성해야 합니다. 후속 섹션 중 하나의 지침에 따라 HTTP 송신 게이트웨이, HTTPS 송신 게이트웨이 또는 TLS(전송 계층 보안) 연결을 시작하는 송신 게이트웨이를 구성합니다.
다음 시나리오를 시작하기 전에 다음 환경 변수를 설정합니다.
ISTIO_EGRESS_DEPLOYMENT=$ISTIO_EGRESS_NAME-$ASM_REVISION
EGRESS_GTW_SELECTOR=$(kubectl get deployment $ISTIO_EGRESS_DEPLOYMENT -n $ISTIO_EGRESS_NAMESPACE -o jsonpath={.metadata.labels.istio})
MeshConfig 또는 텔레메트리 API를 통해 Envoy 액세스 로깅을 사용하도록 설정할 수도 있습니다. 액세스 로깅을 사용하도록 설정하면, 컨테이너 로그 istio-proxy
를 검사하여 트래픽이 송신 게이트웨이를 통해 흐르는지 확인할 수 있습니다.
kubectl logs -l istio=$EGRESS_GTW_SELECTOR -n $ISTIO_EGRESS_NAMESPACE
HTTP Istio 외부 송신 게이트웨이 구성
-
edition.cnn.com
에 대한ServiceEntry
를 만듭니다.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: cnn
spec:
hosts:
- edition.cnn.com
ports:
- number: 80
name: http-port
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
EOF
-
Gateway
,VirtualService
,DestinationRule
를 생성하여curl
애플리케이션의 HTTP 트래픽을 송신 게이트웨이를 통해edition.cnn.com
로 라우팅합니다. 송신 게이트웨이 배포의istio
레이블 선택기를 기반으로 게이트웨이 선택기와 서비스의 FQDN(정규화된 도메인 이름)을 적절히 설정해야 합니다.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: $EGRESS_GTW_SELECTOR
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- edition.cnn.com
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: egressgateway-for-cnn
spec:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subsets:
- name: cnn
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: direct-cnn-through-egress-gateway
spec:
hosts:
- edition.cnn.com
gateways:
- istio-egressgateway
- mesh
http:
- match:
- gateways:
- mesh
port: 80
route:
- destination:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subset: cnn
port:
number: 80
weight: 100
- match:
- gateways:
- istio-egressgateway
port: 80
route:
- destination:
host: edition.cnn.com
port:
number: 80
weight: 100
EOF
-
curl
로부터edition.cnn.com
pod로 HTTP 요청을 보내세요.
kubectl exec -n $ISTIO_EGRESS_NAMESPACE "$SOURCE_POD" -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
HTTP/2 200
응답이 표시될 것입니다.
- 자원을 정리하세요
kubectl delete serviceentry cnn -n $ISTIO_EGRESS_NAMESPACE
kubectl delete gateway istio-egressgateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete virtualservice direct-cnn-through-egress-gateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule egressgateway-for-cnn -n $ISTIO_EGRESS_NAMESPACE
HTTPS Istio Egress 게이트웨이 구성
-
ServiceEntry
에 대한 HTTPSedition.cnn.com
를 만드세요.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: cnn
spec:
hosts:
- edition.cnn.com
ports:
- number: 443
name: tls
protocol: TLS
resolution: DNS
EOF
-
Gateway
,VirtualService
,DestinationRule
를 생성하여curl
애플리케이션의 HTTP 트래픽을 송신 게이트웨이를 통해edition.cnn.com
로 라우팅합니다. 송신 게이트웨이 배포의istio
레이블 선택기를 기반으로 게이트웨이 선택기와 서비스 FQDN을 적절하게 설정해야 합니다.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: $EGRESS_GTW_SELECTOR
servers:
- port:
number: 443
name: tls
protocol: TLS
hosts:
- edition.cnn.com
tls:
mode: PASSTHROUGH
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: egressgateway-for-cnn
spec:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subsets:
- name: cnn
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: direct-cnn-through-egress-gateway
spec:
hosts:
- edition.cnn.com
gateways:
- mesh
- istio-egressgateway
tls:
- match:
- gateways:
- mesh
port: 443
sniHosts:
- edition.cnn.com
route:
- destination:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subset: cnn
port:
number: 443
- match:
- gateways:
- istio-egressgateway
port: 443
sniHosts:
- edition.cnn.com
route:
- destination:
host: edition.cnn.com
port:
number: 443
weight: 100
EOF
-
curl
에서edition.cnn.com
로 HTTPS 요청을 보내 보세요.
kubectl exec "$SOURCE_POD" -n $ISTIO_EGRESS_NAMESPACE -c curl -- curl -sSL -o /dev/null -D - https://edition.cnn.com/politics
HTTP/2 200
응답이 표시될 것입니다.
- 자원을 정리하세요
kubectl delete serviceentry cnn -n $ISTIO_EGRESS_NAMESPACE
kubectl delete gateway istio-egressgateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete virtualservice direct-cnn-through-egress-gateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule egressgateway-for-cnn -n $ISTIO_EGRESS_NAMESPACE
Istio 송신 게이트웨이를 구성하여 TLS 발신 수행
-
edition.cnn.com
에 대한ServiceEntry
를 만듭니다.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: cnn
spec:
hosts:
- edition.cnn.com
ports:
- number: 80
name: http
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
EOF
-
Gateway
,VirtualService
, 및DestinationRule
를 생성하여curl
애플리케이션에서 HTTP 트래픽을 이그레스 게이트웨이를 통해edition.cnn.com
로 라우팅하고 이그레스 게이트웨이에서 TLS 기원을 수행합니다. 송신 게이트웨이 배포의istio
레이블 선택기를 기반으로 게이트웨이 선택기와 서비스 FQDN을 적절하게 설정해야 합니다.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: $EGRESS_GTW_SELECTOR
servers:
- port:
number: 80
name: https-port-for-tls-origination
protocol: HTTPS
hosts:
- edition.cnn.com
tls:
mode: ISTIO_MUTUAL
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: egressgateway-for-cnn
spec:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subsets:
- name: cnn
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 80
tls:
mode: ISTIO_MUTUAL
sni: edition.cnn.com
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: direct-cnn-through-egress-gateway
spec:
hosts:
- edition.cnn.com
gateways:
- istio-egressgateway
- mesh
http:
- match:
- gateways:
- mesh
port: 80
route:
- destination:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subset: cnn
port:
number: 80
weight: 100
- match:
- gateways:
- istio-egressgateway
port: 80
route:
- destination:
host: edition.cnn.com
port:
number: 443
weight: 100
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: originate-tls-for-edition-cnn-com
spec:
host: edition.cnn.com
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE # initiates HTTPS for connections to edition.cnn.com
EOF
- TLS 발신을 수행하는 송신 게이트웨이와 함께 요청 양식을
curl
에서edition.cnn.com
(으)로 보내 봅니다.
kubectl exec "${SOURCE_POD}" -n $ISTIO_EGRESS_NAMESPACE -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
상태 응답이 200
표시됩니다.
- 자원을 정리하세요
kubectl delete serviceentry cnn -n $ISTIO_EGRESS_NAMESPACE
kubectl delete gateway istio-egressgateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete virtualservice direct-cnn-through-egress-gateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule originate-tls-for-edition-cnn-com -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule egressgateway-for-cnn -n $ISTIO_EGRESS_NAMESPACE
Istio 송신 게이트웨이 사용 안 함
az aks mesh disable-egress-gateway
명령을 실행하여 만든 Istio 추가 기능 송신 게이트웨이를 사용하지 않도록 설정합니다.
az aks mesh disable-egress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --istio-egressgateway-name $ISTIO_EGRESS_NAME --istio-egressgateway-namespace $ISTIO_EGRESS_NAMESPACE
Istio 송신 게이트웨이를 비활성화한 후, 다른 Istio 송신 게이트웨이가 사용하고 있지 않다면 해당 송신 게이트웨이가 사용했던 StaticGatewayConfiguration
, 네임스페이스 및 gateway
노드 풀을 삭제할 수 있습니다.
다음 단계
- Kubernetes Gateway API를 사용하여 Istio 서비스 메시 애드온에 대한 인그레스 구성
- Istio 서비스 메시 추가 기능에 대한 외부 또는 내부 수신 배포
- 송신 게이트웨이 HPA(Horizontal Pod Autoscaler) 구성
비고
Istio 송신 게이트웨이 배포 또는 송신 트래픽 라우팅 구성과 관련된 문제가 발생하는 경우 Istio 추가 기능 송신 게이트웨이 문제 해결 문서를 참조하세요.
Azure Kubernetes Service