다음을 통해 공유


Azure Kubernetes Services의 Istio 서비스 메시 애드온을 위한 인그레스 게이트웨이를 배포합니다.

이 문서에서는 AKS(Azure Kubernetes Service) 클러스터용 Istio 서비스 메쉬 애드온에 대한 외부 또는 내부 인그레스를 배포하는 방법을 설명합니다.

참고 항목

Istio 추가 기능의 사소한 수정 업그레이드 를 수행하면 새 컨트롤 플레인 수정 버전에 대한 외부/내부 게이트웨이에 대한 또 다른 배포가 만들어집니다.

필수 조건

이 가이드에서는 설명서에 따라 AKS 클러스터에서 Istio 추가 기능을 사용하도록 설정하고, 샘플 애플리케이션을 배포하고, 환경 변수를 설정했다고 가정합니다.

외부 수신 게이트웨이 사용

참고 항목

특정 노드에 예약된 수신 게이트웨이 Pod가 필요한 경우 AKS 시스템 노드 또는 azureservicemesh/istio.replica.preferred 노드 레이블을 사용할 수 있습니다. Pod는 AKS 시스템 노드(레이블kubernetes.azure.com/mode: system으로 지정됨)에 대한 가중 기본 설정100이 있는 노드 선호도를 갖고 있으며, 레이블azureservicemesh/istio.replica.preferred: true로 지정된 노드에 대해 가중 기본 설정50을 갖고 있습니다.

az aks mesh enable-ingress-gateway를 사용하여 AKS 클러스터에서 외부에서 액세스할 수 있는 Istio 수신을 사용하도록 설정합니다.

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

kubectl get svc를 사용하여 수신 게이트웨이에 매핑된 서비스를 확인합니다.

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

출력에서 서비스의 외부 IP 주소가 공개적으로 액세스할 수 있는 IP 주소인지 확인합니다.

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-external   LoadBalancer   10.0.10.249   <EXTERNAL_IP>   15021:30705/TCP,80:32444/TCP,443:31728/TCP   4m21s

수신 게이트웨이를 사용하도록 설정한 후에는 기본적으로 클러스터 외부에서 애플리케이션에 액세스할 수 없습니다. 애플리케이션에 액세스할 수 있도록 하려면 다음 매니페스트를 사용하여 샘플 배포의 수신을 Istio 수신 게이트웨이에 매핑합니다.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway-external
spec:
  selector:
    istio: aks-istio-ingressgateway-external
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-external
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway-external
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

참고 항목

게이트웨이 개체에 사용된 선택기는 이전에 활성화된 외부 수신에 매핑된 서비스의 레이블로 찾을 수 있는 istio: aks-istio-ingressgateway-external을 가리킵니다.

외부 수신 호스트 및 포트에 대한 환경 변수를 설정합니다.

export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL

샘플 애플리케이션의 외부 주소를 검색합니다.

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

이전 명령의 출력에서 URL로 이동하여 샘플 애플리케이션의 제품 페이지가 표시되는지 확인합니다. 또는 curl을 사용하여 샘플 애플리케이션에 액세스할 수 있는지 확인할 수도 있습니다. 예시:

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

샘플 애플리케이션의 제품 페이지에 액세스할 수 있는지 확인합니다. 예상 출력은 다음과 같습니다.

<title>Simple Bookstore App</title>

내부 수신 게이트웨이 사용

az aks mesh enable-ingress-gateway를 사용하여 AKS 클러스터에서 내부 Istio 수신을 사용하도록 설정합니다.

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

kubectl get svc를 사용하여 수신 게이트웨이에 매핑된 서비스를 확인합니다.

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

출력에서 서비스의 외부 IP 주소는 공개적으로 액세스할 수 있는 주소가 아니며 대신 로컬로만 액세스할 수 있음을 확인합니다.

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-internal   LoadBalancer   10.0.182.240  <IP>      15021:30764/TCP,80:32186/TCP,443:31713/TCP   87s

수신 게이트웨이를 사용하도록 설정한 후에는 게이트웨이를 통해 애플리케이션을 노출해야 하며 그에 따라 라우팅 규칙을 구성해야 합니다. 다음 매니페스트를 사용하여 샘플 배포의 수신을 Istio 수신 게이트웨이에 매핑합니다.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-internal-gateway
spec:
  selector:
    istio: aks-istio-ingressgateway-internal
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-internal
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-internal-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

