Udostępnij za pośrednictwem


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

Uwaga

Dostosowania adresu IP w bramach wewnętrznych i zewnętrznych nie są jeszcze obsługiwane. Dostosowania adresów IP w specyfikacji ruchu przychodzącego są przywracane przez dodatek Istio. Planowane jest zezwolenie na te dostosowania w implementacji interfejsu API bramy dla dodatku Istio w przyszłości.

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

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

Po włączeniu bramy ruchu przychodzącego należy odpowiednio skonfigurować aplikacje za pośrednictwem bramy i reguł routingu. 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/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

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>

Dostosowywanie adnotacji usługi bramy ruchu przychodzącego

Następujące adnotacje można dodać do usługi Kubernetes dla bram zewnętrznych i wewnętrznych ruchu przychodzącego:

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: aby powiązać wewnętrzną bramę ruchu przychodzącego z określoną podsiecią.
  • service.beta.kubernetes.io/azure-shared-securityrule: do uwidaczniania bramy ruchu przychodzącego za pomocą rozszerzonej reguły zabezpieczeń.
  • service.beta.kubernetes.io/azure-allowed-service-tags: w celu określenia, z których tagów usługi brama ruchu przychodzącego może odbierać żądania.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: do konfigurowania statycznego adresu IPv4.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: do określania grupy zasobów publicznego adresu IP w innej grupie zasobów z klastra.
  • service.beta.kubernetes.io/azure-pip-name: do określania nazwy publicznego adresu IP.

Usuwanie zasobów

Jeśli chcesz wyczyścić zewnętrzne lub wewnętrzne bramy ruchu przychodzącego Istio, ale pozostaw włączoną siatkę w klastrze, uruchom następujące polecenie:

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

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

Uwaga

Jeśli wystąpią problemy z wdrażaniem bramy ruchu przychodzącego Istio lub konfigurowaniem routingu ruchu przychodzącego, zapoznaj się z artykułem dotyczącym rozwiązywania problemów z bramami ruchu przychodzącego dodatku Istio