다음을 통해 공유


Azure Kubernetes Service용 Istio 서비스 메쉬 추가 기능에 대한 이그레스 게이트웨이 배포(미리 보기)

이 문서에서는 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 이상을 사용해야 합니다.

  1. az extension add 명령을 사용하여 aks-preview 확장을 설치합니다.

    az extension add --name aks-preview
    
  2. 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 송신 게이트웨이를 사용하도록 설정하기 전에 StaticGatewayConfigurationegressIpPrefix가 할당될 때까지 기다리는 것이 모범 사례입니다.

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.modeALLOW_ANY로 설정되어 있으며, 이는 Envoy가 알 수 없는 서비스에 대한 요청을 통과시킨다는 의미입니다. 보안 모범 사례로 Istio 프록시가 Istio outboundTrafficPolicy.modeREGISTRY_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_NAMESPACEistio.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.modeREGISTRY_ONLY로 설정하면 curl에 대한 ServiceEntry를 만들지 않았기 때문에 edition.cnn.com 요청이 실패해야 합니다. outboundTrafficPolicy.modeALLOW_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 외부 송신 게이트웨이 구성

  1. 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
  1. 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
  1. 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 응답이 표시될 것입니다.

  1. 자원을 정리하세요
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 게이트웨이 구성

  1. ServiceEntry에 대한 HTTPS edition.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
  1. 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
  1. 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 응답이 표시될 것입니다.

  1. 자원을 정리하세요
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 발신 수행

  1. 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
  1. 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
  1. 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 표시됩니다.

  1. 자원을 정리하세요
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 노드 풀을 삭제할 수 있습니다.

다음 단계

비고

Istio 송신 게이트웨이 배포 또는 송신 트래픽 라우팅 구성과 관련된 문제가 발생하는 경우 Istio 추가 기능 송신 게이트웨이 문제 해결 문서를 참조하세요.