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
Azure Kubernetes Service