Freigeben über


Bereitstellen von externen oder internen Eingangsgateways für Istio-Dienstnetz-Add-On in Azure Kubernetes Service (AKS)

In diesem Artikel wird gezeigt, wie Sie externe oder interne Eingangsgateways für das Istio-Dienstnetz-Add-On für Azure Kubernetes Service-Cluster (AKS) bereitstellen.

Hinweis

Beim Ausführen eines kleineren Revisionsupgrades des Istio-Add-Ons wird eine weitere Bereitstellung für die externen/internen Gateways für die neue Revision der Steuerungsebene erstellt.

Voraussetzungen

In diesem Leitfaden wird davon ausgegangen, dass Sie die Dokumentation befolgt haben, um das Istio-Add-On für einen AKS-Cluster zu aktivieren, eine Beispielanwendung bereitzustellen und Umgebungsvariablen festzulegen.

Aktivieren des externen Eingangsgateways

Verwenden Sie az aks mesh enable-ingress-gateway, um ein extern zugängliches Istio-Eingangsgateway in Ihrem AKS-Cluster zu aktivieren:

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

Verwenden Sie kubectl get svc, um den Dienst zu überprüfen, der dem Eingangsgateway zugeordnet ist:

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

Beachten Sie in der Ausgabe, dass die externe IP-Adresse des Diensts öffentlich zugänglich ist:

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

Hinweis

Anpassungen an die IP-Adresse auf internen und externen Gateways werden noch nicht unterstützt. IP-Adressanpassungen in den Eingangsspezifikationen werden vom Istio-Add-On zurückgesetzt. Es ist geplant, diese Anpassungen in der Gateway-API-Implementierung für das Istio-Add-On in Zukunft zuzulassen.

Auf Anwendungen kann standardmäßig von außerhalb des Clusters zugegriffen werden, nachdem das Eingangsgateway aktiviert wurde. Um eine Anwendung zugänglich zu machen, ordnen Sie das Eingangsgateway der Beispielbereitstellung mithilfe des folgenden Manifests dem Istio-Eingangsgateway zu:

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

Hinweis

Der im Gatewayobjekt verwendete Selektor verweist auf istio: aks-istio-ingressgateway-external. Diese Zeichenfolge finden Sie als Bezeichnung in dem Dienst, der dem zuvor aktivierten externen Eingangsgateway zugeordnet ist.

Legen Sie Umgebungsvariablen für den Host und die Ports des externen Eingangsgateways fest:

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

Rufen Sie die externe Adresse der Beispielanwendung ab:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Navigieren Sie zur URL aus der Ausgabe des vorherigen Befehls, und vergewissern Sie sich, dass die Produktseite der Beispielanwendung angezeigt wird. Alternativ können Sie auch curl verwenden, um zu überprüfen, ob auf die Beispielanwendung zugegriffen werden kann. Beispiel:

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

Vergewissern Sie sich, dass auf die Produktseite der Beispielanwendung zugegriffen werden kann. Die erwartete Ausgabe lautet:

<title>Simple Bookstore App</title>

Aktivieren des internen Eingangsgateways

Verwenden Sie az aks mesh enable-ingress-gateway, um ein internes Istio-Eingangsgateway in Ihrem AKS-Cluster zu aktivieren:

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

Verwenden Sie kubectl get svc, um den Dienst zu überprüfen, der dem Eingangsgateway zugeordnet ist:

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

Beachten Sie in der Ausgabe, dass die externe IP-Adresse des Diensts nicht öffentlich, sondern nur lokal zugänglich ist:

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

Nach dem Aktivieren des Eingangsgateways müssen Anwendungen über das Gateway verfügbar gemacht werden, und Routingregeln müssen entsprechend konfiguriert werden. Verwenden Sie das folgende Manifest, um das Eingangsgateway der Beispielbereitstellung dem Istio-Eingangsgateway zuzuordnen:

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

Hinweis

Der im Gatewayobjekt verwendete Selektor verweist auf istio: aks-istio-ingressgateway-internal. Diese Zeichenfolge finden Sie als Bezeichnung in dem Dienst, der dem zuvor aktivierten internen Eingangsgateway zugeordnet ist.

Legen Sie Umgebungsvariablen für den Host und die Ports des internen Eingangsgateways fest:

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

Rufen Sie die Adresse der Beispielanwendung ab:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

Navigieren Sie zur URL aus der Ausgabe des vorherigen Befehls, und vergewissern Sie sich, dass die Produktseite der Beispielanwendung NICHT angezeigt wird. Alternativ können Sie auch curl verwenden, um sicherzustellen, dass auf die Beispielanwendung NICHT zugegriffen werden kann. Beispiel:

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

Vergewissern Sie sich mithilfe von kubectl exec, dass auf die Anwendung von innerhalb des virtuellen Netzwerks des Clusters zugegriffen werden kann:

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

Vergewissern Sie sich, dass auf die Produktseite der Beispielanwendung zugegriffen werden kann. Die erwartete Ausgabe lautet:

<title>Simple Bookstore App</title>

Anpassung der Dienstanmerkungen für das Eingangsgateway

Die folgenden Anmerkungen können dem Kubernetes-Dienst für die externen und internen Eingangsgateways hinzugefügt werden:

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: Zum Binden eines internen Eingangsgateways an ein bestimmtes Subnetz.
  • service.beta.kubernetes.io/azure-shared-securityrule: Zum Verfügbarmachen des Eingangsgateways über eine ergänzte Sicherheitsregel.
  • service.beta.kubernetes.io/azure-allowed-service-tags: Zur Angabe, von welchen Diensttags das Eingangsgateway Anforderungen empfangen kann.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: Zum Konfigurieren einer statischen IPv4-Adresse.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: Zum Angeben der Ressourcengruppe einer öffentlichen IP-Adresse in einer anderen Ressourcengruppe als der des Clusters.
  • service.beta.kubernetes.io/azure-pip-name: Zum Angeben des Namens einer öffentlichen IP-Adresse.

Löschen von Ressourcen

Wenn Sie die externen oder internen Istio-Gateways bereinigen möchten, aber das Gitter auf dem Cluster aktiviert lassen möchten, führen Sie den folgenden Befehl aus:

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

Wenn Sie das Istio-Dienstnetz und die Eingangsgateways bereinigen (und den Cluster zurücklassen) möchten, führen Sie den folgenden Befehl aus:

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

Wenn Sie alle Ressourcen bereinigen möchten, die in den Istio-Anleitungsdokumenten erstellt wurden, führen Sie den folgenden Befehl aus:

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

Nächste Schritte

Hinweis

Bei Problemen bei der Bereitstellung des Istio-Eingangsgateways oder beim Konfigurieren des Eingehenden Datenverkehrsroutings finden Sie im Artikel zur Problembehandlung von Istio-Add-On-Eingangsgateways