Share via


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

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

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

Anwendungen werden nach dem Aktivieren des Eingangsgateways nicht dem Istio-Eingangsgateway zugeordnet. Verwenden Sie das folgende Manifest, um das Eingangsgateway der Beispielbereitstellung dem Istio-Eingangsgateway zuzuordnen:

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

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>

Löschen von Ressourcen

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