참고 항목

게이트웨이 개체에 사용된 선택기는 이전에 활성화된 내부 수신에 매핑된 서비스의 레이블로 찾을 수 있는 istio: aks-istio-ingressgateway-internal을 가리킵니다.

내부 수신 호스트 및 포트에 대한 환경 변수를 설정합니다.

export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL

샘플 애플리케이션의 주소를 검색합니다.

echo "http://$GATEWAY_URL_INTERNAL/productpage"

이전 명령의 출력에서 URL로 이동하여 샘플 애플리케이션의 제품 페이지가 표시되지 않는지 확인합니다. 또는 curl을 사용하여 샘플 애플리케이션에 액세스할 수 없는지 확인할 수도 있습니다. 예시:

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

kubectl exec를 사용하여 클러스터의 가상 네트워크 내에서 애플리케이션에 액세스할 수 있는지 확인합니다.

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS  "http://$GATEWAY_URL_INTERNAL/productpage"  | grep -o "<title>.*</title>"

샘플 애플리케이션의 제품 페이지에 액세스할 수 있는지 확인합니다. 예상 출력은 다음과 같습니다.

<title>Simple Bookstore App</title>

인그레스 게이트웨이 서비스 사용자 지정

주석

외부 및 내부 수신 게이트웨이에 대한 Kubernetes 서비스에 다음 주석을 추가할 수 있습니다.

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: 내부 수신 게이트웨이를 바인딩할 서브넷의 이름입니다. 이 서브넷은 메시와 동일한 가상 네트워크에 있어야 합니다.
  • service.beta.kubernetes.io/azure-shared-securityrule: 보강된 보안 규칙을 통해 수신 게이트웨이를 노출하는 데 사용됩니다.
  • service.beta.kubernetes.io/azure-allowed-service-tags: 수신 게이트웨이가 요청을 받을 수 있는 서비스 태그 를 지정하는 데 사용됩니다.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: 정적 IPv4 주소를 구성하기 위한 것입니다.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: 클러스터와 다른 리소스 그룹에 공용 IP의 리소스 그룹을 지정하는 데 사용합니다.
  • service.beta.kubernetes.io/azure-pip-name: 공용 IP 주소의 이름을 지정하는 데 사용합니다.
  • external-dns.alpha.kubernetes.io/hostname: 리소스의 DNS 레코드에 대한 도메인을 지정하는 데 사용합니다. 자세한 내용은 external-dns를 참조하세요.

추가 기능은 포트 80 및 443에 대한 상태 프로브 주석을 지원합니다. 여기에서 포트 사용에 대해 자세히 알아봅니 .

외부 트래픽 정책

추가 기능은 Kubernetes 서비스 내 수신 게이트웨이를 위한 .spec.externalTrafficPolicy의 사용자 지정을 지원합니다. .spec.externalTrafficPolicy을(를) Local로 설정하면 Istio 인그레스 게이트웨이에서 클라이언트의 원본 IP를 유지하고 백엔드 인그레스 게이트웨이 Pod로의 트래픽 경로에서 두 번째 홉을 방지합니다.

kubectl patch service aks-istio-ingressgateway-external -n aks-istio-ingress --type merge --patch '{"spec": {"externalTrafficPolicy": "Local"}}'

참고 항목

.spec.externalTrafficPolicyLocal로 수정하면 트래픽이 잠재적으로 불균형하게 분산될 위험이 있습니다. 이 변경 내용을 적용하기 전에 Kubernetes 문서를 읽어 다양한 externalTrafficPolicy 설정 간의 절충을 이해하는 것이 좋습니다.

리소스 삭제

Istio 외부 또는 내부 수신 게이트웨이를 정리하고 클러스터에서 메시를 사용하도록 설정하려면 다음 명령을 실행합니다.

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Istio 서비스 메시 및 수신(클러스터 뒤에 남겨짐)을 정리하려면 다음 명령을 실행합니다.

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Istio 방법 지침 문서에서 만든 모든 리소스를 정리하려면 다음 명령을 실행합니다.

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

다음 단계

참고 항목

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