Zewnętrzne lub wewnętrzne wejścia usługi Azure Kubernetes Service (AKS) dla wdrożenia usługi Istio Service Mesh

W tym artykule przedstawiono sposób wdrażania zewnętrznych lub wewnętrznych dodatków siatki usługi Istio dla klastra usługi Azure Kubernetes Service (AKS).

Uwaga

Podczas wykonywania drobnego uaktualnienia poprawki dodatku Istio zostanie utworzone kolejne wdrożenie dla bram zewnętrznych/wewnętrznych dla nowej poprawki płaszczyzny sterowania.

Wymagania wstępne

W tym przewodniku założono, że wykonano czynności opisane w dokumentacji , aby włączyć dodatek Istio w klastrze usługi AKS, wdrożyć przykładową aplikację i ustawić zmienne środowiskowe.

Włączanie zewnętrznej bramy ruchu przychodzącego

Użyj az aks mesh enable-ingress-gateway polecenia , aby włączyć zewnętrznie dostępny ruch przychodzący Istio w klastrze usługi AKS:

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

Użyj kubectl get svc polecenia , aby sprawdzić usługę zamapowana na bramę ruchu przychodzącego:

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

Zwróć uwagę na dane wyjściowe, że zewnętrzny adres IP usługi jest publicznie dostępny:

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

Aplikacje nie są domyślnie dostępne spoza klastra po włączeniu bramy ruchu przychodzącego. Aby udostępnić aplikację, zamapuj ruch przychodzący przykładowego wdrożenia na bramę ruchu przychodzącego Istio przy użyciu następującego manifestu:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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

Uwaga

Selektor używany w obiekcie bramy wskazuje element istio: aks-istio-ingressgateway-external, który można znaleźć jako etykietę w usłudze zamapowanej na zewnętrzny ruch przychodzący, który został włączony wcześniej.

Ustaw zmienne środowiskowe dla zewnętrznego hosta i portów przychodzących:

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

Pobierz zewnętrzny adres przykładowej aplikacji:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Przejdź do adresu URL z danych wyjściowych poprzedniego polecenia i upewnij się, że zostanie wyświetlona strona produktu przykładowej aplikacji. Alternatywnie możesz również użyć curl polecenia , aby potwierdzić, że przykładowa aplikacja jest dostępna. Na przykład:

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

Upewnij się, że strona produktu przykładowej aplikacji jest dostępna. Oczekiwane dane wyjściowe to:

<title>Simple Bookstore App</title>

Włączanie wewnętrznej bramy ruchu przychodzącego

Użyj az aks mesh enable-ingress-gateway polecenia , aby włączyć wewnętrzny ruch przychodzący istio w klastrze usługi AKS:

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

Użyj kubectl get svc polecenia , aby sprawdzić usługę zamapowana na bramę ruchu przychodzącego:

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

Zwróć uwagę na dane wyjściowe, że zewnętrzny adres IP usługi nie jest publicznie dostępny i jest dostępny tylko lokalnie:

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

Aplikacje nie są mapowane na bramę ruchu przychodzącego Istio po włączeniu bramy ruchu przychodzącego. Użyj następującego manifestu, aby zamapować ruch przychodzący przykładowego wdrożenia na bramę ruchu przychodzącego Istio:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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

Uwaga

Selektor używany w obiekcie bramy wskazuje istio: aks-istio-ingressgateway-internalelement , który można znaleźć jako etykietę w usłudze zamapowanej na wewnętrzny ruch przychodzący, który został włączony wcześniej.

Ustaw zmienne środowiskowe dla wewnętrznego hosta i portów ruchu przychodzącego:

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

Pobierz adres przykładowej aplikacji:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

Przejdź do adresu URL z danych wyjściowych poprzedniego polecenia i upewnij się, że strona produktu przykładowej aplikacji nie jest wyświetlana. Alternatywnie możesz również użyć curl polecenia , aby potwierdzić, że przykładowa aplikacja nie jest dostępna. Na przykład:

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

Użyj kubectl exec polecenia , aby potwierdzić, że aplikacja jest dostępna z poziomu sieci wirtualnej klastra:

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>"

Upewnij się, że strona produktu przykładowej aplikacji jest dostępna. Oczekiwane dane wyjściowe to:

<title>Simple Bookstore App</title>

Usuwanie zasobów

Jeśli chcesz wyczyścić siatkę usługi Istio i ruch przychodzący (pozostawiając za klastrem), uruchom następujące polecenie:

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

Jeśli chcesz wyczyścić wszystkie zasoby utworzone na podstawie dokumentów z instrukcjami istio, uruchom następujące polecenie:

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

Następne kroki