Gateways mit Istio-APIs installieren und aktualisieren
Mit Cloud Service Mesh können Sie Gateways als Teil Ihres Service Mesh bereitstellen und verwalten. Ein Gateway beschreibt einen Load-Balancer, der am Rand des Mesh-Netzwerks ausgeführt wird und eingehende oder ausgehende HTTP/TCP-Verbindungen empfängt. Gateways werden hauptsächlich zum Verwalten des eingehenden Traffics verwendet. Sie können jedoch auch Gateways konfigurieren, um andere Arten von Traffic zu verwalten.
Gateways für ausgehenden Traffic: Mit einem Gateway für ausgehenden Traffic können Sie einen dedizierten Ausgangsknoten für den Traffic konfigurieren, der das Mesh-Netzwerk verlässt, und einschränken, welche Dienste auf externe Netzwerke zugreifen können. Außerdem können Sie damit den ausgehenden Traffic sicher steuern, um Ihrem Mesh beispielsweise mehr Sicherheit hinzuzufügen.
Ingress-Gateways: Mit einem Ingress-Gateway können Sie einen dedizierten Eingangsknoten konfigurieren, um eingehende HTTP/TCP-Verbindungen zu empfangen.
East-west-Gateways: Ein Proxy für East-West Traffic, damit Dienstarbeitslasten über Clustergrenzen in einem Multi-Primary-Mesh in verschiedenen Netzwerken kommunizieren können. Standardmäßig ist dieses Gateway im Internet öffentlich zugänglich.
Auf dieser Seite finden Sie Best Practices zum Bereitstellen und Aktualisieren der Gateway-Proxys sowie Beispiele zum Konfigurieren Ihrer eigenen Gateway-Proxys istio-ingressgateway und istio-egressgateway.
Sie können Gateways auf verschiedene Arten bereitstellen und mehrere Topologien innerhalb desselben Clusters verwenden. Weitere Informationen zu diesen Topologien finden Sie in der Istio-Dokumentation unter Topologien für die Bereitstellung von Gateways.
Best Practices für die Bereitstellung von Gateways
Die Best Practices für die Bereitstellung von Gateways hängen davon ab, ob Sie die verwaltete Datenebene oder die nicht verwaltete Datenebene verwenden.
Best Practices für verwaltete Datenebenen
- Aktivieren Sie die verwaltete Datenebene.
- Fügen Sie einem Namespace ein verwaltetes Überarbeitungslabel hinzu.
- Steuerungsebene und Gateways separat bereitstellen und verwalten.
- Als Best Practice für die Sicherheit sollten Sie Gateways in einem anderen Namespace als die Steuerungsebene bereitstellen.
- Verwenden Sie die automatische Sidecar-Einfügung (automatische Einfügung), um die Proxykonfiguration für die Gateways ähnlich wie die Sidecar-Proxys für Ihre Dienste einzufügen.
Diese Best Practices:
- Achten Sie darauf, dass Ihre verwalteten Gateways automatisch mit den neuesten Verbesserungen und Sicherheitsupdates auf dem neuesten Stand sind.
- Verlagerung der Verwaltung und Wartung von Gatewayinstanzen auf von Cloud Service Mesh verwaltete Datenebenen.
Best Practices für nicht verwaltete Datenebenen
- Steuerungsebene und Gateways separat bereitstellen und verwalten.
- Als Best Practice für die Sicherheit sollten Sie Gateways in einem anderen Namespace als die Steuerungsebene bereitstellen.
- Verwenden Sie die automatische Sidecar-Einfügung (automatische Einfügung), um die Proxykonfiguration für die Gateways ähnlich wie die Sidecar-Proxys für Ihre Dienste einzufügen.
Diese Best Practices:
- Lassen Sie Gateways von Ihren Namespace-Administratoren verwalten, ohne erweiterte Berechtigungen für Ihren gesamten Cluster zu benötigen.
- Administratoren können dieselben Bereitstellungstools oder Mechanismen verwenden, die sie zum Verwalten von Kubernetes-Anwendungen für die Bereitstellung und Verwaltung von Gateways verwenden.
- Geben Sie Administratoren die volle Kontrolle über die Gatewaybereitstellung und vereinfachen Sie auch die Vorgänge. Wenn ein neues Upgrade verfügbar ist oder sich eine Konfiguration geändert hat, starten Administratoren Gateway-Pods neu, um sie zu aktualisieren. Das Ausführen einer Gateway-Bereitstellung entspricht somit dem Ausführen von Sidecar-Proxys für Ihre Dienste.
Beispielgateway bereitstellen
Um Nutzer mit vorhandenen Bereitstellungstools zu unterstützen, unterstützt Cloud Service Mesh die
Bereitstellung eines Gateways auf dieselbe Weise wie
Istio:
IstioOperator, Helm und Kubernetes YAML. Jede Methode führt zu demselben Ergebnis. Sie können zwar die Methode auswählen, die Sie am häufigsten verwenden, wir empfehlen jedoch, die YAML-Methode von Kubernetes zu verwenden, da sie einfacher zu ändern ist und hydrierte Manifeste in der Versionsverwaltung gespeichert werden können.
Die folgenden Schritte zeigen, wie Sie ein Beispielgateway bereitstellen.
Erstellen Sie einen Namespace für das Gateway, falls Sie noch keinen haben. Ersetzen Sie
GATEWAY_NAMESPACEdurch den Namen Ihres Namespace.kubectl create namespace GATEWAY_NAMESPACEAktivieren Sie den Namespace für die Injektion. Die Schritte hängen von Ihrer Implementierung der Steuerungsebene ab.
Verwaltet (TD)
- Wenden Sie das Standard-Einschleusungslabel auf den Namespace an.
kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev- istio-injection=enabled --overwriteVerwaltet (Istiod)
Empfohlen: Führen Sie den folgenden Befehl aus, um das Standard-Injektionslabel auf den Namespace anzuwenden:
kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev- istio-injection=enabled --overwriteFür vorhandene Nutzer der verwalteten Istiod-Steuerungsebene: Wir empfehlen die Verwendung der Standardeinschleusung. Die versionsbasierte Einschleusung wird jedoch auch unterstützt. Gehen Sie so vor:
Führen Sie folgenden Befehl aus, um die verfügbaren Release-Versionen zu finden:
kubectl -n istio-system get controlplanerevisionDie Ausgabe sieht etwa so aus:
NAME AGE asm-managed-rapid 6d7hHINWEIS: Wenn in der oberen Liste zwei Versionen der Steuerungsebene angezeigt werden, entfernen Sie eine. Im Cluster werden nicht mehrere Versionen der Steuerungsebene unterstützt.
In der Ausgabe ist der Wert in der Spalte
NAMEdas Versionslabel für die verfügbare Release-Version der Cloud Service Mesh-Version.Wenden Sie das Versionslabel auf den Namespace an.
kubectl label namespace GATEWAY_NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Clusterintern
Empfohlen: Führen Sie den folgenden Befehl aus, um das Standard-Einschleusungslabel auf den Namespace anzuwenden:
kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev- istio-injection=enabled --overwriteWir empfehlen die Standardeinschleusung. Die versionsbasierte Einschleusung wird jedoch auch unterstützt. Gehen Sie so vor:
Verwenden Sie den folgenden Befehl, um das Versionslabel für
istiodzu finden:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'Wenden Sie das Überarbeitungslabel auf den Namespace an. Im folgenden Befehl ist
REVISION_LABELder Wert desistiod-Überarbeitungslabels, den Sie im vorherigen Schritt notiert haben.kubectl label namespace GATEWAY_NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Kopieren Sie die Konfigurationsdateien für die Beispielgateways aus dem
anthos-service-meshRepository.Ändern Sie das Verzeichnis in das Verzeichnis
samples. Führen Sie den Befehllsaus, um den Verzeichnisinhalt aufzulisten und zu bestätigen, dass ein Verzeichnisgateways(auf das Sie im nächsten Schritt zugreifen) und ein Verzeichnisonline-boutiquevorhanden sind.Stellen Sie ein Ingress- oder Egress-Gateway bereit. Diese befinden sich im Verzeichnis
samples/gateways/oder können nach Bedarf geändert werden.Eingehender Traffic
kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-ingressgatewayAusgehender Traffic
kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-egressgatewayPrüfen Sie nach dem Ausführen der Bereitstellung, ob die neuen Dienste ordnungsgemäß funktionieren:
kubectl get pod,service -n GATEWAY_NAMESPACEÜberprüfen Sie, ob die Ausgabe in etwa so aussieht:
NAME READY STATUS RESTARTS AGE pod/istio-ingressgateway-856b7c77-bdb77 1/1 Running 0 3s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/istio-ingressgateway LoadBalancer 10.24.5.129 34.82.157.6 80:31904/TCP 3s
Verwalten Sie Gateway-Ressourcen wie jede andere Kubernetes-Anwendung. Die Beispiele im Repository anthos-service-mesh-packages dienen als Anleitung und Schnellstart. Passen Sie sie nach Bedarf an.
Gateway-Selektoren
Sie wenden eine
Gateway
Konfiguration auf die istio-ingressgateway und istio-egressgateway Proxys an, um
eingehenden und ausgehenden Traffic für Ihr Mesh zu verwalten. Dadurch können Sie angeben, welcher
Traffic in das Mesh ein- und ausgehen darf. Die Labels in den Pods einer Gateway-Bereitstellung werden von den Gateway-Konfigurationsressourcen verwendet. Daher ist es wichtig, dass Ihre Gateway-Auswahl mit diesen Labels übereinstimmt.
In den vorherigen Bereitstellungen ist das Label istio=ingressgateway beispielsweise auf den Gateway-Pods festgelegt. Wenn Sie eine Gateway-Konfiguration auf diese Bereitstellungen anwenden möchten, müssen Sie dasselbe Label auswählen:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: gateway
spec:
selector:
istio: ingressgateway
...
Ein Beispiel für eine Gateway-Konfiguration und einen virtuellen Dienst, siehe frontend.yaml in der Beispielanwendung "Online Boutique".
Upgrade für Gateways durchführen
Direkte Upgrades
In den meisten Anwendungsfällen sollten Sie ein Upgrade Ihrer Gateways nach dem Muster für direkte Upgrades ausführen. Da Gateways die Pod-Injektion verwenden, werden neu erstellte Gateway-Pods automatisch mit der neuesten Konfiguration eingefügt, die die Version enthält.
Wenn Sie die vom Gateway verwendete Überarbeitung der Steuerungsebene ändern möchten, können Sie das Label istio.io/rev in der Gateway-Bereitstellung festlegen. Dadurch wird auch ein rollierender Neustart ausgelöst.
Verwaltete Steuerungsebene
Da Google die Upgrades der Steuerungsebene für die verwaltete Steuerungsebene verwaltet, können Sie die Gateway-Bereitstellung einfach neu starten. Die neuen Pods werden automatisch mit der neuesten Konfiguration und Version eingefügt.
kubectl rollout restart deployment istio-ingressgateway \
-n GATEWAY_NAMESPACE
Clusterinterne Steuerungsebene
Um dasselbe Muster auf Ihre Gateways anzuwenden, wenn die Steuerungsebene clusterintern ist, müssen Sie die vom Gateway verwendete Überarbeitung der Steuerungsebene ändern.
Legen Sie das Label istio.io/rev auf die Gateway-Bereitstellung fest, um einen rollierenden Neustart auszulösen. Die erforderlichen Schritte hängen davon ab, ob Sie das Überarbeitungslabel für den Namespace und/oder den Gateway-Pod aktualisieren müssen.
Wenn Sie den Namespace für die Injektion mit einem Label versehen haben, legen Sie das Label
istio.io/revfür den Namespace auf den neuen Überarbeitungswert fest:kubectl label namespace GATEWAY_NAMESPACE \ istio-injection- istio.io/rev=REVISION \ --overwriteWenn Sie die Injektion nur für den Gateway-Pod aktiviert haben, legen Sie das Label
istio.io/revfür die Bereitstellung auf den neuen Überarbeitungswert fest, wie in der folgenden Kubernetes-YAML-Datei:cat <<EOF > gateway-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: istio-ingressgateway namespace: GATEWAY_NAMESPACE spec: selector: matchLabels: istio: ingressgateway template: metadata: annotations: # This is required to tell Cloud Service Mesh to inject the gateway with the # required configuration. inject.istio.io/templates: gateway labels: istio: ingressgateway istio.io/rev: REVISION spec: containers: - name: istio-proxy image: auto # The image will automatically update each time the pod starts. EOF kubectl apply -f gateway-deployment.yaml
Canary-Upgrades (erweitert)
Wenn Sie die Steuerungsebene im Cluster verwenden und die Einführung einer neuen Überarbeitung der Steuerungsebene langsamer steuern möchten, können Sie das Canary-Upgrade-Muster verwenden. Sie können mehrere Versionen einer Gateway-Bereitstellung ausführen und dafür sorgen, dass bei einem Teil Ihres Traffics alles wie erwartet funktioniert. Wenn Sie beispielsweise
eine neue Überarbeitung (Canary) einführen möchten, erstellen Sie eine Kopie der Gateway-
Bereitstellung. Geben Sie dabei für die neue Überarbeitung das Label istio.io/rev=REVISION an und legen Sie einen neuen Namen fest. Beispiel: istio-ingressgateway-canary:
apiVersion: apps/v1
kind: Deployment
metadata:
name: istio-ingressgateway-canary
namespace: GATEWAY_NAMESPACE
spec:
selector:
matchLabels:
istio: ingressgateway
template:
metadata:
annotations:
inject.istio.io/templates: gateway
labels:
istio: ingressgateway
istio.io/rev: REVISION # Set to the control plane revision you want to deploy
spec:
containers:
- name: istio-proxy
image: auto
Mit dieser Bereitstellung haben Sie zwei Versionen des Gateways, die beide vom selben Dienst ausgewählt werden:
kubectl get endpoints -o
"custom-columns=NAME:.metadata.name,PODS:.subsets[*].addresses[*].targetRef.name"
NAME PODS
istio-ingressgateway istio-ingressgateway-788854c955-8gv96,istio-ingressgateway-canary-b78944cbd-mq2qf
Wenn Sie sicher sind, dass Ihre Anwendungen wie erwartet funktionieren, führen Sie den folgenden Befehl aus, um zur neuen Version zu wechseln. Löschen Sie dazu die Bereitstellung mit dem alten istio.io/rev-Labelsatz:
kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE
Wenn beim Testen Ihrer Anwendung mit der neuen Version des Gateways ein Problem aufgetreten ist, führen Sie diesen Befehl aus, um zur alten Version zurückzukehren. Löschen Sie dazu die Bereitstellung mit dem neuen istio.io/rev-Labelsatz:
kubectl delete deploy/istio-ingressgateway-canary -n GATEWAY_NAMESPACE
Erweiterte Konfiguration
Gateways bereitstellen, die TLS-Traffic beenden
Weitere Informationen finden Sie unter TLS-Terminierung im Ingress-Gateway einrichten.
Mindestversion für TLS für Gateways konfigurieren
Für Cloud Service Mesh ist die standardmäßige Mindestversion für TLS für Gatewayserver 1.2.
Sie können die Mindestversion für TLS mit dem Feld minProtocolVersion konfigurieren.
Weitere Informationen finden Sie unter
ServerTLSSettings.
Nicht unterstützte Funktionen
Wenn Sie die TRAFFIC_DIRECTOR
Steuerungsebene verwenden, werden
die folgenden Felder oder Werte in Gateway nicht unterstützt:
- ServerTLSSettings.TLSmode mit dem Wert
AUTO_PASSTHROUGH - ServerTLSSettings.verifyCertificateSpki
- ServerTLSSettings.verifyCertificateHash
Fehlerbehebung bei Gateways
Fehler beim Aktualisieren des Gateway-Images von auto
Wenn Sie ein Gateway bereitstellen oder aktualisieren, fügt Cloud Service Mesh auto als Platzhalter in das Feld image ein. Nach dem Aufruf eines mutierenden Webhooks ersetzt Cloud Service Mesh diesen Platzhalter automatisch durch das tatsächliche Cloud Service Mesh-Proxy-Image. Wenn der Aufruf des mutierenden Webhooks fehlschlägt, bleibt der Platzhalter auto bestehen und der Container wird nicht gefunden. Dies wird in der Regel durch ein falsches Namespace-Label verursacht. Konfigurieren Sie den richtigen Namespace und stellen Sie das Gateway dann noch einmal bereit oder aktualisieren Sie es.