Istio 서비스 메시 추가 기능 배포에 대한 AKS(Azure Kubernetes Service) 외부 또는 내부 수신

이 문서에서는 AKS(Azure Kubernetes Service) 클러스터용 Istio 서비스 메시 추가 기능에 대한 외부 또는 내부 수신을 배포하는 방법을 보여 줍니다.

참고 항목

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

필수 조건

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

외부 수신 게이트웨이 사용

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

참고 항목

내부 및 외부 게이트웨이의 IP 주소에 대한 사용자 지정은 아직 지원되지 않습니다. 수신 사양의 IP 주소 사용자 지정은 Istio 추가 기능에 의해 다시 되돌려집니다. 향후 Istio 추가 기능에 대한 게이트웨이 API 구현에서 이러한 사용자 지정을 허용할 계획입니다.

수신 게이트웨이를 사용하도록 설정한 후에는 기본적으로 클러스터 외부에서 애플리케이션에 액세스할 수 없습니다. 애플리케이션에 액세스할 수 있도록 하려면 다음 매니페스트를 사용하여 샘플 배포의 수신을 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 주소의 이름을 지정하는 데 사용합니다.

리소스 삭제

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

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

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

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

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

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

다음 단계

참고 항목

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