Diese Seite bietet eine umfassende Übersicht über die in Google Cloud unterstützten und konfigurierbaren Einstellungen von Kubernetes Ingress.
Funktionsvergleich
Die folgende Tabelle enthält eine Liste der in Google Cloud unterstützten Features für Ingress. Die Verfügbarkeit der Funktion, General Availability (GA) oder Beta, wird ebenfalls angegeben.
Ingress-Klasse | Externer Ingress | Interner Ingress | Multi-Cluster-Ingress | ||
---|---|---|---|---|---|
Ingress-Controller | Von Google gehosteter Ingress-Controller | GKE-Ingress-Controller | |||
Typ des Google Cloud-Load-Balancers | Externer HTTP(S)-Load-Balancer | Interner HTTP(S)-Load-Balancer | Externer HTTP(S)-Load-Balancer | ||
Clusterbereich | Einzelner Cluster | Einzelner Cluster | Multi-Cluster | ||
Load-Balancer-Bereich | Global | Regional | Global | ||
Umgebungsunterstützung | GKE | GKE | GKE | ||
Unterstützung für freigegebene VPC | AV | AV | AV | ||
Dienstannotationen | |||||
Containernatives Load-Balancing (NEGs) | GA | GA | GA | ||
HTTPS vom Load-Balancer zu Back-Ends | GA | AV | GA | ||
HTTP/2 | GA | GA Nur TLS |
GA | ||
Ingress-Annotationen | |||||
Statische IP-Adressen | GA | GA | GA | ||
Auf Secrets beruhende Kubernetes-Zertifikate | GA | GA | GA | ||
Selbstverwaltete SSL-Zertifikate | GA | GA | GA | ||
Von Google verwaltete SSL-Zertifikate | GA | GA | |||
FrontendConfig | |||||
SSL-Richtlinie | GA | GA mit Gateway | GA | ||
HTTP-zu-HTTPS-Weiterleitung | GA
1.17.13-gke.2600+G |
GA | |||
BackendConfig | |||||
Zeitlimit für Back-End-Dienst | GA | GA | GA | ||
Cloud CDN | GA | GA | |||
Zeitlimit für Verbindungsausgleich | GA | GA | GA | ||
Benutzerdefinierte Konfiguration Load-Balancer-Systemdiagnosen | GA | GA | GA | ||
Google Cloud Armor-Sicherheitsrichtlinie | GA
1.19.10-gke.700G |
GA | |||
Konfiguration des HTTP-Zugriffs-Loggings | GA | GA | GA | ||
Identity-Aware Proxy (IAP) | GA | GA | GA | ||
Sitzungsaffinität | GA | GA | GA | ||
Benutzerdefinierte Anfrageheader | GA | GA | |||
Benutzerdefinierte Antwortheader | GA | GA |
B Dieses Feature ist in der Betaversion ab der angegebenen Version verfügbar. Features ohne aufgeführte Version werden für alle verfügbaren GKE- und GKE Enterprise-Versionen unterstützt.
G Dieses Feature wird als GA ab der angegebenen Version unterstützt.
Ingress mit dem Standardcontroller konfigurieren
Sie können LoadBalancer-Features nicht manuell mit dem Google Cloud SDK oder der Google Cloud Console konfigurieren. Sie müssen BackendConfig- oder FrontendConfig-Kubernetes-Ressourcen verwenden.
Wenn Sie einen Ingress mit dem Standardcontroller erstellen, können Sie den Typ des Load-Balancers (einen externen Anwendungs-Load-Balancer oder einen internen Anwendungs-Load-Balancer) mithilfe einer Annotation für das Ingress-Objekt auswählen. Sie können auswählen, ob GKE zonale NEGs erstellt oder Instanzgruppen verwendet, indem Sie für jedes Dienstobjekt eine Annotation verwenden.
Mithilfe von benutzerdefinierten Ressourcendefinitionen (CDRs) für FrontendConfig und BackendConfig können Sie den Load-Balancer weiter anpassen. Mit diesen CRDs können Sie zusätzliche Features des Load-Balancers hierarchischer definieren als Annotationen. Damit Sie Ingress (und diese CRDs) verwenden können, muss das HTTP-Load-Balancing-Add-on aktiviert sein. Für GKE-Cluster ist das HTTP-Load-Balancing standardmäßig aktiviert. Sie dürfen es nicht deaktivieren.
FrontendConfigs werden in einem Ingress-Objekt referenziert und können nur mit externen Ingress-Objekten verwendet werden. BackendConfigs werden von einem Dienstobjekt referenziert. Dieselben CRDs können aus Gründen der Konfigurationskonsistenz von mehreren Dienst- oder Ingress-Objekten referenziert werden. Die FrontendConfig- und BackendConfig-CRDs haben den gleichen Lebenszyklus wie die entsprechenden Ingress- und Dienstressourcen und werden häufig zusammen bereitgestellt.
Dies wird im folgenden Diagramm veranschaulicht:
Eine Annotation zu einem Ingress- oder MultiClusterIngress-Objekt verweist auf eine FrontendConfig-CRD. Die FrontendConfig-CRD verweist auf eine Google Cloud-SSL-Richtlinie.
Eine Annotation zu einem Dienst- oder MultiClusterService-Objekt verweist auf eine BackendConfig-CRD. Die BackendConfig-CRD gibt benutzerdefinierte Einstellungen für die Systemdiagnose des entsprechenden Back-End-Dienstes an.
FrontendConfig mit Ihrem Ingress verknüpfen
FrontendConfig kann nur mit externen Ingress-Objekten verwendet werden.
Sie können eine FrontendConfig mit einem Ingress oder einemMultiClusterIngress
verknüpfen.
Eingehender Traffic
Verwenden Sie die Annotation networking.gke.io/v1beta1.FrontendConfig
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
networking.gke.io/v1beta1.FrontendConfig: "FRONTENDCONFIG_NAME"
...
Ersetzen Sie FRONTENDCONFIG_NAME
durch den Namen Ihrer FrontendConfig.
MultiClusterIngress
Verwenden Sie die Annotation networking.gke.io/frontend-config
:
apiVersion: networking.gke.io/v1
kind: MultiClusterIngress
metadata:
annotations:
networking.gke.io/frontend-config: "FRONTENDCONFIG_NAME"
...
Ersetzen Sie FRONTENDCONFIG_NAME
durch den Namen Ihrer FrontendConfig.
BackendConfig mit Ihrem Ingress verknüpfen
Sie können die Annotation cloud.google.com/backend-config
oder beta.cloud.google.com/backend-config
verwenden, um den Namen einer BackendConfig anzugeben.
Gleiche BackendConfig für alle Service-Ports
Verwenden Sie in der Annotation den Schlüssel default
, um für alle Ports dieselbe BackendConfig zu verwenden. Der Ingress-Controller verwendet jedes Mal, wenn er einen Load-Balancer-Backend-Dienst zu erstellt, dieselbe BackendConfig, um auf einen der Ports des Service zu verweisen.
default
sowohl für Ingress- als auch für MultiClusterIngress-Ressourcen verwenden.
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"default": "my-backendconfig"}'
...
Eindeutige BackendConfig pro Service-Port
Sowohl für Ingress als auch für MultiClusterIngress können Sie eine benutzerdefinierte BackendConfig für einen oder mehrere Ports angeben, indem Sie einen Schlüssel verwenden, der mit dem Namen oder der Nummer des Ports übereinstimmt. Der Ingress-Controller verwendet die spezifische BackendConfig, wenn er einen Load-Balancer-Backend-Dienst für einen referenzierten Service-Port erstellt.GKE 1.16-gke.3 und höher
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"ports": {
"SERVICE_REFERENCE_A":"BACKENDCONFIG_REFERENCE_A",
"SERVICE_REFERENCE_B":"BACKENDCONFIG_REFERENCE_B"
}}'
spec:
ports:
- name: PORT_NAME_1
port: PORT_NUMBER_1
protocol: TCP
targetPort: 50000
- name: PORT_NAME_2
port: PORT_NUMBER_2
protocol: TCP
targetPort: 8080
...
Alle unterstützten Versionen
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"ports": {
PORT_NAME_1:"BACKENDCONFIG_REFERENCE_A",
PORT_NAME_2:"BACKENDCONFIG_REFERENCE_B"
}}'
spec:
ports:
- name: PORT_NAME_1
port: PORT_NUMBER_1
protocol: TCP
targetPort: 50000
- name: PORT_NAME_2
port: PORT_NUMBER_2
protocol: TCP
targetPort: 8080
...
Dabei gilt:
BACKENDCONFIG_REFERENCE_A
: der Name einer vorhandenen BackendConfig-Ressource.BACKENDCONFIG_REFERENCE_B
: der Name einer vorhandenen BackendConfig-Ressource.SERVICE_REFERENCE_A
: Verwenden Sie den Wert vonPORT_NUMBER_1
oderPORT_NAME_1
. Dies liegt daran, dass die BackendConfig-Annotation eines Service entweder auf den Namen des Ports (spec.ports[].name
) oder die Nummer des Ports (spec.ports[].port
) verweisen kann.SERVICE_REFERENCE_B
: Verwenden Sie den Wert vonPORT_NUMBER_2
oderPORT_NAME_2
. Dies liegt daran, dass die BackendConfig-Annotation eines Service entweder auf den Namen des Ports (spec.ports[].name
) oder die Nummer des Ports (spec.ports[].port
) verweisen kann.
Wenn Sie den Port des Service über die Nummer angeben, müssen Sie den Wert port
anstelle des Werts targetPort
verwenden. Die hier verwendete Portnummer dient nur zum Binden der BackendConfig. Der Port, an den der Load-Balancer Traffic oder Systemdiagnoseprüfungen sendet, wird nicht festgelegt:
Wenn Sie das containernative Load-Balancing verwenden, sendet der Load-Balancer Traffic an einen Endpunkt in einer Netzwerk-Endpunktgruppe (die einer Pod-IP-Adresse entspricht) am
targetPort
des referenzierten Service-Ports (der einemcontainerPort
für einen Bereitstellungs-Pod entsprechen muss). Andernfalls sendet der Load-Balancer Traffic an die IP-Adresse eines Knotens amnodePort
des referenzierten Service-Ports.Wenn Sie eine BackendConfig verwenden, um eine benutzerdefinierte Load-Balancer-Systemdiagnose bereitzustellen, kann die Portnummer, die Sie für die Systemdiagnose des Load-Balancers verwenden, von der
spec.ports[].port
-Nummer des Service abweichen. Weitere Informationen zu Portnummern für Systemdiagnosen finden Sie unter Benutzerdefinierte Systemdiagnosekonfiguration.
Ingress-Features über FrontendConfig-Parameter konfigurieren
Im folgenden Abschnitt erfahren Sie, wie Sie Ihre FrontendConfig so konfigurieren, dass bestimmte Ingress-Features aktiviert werden.
SSL-Richtlinien
Mit SSL-Richtlinien können Sie eine Reihe von TLS-Versionen und -Chiffren angeben, mit denen der Load-Balancer den HTTPS-Traffic von Clients beendet. Sie müssen zuerst außerhalb von GKE eine SSL-Richtlinie erstellen. Danach können Sie in einer FrontendConfig
-CRD darauf verweisen.
Das Feld sslPolicy
in FrontendConfig verweist auf den Namen einer SSL-Richtlinie im selben Google Cloud-Projekt wie der GKE-Cluster. Die SSL-Richtlinie wird an den Ziel-HTTPS-Proxy angehängt, der vom Ingress für den externen HTTP(S)-Load-Balancer erstellt wurde. Mehrere Ingress-Ressourcen können auf dieselbe FrontendConfig-Ressource und dieselbe SSL-Richtlinie verweisen. Wenn eine referenzierte SSL-Richtlinie geändert wird, wird die Änderung an die Google Front Ends (GFEs) übertragen, die Ihren vom Ingress erstellten externen HTTP(S)-Load-Balancer unterstützen.
Das folgende FrontendConfig-Manifest aktiviert eine SSL-Richtlinie mit dem Namen gke-ingress-ssl-policy
:
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: my-frontend-config
spec:
sslPolicy: gke-ingress-ssl-policy
HTTP-zu-HTTPS-Weiterleitungen
Ein externer HTTP-Load-Balancer kann unverschlüsselte HTTP-Anfragen an einen HTTPS-Load-Balancer weiterleiten, der dieselbe IP-Adresse verwendet. Wenn Sie ein Ingress mit HTTP-zu-HTTPS-Weiterleitungen erstellen, werden beide Load-Balancer automatisch erstellt. Anfragen an die externe IP-Adresse des Ingress an Port 80 werden automatisch an dieselbe externe IP-Adresse an Port 443 umgeleitet. Diese Funktion basiert auf HTTP-zu-HTTPS-Weiterleitungen, die durch Cloud Load Balancing bereitgestellt werden.
Damit die HTTP-zu-HTTPS-Weiterleitung unterstützen wird, muss ein Ingress konfiguriert werden, um sowohl HTTP- als auch HTTPS-Traffic bereitzustellen. Ist HTTP oder HTTPS deaktiviert, funktioniert die Weiterleitung nicht.
HTTP-zu-HTTPS-Weiterleitungen werden in einer benutzerdefinierten FrontendConfig
-Ressource mit dem Feld redirectToHttps
konfiguriert. Weiterleitungen sind für die gesamte Ingress-Ressource aktiviert, sodass für alle Dienste, auf die vom Ingress verwiesen wird, HTTPS-Weiterleitungen aktiviert sind.
Das folgende FrontendConfig
-Manifest aktiviert HTTP-zu-HTTPS-Weiterleitungen. Setzen Sie das Feld spec.redirectToHttps.enabled
auf true
, um HTTPS-Weiterleitungen zu aktivieren. Das Feld spec.responseCodeName
ist optional. Wenn es weggelassen wird, wird eine 301-Moved
Permanently
-Umleitung verwendet.
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: my-frontend-config
spec:
redirectToHttps:
enabled: true
responseCodeName: RESPONSE_CODE
Ersetzen Sie RESPONSE_CODE
durch einen der folgenden Werte:
MOVED_PERMANENTLY_DEFAULT
, um einen Weiterleitungs-Antwortcode 301 zurückzugeben (Standardwert, wennresponseCodeName
nicht angegeben ist).FOUND
, um einen Weiterleitungs-Antwortcode 302 zurückzugeben.SEE_OTHER
, um einen Weiterleitungs-Antwortcode 303 zurückzugeben.TEMPORARY_REDIRECT
, um einen Weiterleitungs-Antwortcode 307 zurückzugeben.PERMANENT_REDIRECT
, um einen Weiterleitungs-Antwortcode 308 zurückzugeben.
Wenn Weiterleitungen aktiviert sind, erstellt der Ingress-Controller einen Load-Balancer, wie im folgenden Diagramm dargestellt:
Prüfen Sie mit einem curl
-Befehl, ob Ihre Weiterleitung funktioniert:
curl http://IP_ADDRESS
Ersetzen Sie IP_ADDRESS
durch die IP-Adresse Ihres Ingress.
In der Antwort wird der von Ihnen konfigurierte Weiterleitungsantwortcode angezeigt. Das folgende Beispiel bezieht sich auf eine FrontendConfig
, die mit einer Weiterleitung vom Typ 301: MovedPermanently
konfiguriert ist:
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://35.244.160.59/">here</A>.</BODY></HTML>
Ingress-Features über BackendConfig-Parameter konfigurieren
In den folgenden Abschnitten wird gezeigt, wie Sie Ihre BackendConfig festlegen, um bestimmte Ingress-Features zu aktivieren. Änderungen an einer BackendConfig-Ressource werden ständig abgeglichen, sodass Sie Ihren Ingress nicht löschen und neu erstellen müssen, um zu sehen, dass BackendConfig-Änderungen übernommen werden.
Informationen zu BackendConfig-Einschränkungen finden Sie im Abschnitt Einschränkungen.
Zeitüberschreitung von Back-End-Dienst
Sie können mit BackendConfig ein Zeitlimit für den Back-End-Dienst in Sekunden festlegen. Wenn Sie keinen Wert angeben, beträgt der Standardwert 30 Sekunden.
Das folgende BackendConfig-Manifest gibt ein Zeitlimit von 40 Sekunden an:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
timeoutSec: 40
Cloud CDN
Sie können Cloud CDN mit einer BackendConfig aktivieren.
Das folgende BackendConfig-Manifest zeigt alle verfügbaren Felder, wenn Cloud CDN aktiviert wird:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
cdn:
enabled: CDN_ENABLED
cachePolicy:
includeHost: INCLUDE_HOST
includeProtocol: INCLUDE_PROTOCOL
includeQueryString: INCLUDE_QUERY_STRING
queryStringBlacklist: QUERY_STRING_DENYLIST
queryStringWhitelist: QUERY_STRING_ALLOWLIST
cacheMode: CACHE_MODE
clientTtl: CLIENT_TTL
defaultTtl: DEFAULT_TTL
maxTtl: MAX_TTL
negativeCaching: NEGATIVE_CACHING
negativeCachingPolicy:
code: NEGATIVE_CACHING_CODE
ttl: NEGATIVE_CACHING_TTL
requestCoalescing: REQ_COALESCING
serveWhileStale: SERVE_WHILE_STALE
signedUrlCacheMaxAgeSec: SIGNED_MAX_AGE
signedUrlKeys:
keyName: KEY_NAME
keyValue: KEY_VALUE
secretName: SECRET_NAME
Ersetzen Sie Folgendes:
CDN_ENABLED
: Wenn dieser Wert auftrue
gesetzt ist, wird Cloud CDN für dieses Ingress-Back-End aktiviert.INCLUDE_HOST
: Wenn dieser Wert auftrue
gesetzt ist, werden Anfragen an verschiedene Hosts getrennt im Cache gespeichert.INCLUDE_PROTOCOL
: Wenn dieser Wert auftrue
gesetzt ist, werden HTTP- und HTTPS-Anfragen getrennt im Cache gespeichert.INCLUDE_QUERY_STRING
: Wenn dieser Wert auftrue
gesetzt ist, sind Abfragestringparameter gemäßqueryStringBlacklist
oderqueryStringWhitelist
im Cache-Schlüssel enthalten. Wenn weder das eine noch das andere Feld festgelegt ist, wird der gesamte Abfragestring einbezogen. Beifalse
wird der gesamte Abfragestring aus dem Cache-Schlüssel ausgeschlossen.QUERY_STRING_DENYLIST
: Geben Sie ein String-Array mit den Namen von Abfragestringparametern an, die von Cache-Schlüsseln ausgeschlossen werden sollen. Alle anderen Parameter werden einbezogen. Sie könnenqueryStringBlacklist
oderqueryStringWhitelist
angeben, aber nicht beide.QUERY_STRING_ALLOWLIST
: Geben Sie ein String-Array mit den Namen der Abfragestringparameter an, die in Cache-Schlüssel einbezogen werden sollen. Alle anderen Parameter werden ausgeschlossen. Sie könnenqueryStringBlacklist
oderqueryStringWhitelist
angeben, aber nicht beide.
Die folgenden Felder werden nur in GKE-Versionen ab 1.23.3-gke.900 mit GKE Ingress unterstützt. Sie werden nicht mithilfe von Multi-Cluster-Ingress unterstützt:
CACHE_MODE
: Der Cache-Modus.CLIENT_TTL
,DEFAULT_TTL
undMAX_TTL
: TTL-Konfiguration. Weitere Informationen finden Sie unter TTL-Einstellungen und -Überschreibungen verwenden.NEGATIVE_CACHING
: Wenn dieser Wert auftrue
gesetzt ist, ist das negative Caching aktiviert. Weitere Informationen finden Sie unter Negatives Caching verwenden.NEGATIVE_CACHING_CODE
undNEGATIVE_CACHING_TTL
: Negative Caching-Konfiguration. Weitere Informationen finden Sie unter Negatives Caching verwenden.REQ_COALESCING
: Wenn dieser Wert auftrue
gesetzt ist, ist die Minimierung aktiviert. Weitere Informationen finden Sie unter Anfragen minimieren.SERVE_WHILE_STALE
: Zeit in Sekunden, nachdem die Antwort abgelaufen ist, dass Cloud CDN weiterhin eine veraltete Version bereitstellt. Weitere Informationen finden Sie unter Veraltete Inhalte bereitstellen.SIGNED_MAX_AGE
: Maximale Zeitantworten können in Sekunden im Cache gespeichert werden. Weitere Informationen finden Sie unter Optionale maximale Cache-Zeit anpassen.KEY_NAME
,KEY_VALUE
undSECRET_NAME
: Konfiguration des signierten URL-Schlüssels. Weitere Informationen finden Sie unter Signierte Anfrageschlüssel erstellen.
Erweitern Sie den folgenden Abschnitt, um ein Beispiel zu sehen, in dem Cloud CDN über Ingress bereitgestellt und dann validiert wird, dass die Anwendungsinhalte im Cache gespeichert werden.
Zeitlimit für Verbindungsausgleich
Sie können ein Zeitlimit für den Verbindungsausgleich mit einer BackendConfig konfigurieren. Das Zeitlimit für den Verbindungsausgleich ist die Zeit in Sekunden, die gewartet wird, bis die Verbindung beendet wird. Für die angegebene Dauer des Zeitlimits werden bestehende Anfragen an das Back-End, das entfernt wurde, abgeschlossen. Der Load-Balancer sendet keine neuen Anfragen an das entfernte Back-End. Nach Ablauf des Zeitlimits werden alle verbleibenden Verbindungen zum Back-End geschlossen. Das Zeitlimit kann zwischen 0 und 3.600 Sekunden liegen. Der Standardwert ist 0, wodurch auch der Verbindungsausgleich deaktiviert wird.
Das folgende BackendConfig-Manifest gibt ein Zeitlimit von 60 Sekunden für den Verbindungsausgleich an:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
connectionDraining:
drainingTimeoutSec: 60
Benutzerdefinierte Konfiguration für Systemdiagnosen
GKE bietet bei der Bereitstellung über Ingress verschiedene Methoden zur Konfiguration von Systemdiagnosen für den Google Cloud-Load-Balancer. Weitere Informationen zur Bereitstellung von Systemdiagnosen durch GKE Ingress finden Sie unter Ingress-Systemdiagnosen.
Mit einer BackendConfig können Sie die Einstellungen für die Load-Balancer-Systemdiagnose genau steuern.
Sie können mehrere GKE-Dienste so konfigurieren, dass sie auf dieselbe BackendConfig als wiederverwendbare Vorlage verweisen. Bei healthCheck
-Parametern wird für jeden Backend-Dienst, der einzelnen GKE-Diensten entspricht, eine eindeutige Google Cloud-Systemdiagnose erstellt.
Das folgende BackendConfig-Manifest zeigt alle verfügbaren Felder, wenn eine BackendConfig-Systemdiagnose konfiguriert wird:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
healthCheck:
checkIntervalSec: INTERVAL
timeoutSec: TIMEOUT
healthyThreshold: HEALTH_THRESHOLD
unhealthyThreshold: UNHEALTHY_THRESHOLD
type: PROTOCOL
requestPath: PATH
port: PORT
Ersetzen Sie Folgendes:
INTERVAL
: Geben Sie für alle Systemdiagnose-Prober dencheck-interval
in Sekunden an. Dies ist die Zeit vom Beginn der Prüfung eines Probers bis zum Start der nächsten Prüfung. Wenn Sie diesen Parameter weglassen, wird der Google Cloud-Standardwert von 5 Sekunden verwendet. Weitere Implementierungsdetails finden Sie unter Mehrere Prüfungen und Häufigkeit.TIMEOUT
: Geben Sie an, wie lange Google Cloud bei einer Prüfung auf eine Antwort wartet. Der Wert vonTIMEOUT
muss kleiner oder gleich dem vonINTERVAL
sein. Die Einheit sind Sekunden. Bei jeder Prüfung muss vor Ablauf des Zeitlimits einHTTP 200 (OK)
-Antwortcode gesendet werden.HEALTH_THRESHOLD
undUNHEALTHY_THRESHOLD
: Geben Sie die Anzahl der aufeinanderfolgenden Verbindungsversuche an, die für mindestens einen Prober erfolgreich oder fehlgeschlagen sein müssen, um den Systemstatus von "fehlerfrei" in "fehlerhaft" oder umgekehrt zu ändern. Wenn Sie einen dieser Parameter weglassen, verwendet Google Cloud den Standardwert 2.PROTOCOL
: Geben Sie ein Protokoll an, das von Prüfsystemen für Systemdiagnosen verwendet wird. DieBackendConfig
unterstützt nur das Erstellen von Systemdiagnosen mit den Protokollen HTTP, HTTPS oder HTTP2. Weitere Informationen finden Sie unter Erfolgskriterien für HTTP, HTTPS und HTTP/2. Sie können diesen Parameter nicht weglassen.PATH
: Geben Sie für HTTP-, HTTPS- oder HTTP2-Systemdiagnosen denrequest-path
an, zu dem das Prüfsystem eine Verbindung herstellen soll. Wenn Sie diesen Parameter weglassen, verwendet Google Cloud den Standardwert/
.PORT
: Eine BackendConfig unterstützt nur die Angabe des Ports für die Load-Balancer-Systemdiagnose mithilfe einer Portnummer. Wenn Sie diesen Parameter weglassen, verwendet Google Cloud den Standardwert80
.Wenn Sie das containernative Load-Balancing verwenden, sollten Sie einen Port auswählen, der mit einem
containerPort
eines Bereitstellungs-Pods übereinstimmt (unabhängig davon, ob auf dencontainerPort
durch einentargetPort
des Service verwiesen wird). Da der Load-Balancer Prüfungen direkt an die IP-Adresse des Pods sendet, sind Sie nicht aufcontainerPort
s beschränkt, auf die vomtargetPort
eines Service verwiesen wird. Prüfsysteme für die Systemdiagnose stellen über den von Ihnen angegebenen Port eine Verbindung zur IP-Adresse eines bereitstellenden Pods her.Für Instanzgruppen-Back-Ends müssen Sie einen Port auswählen, der mit einem vom Service bereitgestellten
nodePort
übereinstimmt. Prüfsysteme für die Systemdiagnose stellen dann eine Verbindung zu jedem Knoten an diesem Port her.
Informationen zum Einrichten von GKE Ingress mit einer benutzerdefinierten HTTP-Systemdiagnose finden Sie unter GKE Ingress mit benutzerdefinierter HTTP-Systemdiagnose.
Ingress-Sicherheitsrichtlinie für Google Cloud Armor
Mit den Google Cloud Armor-Sicherheitsrichtlinien können Sie Ihre Anwendungen mit Load-Balancing vor Angriffen aus dem Web schützen. Wenn Sie eine Google Cloud Armor-Sicherheitsrichtlinie konfiguriert haben, können Sie mit einer BackendConfig darauf verweisen.
Fügen Sie der BackendConfig den Namen Ihrer Sicherheitsrichtlinie hinzu. Das folgende BackendConfig-Manifest gibt eine Sicherheitsrichtlinie mit dem Namen example-security-policy
an:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
namespace: cloud-armor-how-to
name: my-backendconfig
spec:
securityPolicy:
name: "example-security-policy"
Zwei Quellen der Wahrheit
Obwohl die zugrunde liegenden BackendService
APIs von Compute Engine über GKE konfiguriert wurden, können Sie weiterhin direkt ändern, welche Sicherheitsrichtlinie angewendet werden soll. Dadurch werden zwei "Sources of Truth" erstellt: GKE und Compute Engine. Das Verhalten des GKE-Ingress-Controllers als Reaktion auf das Feld securityPolicy
in BackendConfig
ist in der folgenden Tabelle dokumentiert. Zur Vermeidung von Konflikten und unerwartetem Verhalten empfehlen wir die Verwendung des GKE-BackendConfig
, um zu verwalten, welche Sicherheitsrichtlinie verwendet werden soll.
Feld "BackendConfig" | Wert | Verhalten |
---|---|---|
spec.securityPolicy.name |
CloudArmorPolicyName |
Der GKE Ingress-Controller legt die Google Cloud Armor-Richtlinie namens CloudArmorPolicyName auf den Load-Balancer fest. Der GKE-Ingress-Controller überschreibt die zuvor festgelegte Richtlinie. |
spec.securityPolicy.name |
Leerer String ("" ) |
Der GKE Ingress-Controller entfernt alle konfigurierten Google Cloud Armor-Richtlinien aus dem Load-Balancer. |
spec.securityPolicy |
nil |
Der GKE-Ingress-Controller verwendet die für das BackendService-Objekt festgelegte Konfiguration, die über die Compute Engine API mit der Google Cloud Console, der gcloud CLI oder Terraform konfiguriert wurde. |
Informationen zum Einrichten von GKE Ingress mit Google Cloud Armor-Schutz finden Sie unter Google Cloud Armor-fähiger Ingress.
HTTP-Zugriffs-Logging
Ingress kann alle HTTP-Anfragen von Clients in Cloud Logging protokollieren. Sie können das Zugriffs-Logging mit BackendConfig aktivieren und deaktivieren und die Stichprobenrate für das Zugriffs-Logging festlegen.
Verwenden Sie das Feld logging
in Ihrer BackendConfig, um das Zugriffs-Logging zu konfigurieren. Wenn logging
weggelassen wird, verwendet das Zugriffs-Logging das Standardverhalten. Dies hängt von der GKE-Version ab.
Sie können folgende Felder konfigurieren:
enable
: Wenn dieser Wert auftrue
gesetzt ist, wird das Zugriffs-Logging für diesen Ingress aktiviert und Logs sind in Cloud Logging verfügbar. Andernfalls ist das Zugriffs-Logging für diesen Ingress deaktiviert.sampleRate
: Geben Sie einen Wert zwischen 0,0 und 1,0 an, wobei 0,0 bedeutet, dass keine Pakete protokolliert, und 1,0, dass 100 % der Pakete protokolliert werden. Dieses Feld ist nur relevant, wennenable
auftrue
gesetzt ist.sampleRate
ist ein optionales Feld. Wenn es jedoch konfiguriert ist, muss auchenable: true
festgelegt werden, da es andernfalls alsenable: false
interpretiert wird.
Mit dem folgenden BackendConfig-Manifest wird das Zugriffs-Logging aktiviert und die Abtastrate auf 50 % der HTTP-Anfragen für eine bestimmte Ingress-Ressource festgelegt:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
logging:
enable: true
sampleRate: 0.5
Identity-Aware Proxy
Zur Konfiguration der BackendConfig für Identity-Aware Proxy IAP müssen Sie die Werte enabled
und secretName
für den Block iap
in Ihrer BackendConfig angeben. Sie benötigen die Berechtigung compute.backendServices.update
, um diese Werte anzugeben.
Das folgende BackendConfig-Manifest aktiviert Identity-Aware Proxy:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
iap:
enabled: true
oauthclientCredentials:
secretName: my-secret
IAP mit dem von Google verwalteten OAuth-Client aktivieren
Ab GKE 1.29.2-gke.1035000 kann IAP zur Verwendung des von Google verwalteten OAuth-Clients mit einer BackendConfig konfiguriert werden. Informationen dazu, ob Sie den Google OAuth-Client oder einen benutzerdefinierten OAuth-Client verwenden möchten, finden Sie in der IAP-Dokumentation unter Wann ist eine benutzerdefinierte OAuth-Konfiguration zu verwenden..
Geben Sie die OAuthCredentials nicht in der BackendConfig an, um IAP mit dem von Google verwalteten OAuth-Client zu aktivieren. Für Nutzer, die IAP bereits mit OAuthCredentials konfiguriert haben, gibt es keinen Migrationspfad, um zur Verwendung des Google Managed OAuth-Clients zu wechseln. Sie müssen das Back-End neu erstellen (den Dienst aus dem Ingress entfernen und wieder anhängen). Wir empfehlen, diesen Vorgang während eines Wartungsfensters auszuführen, da dies zu Ausfallzeiten führt. Umgekehrter Migrationspfad, der Wechsel von Google Managed OAuthClient zu OAuthCredentials ist möglich.
Das folgende BackendConfig-Manifest aktiviert Identity-Aware Proxy mit dem von Google verwalteten OAuth-Client:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
iap:
enabled: true
Eine vollständige Anleitung finden Sie in der IAP-Dokumentation unter IAP für GKE aktivieren.
Identity-Aware Proxy mit internem Ingress
Zum Konfigurieren des internen Ingress für IAP müssen Sie die Premium-Stufe verwenden. Wenn Sie die Premium-Stufe nicht verwenden, können Sie keine internen Anwendungs-Load-Balancer mit Identity-Aware Proxy anzeigen oder erstellen. Außerdem benötigen Sie ein BeyondCorp Enterprise-Abo, um den internen Ingress für IAP verwenden zu können.
Informationen zum Einrichten von sicherem GKE-Ingress mit Identity-Aware Proxy-basierter Authentifizierung finden Sie unter IAP-fähiger Ingress.
Sitzungsaffinität
Mit einer BackendConfig können Sie die Client-IP oder das generierte Cookie für die Sitzungsaffinität festlegen.
Client-IP-Affinität
Wenn Sie mit einer BackendConfig die Client-IP-Affinität festlegen möchten, legen Sie affinityType
wie im folgenden Beispiel auf "CLIENT_IP"
fest:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
sessionAffinity:
affinityType: "CLIENT_IP"
Generierte Cookie-Affinität
Wenn Sie eine BackendConfig verwenden möchten, um die generierte Cookie-Affinität festzulegen, setzen Sie affinityType
in Ihrem BackendConfig-Manifest auf GENERATED_COOKIE
. Sie können auch affinityCookieTtlSec
verwenden, um den Zeitraum festzulegen, für den das Cookie aktiv bleibt.
Das folgende Manifest legt den Affinitätstyp auf ein generiertes Cookie fest und weist den Cookies eine TTL von 50 Sekunden zu:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
sessionAffinity:
affinityType: "GENERATED_COOKIE"
affinityCookieTtlSec: 50
Benutzerdefinierte Anfrageheader
Mit BackendConfig lassen sich benutzerdefinierte Anfrage-Header konfigurieren. Der Load-Balancer fügt die von Ihnen angegebenen Header den Anfragen hinzu, die er an die Back-Ends weiterleitet.
Zum Aktivieren benutzerdefinierter Anfrageheader geben Sie im Attribut customRequestHeaders
der BackendConfig-Ressource eine Liste von Headern an. Geben Sie jeden Header als header-name:header-value
-String an.
Das folgende BackendConfig-Manifest fügt drei Anfrage-Header hinzu:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
customRequestHeaders:
headers:
- "X-Client-Region:{client_region}"
- "X-Client-City:{client_city}"
- "X-Client-CityLatLong:{client_city_lat_long}"
Benutzerdefinierte Antwortheader
Zum Aktivieren benutzerdefinierter Antwortheader geben Sie im Attribut customResponseHeaders
der BackendConfig-Ressource eine Liste von Headern an. Geben Sie jeden Header als header-name:header-value
-String an.
Das folgende BackendConfig-Manifest ist ein Beispiel für das Hinzufügen eines HSTS-Antwortheaders (HTTP Strict Transport Security):
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
customResponseHeaders:
headers:
- "Strict-Transport-Security: max-age=28800; includeSubDomains"
Übung: Ingress-Zeitlimits mit einem Back-End-Dienst festlegen
Die folgende Übung zeigt die Schritte, die zum Konfigurieren von Zeitlimits und eines Verbindungsausgleich mit einer Ingress-Ressource mit einer BackendConfig-Ressource erforderlich sind.
Führen Sie die folgenden Aufgaben aus, um die Back-End-Attribute einer Ingress-Ressource zu konfigurieren:
- Erstellen Sie ein Deployment.
- Erstellen Sie eine BackendConfig.
- Erstellen Sie einen Service und verknüpfen Sie einen seiner Ports mit der BackendConfig-Ressource.
- Erstellen Sie ein Ingress und ordnen Sie das Ingress dem Paar (Dienst, Port) zu.
- Prüfen Sie die Attribute des Back-End-Dienstes.
- Führen Sie eine Bereinigung durch.
Deployment erstellen
Erstellen Sie zuerst ein Deployment, bevor Sie eine BackendConfig und einen Dienst erstellen.
Das folgende Beispielmanifest gilt für ein Deployment mit dem Namen my-deployment.yaml
:
# my-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
purpose: bsc-config-demo
replicas: 2
template:
metadata:
labels:
purpose: bsc-config-demo
spec:
containers:
- name: hello-app-container
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
Erstellen Sie das Deployment mit dem folgenden Befehl:
kubectl apply -f my-deployment.yaml
BackendConfig-Ressource erstellen
Verwenden Sie Ihre BackendConfig, um die Ingress-Feature anzugeben, die Sie verwenden möchten.
Das BackendConfig-Manifest my-backendconfig.yaml
gibt Folgendes an:
- ein Zeitlimit von 40 Sekunden
- ein Zeitlimit für Verbindungsausgleich von 60 Sekunden
# my-backendconfig.yaml
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
timeoutSec: 40
connectionDraining:
drainingTimeoutSec: 60
Erstellen Sie die BackendConfig mit dem folgenden Befehl:
kubectl apply -f my-backendconfig.yaml
Dienst erstellen
Eine BackendConfig entspricht einer einzelnen Dienst-Port-Kombination, auch wenn ein Dienst mehrere Ports hat. Jeder Port kann einer einzelnen BackendConfig-CRD zugeordnet werden. Wenn ein Ingress auf einen Dienstport verweist und der Dienstport einer BackendConfig zugeordnet ist, übernimmt der Back-End-Dienst für HTTP(S)-Load-Balancing seine Konfiguration teilweise aus der BackendConfig.
Das folgende Beispiel zeigt das Dienstmanifest my-service.yaml
:
# my-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
purpose: bsc-config-demo
annotations:
cloud.google.com/backend-config: '{"ports": {"80":"my-backendconfig"}}'
cloud.google.com/neg: '{"ingress": true}'
spec:
type: ClusterIP
selector:
purpose: bsc-config-demo
ports:
- port: 80
protocol: TCP
targetPort: 8080
Die Annotation cloud.google.com/backend-config
gibt eine Zuordnung zwischen Ports und BackendConfig-Objekten an. In my-service.yaml
:
- Jeder Pod mit dem Label
purpose: bsc-config-demo
ist ein Mitglied des Dienstes. - TCP-Port 80 des Dienstes ist einem BackendConfig-Objekt mit dem Namen
my-backendconfig
zugeordnet. Dies wird durch die Annotationcloud.google.com/backend-config
angegeben. - Eine an Port 80 des Dienstes gesendete Anfrage wird an einen der Mitglieds-Pods an Port 8080 weitergeleitet.
Führen Sie den folgenden Befehl aus, um den Dienst zu erstellen:
kubectl apply -f my-service.yaml
Ingress erstellen
Im Folgenden sehen Sie ein Ingress-Manifest namens my-ingress.yaml.
. In diesem Beispiel werden eingehende Anfragen an Port 80 des Dienstes my-service
weitergeleitet.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: my-service
port:
number: 80
Führen Sie den folgenden Befehl aus, um das Ingress zu erstellen:
kubectl apply -f my-ingress.yaml
Warten Sie einige Minuten, bis der Ingress-Controller einen externen Anwendungs-Load-Balancer und einen zugehörigen Backend-Dienst konfiguriert hat. Sobald dies abgeschlossen ist, haben Sie Ihr Ingress so konfiguriert, dass ein Zeitlimit von 40 Sekunden und ein Zeitlimit für den Verbindungsausgleich von 60 Sekunden verwendet wird.
Attribute des Back-End-Dienstes prüfen
Sie können prüfen, ob die Einstellungen für den Load-Balancer über Ihre BackendConfig-Ressource angewendet wurden. Ermitteln Sie dazu den Back-End-Dienst, den das Ingress bereitgestellt hat, und prüfen Sie, ob die Einstellungen mit den Deployment-Manifesten übereinstimmen.
Beschreiben Sie zuerst die Ressource my-ingress
und den Filter für die Annotation, die die mit dem Ingress verknüpften Back-End-Dienste auflistet. Beispiel:
kubectl describe ingress my-ingress | grep ingress.kubernetes.io/backends
Die Ausgabe sollte in etwa so aussehen:
ingress.kubernetes.io/backends: '{"k8s1-27fde173-default-my-service-80-8d4ca500":"HEALTHY","k8s1-27fde173-kube-system-default-http-backend-80-18dfe76c":"HEALTHY"}
Die Ausgabe enthält Informationen zu Ihren Back-End-Diensten. Diese Annotation enthält beispielsweise zwei Back-End-Dienste:
"k8s1-27fde173-default-my-service-80-8d4ca500":"HEALTHY"
provides information about the backend service associated with themy-service
Kubernetes Service.k8s1-27fde173
ist ein Hash, mit dem der Cluster beschrieben wird.default
ist der Kubernetes-Namespace.HEALTHY
gibt an, dass das Back-End fehlerfrei ist.
"k8s1-27fde173-kube-system-default-http-backend-80-18dfe76c":"HEALTHY"
provides information about the backend service associated with the default backend (404-server).k8s1-27fde173
ist ein Hash, mit dem der Cluster beschrieben wird.kube-system
ist der Namespace.default-http-backend
ist der Name des Kubernetes-Dienstes.80
ist der Hostport.HEALTHY
gibt an, dass das Back-End fehlerfrei ist.
Prüfen Sie als Nächstes den Back-End-Dienst für my-service
mithilfe von gcloud
.
Filtern Sie nach "drainingTimeoutSec"
und "timeoutSec"
, um zu bestätigen, dass sie in der Steuerungsebene des Google Cloud-Load-Balancers festgelegt wurden. Beispiel:
# Optionally, set a variable
export BES=k8s1-27fde173-default-my-service-80-8d4ca500
# Filter for drainingTimeoutSec and timeoutSec
gcloud compute backend-services describe ${BES} --global | grep -e "drainingTimeoutSec" -e "timeoutSec"
Ausgabe:
drainingTimeoutSec: 60
timeoutSec: 40
Wenn Sie drainingTimeoutSec
und timeoutSec
in der Ausgabe sehen, bestätigen Sie, dass ihre Werte über die BackendConfig korrekt festgelegt wurden.
Bereinigen
Um unerwünschte Kosten für Ihr Konto zu vermeiden, löschen Sie die Kubernetes-Objekte, die Sie für diese Übung erstellt haben:
kubectl delete ingress my-ingress
kubectl delete service my-service
kubectl delete backendconfig my-backendconfig
kubectl delete deployment my-deployment
BackendConfig-Beschränkungen
Für BackendConfigs gelten die folgenden Einschränkungen:
- Ein Dienst/Port-Paar kann nur eine BackendConfig verwenden, auch wenn mehrere Ingress-Objekte auf das Dienst/Port-Paar verweisen. Dies bedeutet, dass alle Ingress-Objekte, die auf dasselbe Dienst/Port-Paar verweisen, dieselbe Konfiguration für Google Cloud Armor, IAP und Cloud CDN verwenden müssen.
- IAP und Cloud CDN können nicht für denselben Back-End-Dienst für das HTTP(S) Load Balancing aktiviert werden. Dies bedeutet, dass sich IAP und Cloud CDN nicht im selben BackendConfig-Objekt konfigurieren lassen.
- Zur Interaktion mit BackendConfig benötigen Sie
kubectl
ab Version 1.7.
Die in einer FrontendConfig oder BackendConfig angegebene Konfiguration entfernen
Wenn Sie ein Ingress-Feature entfernen möchten, müssen Sie die Featurekonfiguration in der FrontendConfig- oder BackendConfig-CRD explizit deaktivieren. Der Ingress-Controller gleicht nur die in diesen CRDs angegebenen Konfigurationen ab.
Zum Löschen oder Deaktivieren einer zuvor aktivierte Konfiguration setzen Sie den Wert des Felds je nach Feldtyp auf einen leeren String (""
) oder auf einen booleschen Wert von false
.
Das folgende BackendConfig-Manifest deaktiviert eine Google Cloud Armor-Sicherheitsrichtlinie und Cloud CDN:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
cdn:
enabled: false
securityPolicy:
name: ""
FrontendConfig oder BackendConfig löschen
FrontendConfig
So löschen Sie eine FrontendConfig:
Entfernen Sie im Ingress-Manifest den Namen der FrontendConfig aus der Annotation
networking.gke.io/v1beta1.FrontendConfig
.Wenden Sie das geänderte Ingress-Manifest auf Ihren Cluster an. Verwenden Sie zum Beispiel
kubectl apply
.Löschen Sie die FrontendConfig. Verwenden Sie zum Beispiel
kubectl delete frontendconfig config my-frontendconfig
.
BackendConfig
So löschen Sie ein BackendConfig-Objekt:
Entfernen Sie den Namen des BackendConfig-Objekts aus der Annotation
cloud.google.com/backend-config
im Dienstmanifest.Wenden Sie das geänderte Dienstmanifest auf Ihren Cluster an. Verwenden Sie zum Beispiel
kubectl apply
.Löschen Sie die BackendConfig. Verwenden Sie zum Beispiel
kubectl delete backendconfig my-backendconfig
.
Fehlerbehebung
Sie können gängige Fehlkonfigurationen mit dem Diagnosetool für Ingress erkennen. Achten Sie außerdem darauf, dass alle Systemdiagnosen korrekt konfiguriert sind.
BackendConfig wurde nicht gefunden
Dieser Fehler tritt auf, wenn in der Dienstannotation eine BackendConfig-Ressource für einen Dienstport angegeben wurde, die eigentliche BackendConfig-Ressource jedoch nicht gefunden werden konnte.
Führen Sie den folgenden Befehl aus, um ein Kubernetes-Ereignis auszuwerten:
kubectl get event
Die folgende Ausgabe zeigt an, dass Ihre BackendConfig nicht gefunden wurde:
KIND ... SOURCE
Ingress ... loadbalancer-controller
MESSAGE
Error during sync: error getting BackendConfig for port 80 on service "default/my-service":
no BackendConfig for service port exists
Achten Sie zur Behebung dieses Problems darauf, dass Sie die BackendConfig-Ressource nicht im falschen Namespace erstellt oder ihren Verweis in der Dienstannotation falsch geschrieben haben.
Ingress-Sicherheitsrichtlinie nicht gefunden
Wenn die Sicherheitsrichtlinie nach der Erstellung des Ingress-Objekts nicht ordnungsgemäß dem Load-Balancer-Dienst zugeordnet wird, sollten Sie das Kubernetes-Ereignis auf Konfigurationsfehler prüfen. Wenn Ihre BackendConfig eine Sicherheitsrichtlinie angibt, die nicht vorhanden ist, wird regelmäßig ein Warnungsereignis ausgegeben.
Führen Sie den folgenden Befehl aus, um ein Kubernetes-Ereignis auszuwerten:
kubectl get event
Die folgende Ausgabe zeigt an, dass Ihre Sicherheitsrichtlinie nicht gefunden wurde:
KIND ... SOURCE
Ingress ... loadbalancer-controller
MESSAGE
Error during sync: The given security policy "my-policy" does not exist.
Geben Sie zur Behebung dieses Problems den richtigen Namen der Sicherheitsrichtlinie in Ihrer BackendConfig an.
500er-Fehler bei NEGs während der Arbeitslastskalierung in GKE beheben
Symptom:
Wenn Sie von GKE bereitgestellte NEGs für das Load-Balancing verwenden, können während des Herunterskalierens der Arbeitslast 502- oder 503-Fehler für die Dienste auftreten. 502-Fehler treten auf, wenn Pods beendet werden, bevor vorhandene Verbindungen geschlossen werden. Die 503-Fehler treten auf, wenn Traffic an gelöschte Pods weitergeleitet wird.
Dieses Problem kann Cluster betreffen, wenn Sie in GKE verwaltete Load-Balancing-Produkte verwenden, die NEGs verwenden, einschließlich Gateway, Ingress und eigenständige NEGs. Wenn Sie Ihre Arbeitslasten häufig skalieren, besteht ein höheres Risiko, dass sie betroffen sind.
Diagnose:
Das Entfernen eines Pods in Kubernetes, ohne seinen Endpunkt zu leeren und ihn aus der NEG zu entfernen, führt zu 500-Fehlern. Wenn Sie Probleme während der Beendigung des Pods vermeiden möchten, müssen Sie die Reihenfolge der Vorgänge berücksichtigen. Die folgenden Abbildungen zeigen Szenarien, wenn BackendService Drain Timeout
nicht festgelegt und BackendService Drain Timeout
mit BackendConfig
festgelegt ist.
Szenario 1: BackendService Drain Timeout
ist nicht festgelegt.
Die folgende Abbildung zeigt ein Szenario, in dem BackendService Drain Timeout
nicht festgelegt ist.
Szenario 2: BackendService Drain Timeout
ist festgelegt.
In der folgenden Abbildung sehen Sie ein Szenario, in dem BackendService Drain Timeout
festgelegt wird.
Die genaue Zeit, zu der die 500er-Fehler auftreten, hängt von folgenden Faktoren ab:
NEG API-Trennlatenz: Die Trennungslatenz der NEG API stellt die aktuelle Zeit dar, die für den Abschluss des Trennvorgangs in Google Cloud benötigt wurde. Dies wird durch verschiedene Faktoren außerhalb von Kubernetes beeinflusst, einschließlich des Typs des Load-Balancers und der jeweiligen Zone.
Drain-Latenz: Die Drain-Latenz stellt die Zeit dar, die für das Load-Balancing benötigt wird, um anzufangen, Traffic von einem bestimmten Teil Ihres Systems wegzuleiten. Nachdem der Drain-Vorgang initiiert wurde, sendet der Load-Balancer keine neuen Anfragen mehr an den Endpunkt. Es gibt jedoch immer noch eine Latenz beim Auslösen des Drain-Vorgangs (Drain-Latenz), was zu einem vorübergehenden 503-Fehler führen kann, wenn der Pod nicht mehr vorhanden ist. eine
Konfiguration der Systemdiagnose: Schwellenwerte für sensible Systemdiagnosen reduzieren die Dauer von 503-Fehlern, da sie dem Load-Balancer signalisieren können, keine Anfragen mehr an Endpunkte zu senden, auch wenn der Trennvorgang nicht abgeschlossen ist.
Kulanzzeitraum für die Beendigung: Der Kulanzzeitraum für die Beendigung bestimmt die maximale Zeit, die einem Pod zum Beenden gewährt wird. Ein Pod kann jedoch beendet werden, bevor der Kulanzzeitraum für die Beendigung abgeschlossen ist. Wenn ein Pod länger als dieser Zeitraum dauert, wird der Pod zum Beenden am Ende dieses Zeitraums gezwungen. Dies ist eine Einstellung für den Pod und muss in der Arbeitslastdefinition konfiguriert werden.
Mögliche Lösung:
Wenden Sie die folgenden Einstellungen an, um diese 5XX-Fehler zu vermeiden. Die Zeitüberschreitungswerte sind Vorschläge und Sie müssen sie möglicherweise für Ihre spezifische Anwendung anpassen. Der folgende Abschnitt führt Sie durch den Anpassungsprozess.
Die folgende Abbildung zeigt, wie der Pod mit preStopHook
aktiv bleibt:
Führen Sie die folgenden Schritte aus, um Fehler der 500er-Serie zu vermeiden:
Legen Sie
BackendService Drain Timeout
für Ihren Dienst auf 1 Minute fest.Informationen für Ingress-Nutzer finden Sie unter Zeitlimit für BackendConfig festlegen.
Informationen für Gateway-Nutzer finden Sie unter Zeitlimit in der GCPBackendPolicy konfigurieren.
Informationen zum Verwalten der BackendServices direkt bei Verwendung von eigenständigen NEGs finden Sie unter Zeitlimit direkt für den Back-End-Dienst festlegen.
Erweitern Sie
terminationGracePeriod
auf dem Pod.Legen Sie
terminationGracePeriodSeconds
auf dem Pod auf 3,5 Minuten fest. In Kombination mit den empfohlenen Einstellungen hat Ihr Pod 30 bis 45 Sekunden Zeit für ein ordnungsgemäßes Herunterfahren, nachdem der Endpunkt des Pods aus der NEG entfernt wurde. Wenn Sie mehr Zeit für das ordnungsgemäße Herunterfahren benötigen, können Sie den Kulanzzeitraum verlängern oder der Anleitung im Abschnitt Zeitüberschreitungen anpassen folgen.Das folgende
BackendConfig
-Manifest gibt ein Zeitlimit für den Verbindungsausgleich von 210 Sekunden (3,5 Minuten) an:apiVersion: v1 kind: BackendConfig metadata: name: my-backendconfig spec: terminationGracePeriodSeconds: 210 containers: - name: my-app image: my-app-image:latest ports: - containerPort: 80
Wenden Sie ein
preStopHook
auf alle Container an.Wenden Sie eine
preStopHook
an, die dafür sorgt, dass der Pod 120 Sekunden länger aktiv ist, während der Endpunkt des Pods im Load-Balancer per Drain beendet wird und der Endpunkt aus der NEG entfernt wird.apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-app # Container configuration details... lifecycle: preStop: exec: command: ["/bin/sh", "-c", "sleep 120s"]
Zeitlimits anpassen
Zur Gewährleistung der Pod-Kontinuität und zur Vermeidung von 500-Fehlern muss der Pod aktiv sein, bis der Endpunkt aus der NEG entfernt wird. Insbesondere zur Vermeidung von 502- und 503-Fehlern sollten Sie eine Kombination aus Zeitüberschreitungen und einem preStopHook
implementieren.
Fügen Sie dem Pod einen preStopHook
hinzu, um den Pod während des Herunterfahrens länger aktiv zu lassen. Führen Sie den preStopHook
aus, bevor einem Pod das Beenden signalisiert wird. Damit kann preStopHook
den Pod so lange behalten, bis der entsprechende Endpunkt aus der NEG entfernt wird.
Um die Dauer zu verlängern, die ein Pod während des Herunterfahrens aktiv bleibt, fügen Sie einen preStopHook
in die Pod-Konfiguration ein:
spec:
containers:
- name: my-app
...
lifecycle:
preStopHook:
exec:
command: ["/bin/sh", "-c", "sleep <latency time>"]
Sie können Zeitlimits und zugehörige Einstellungen konfigurieren, um das ordnungsgemäße Herunterfahren von Pods während des Herunterskalierens von Arbeitslasten zu verwalten. Sie können Zeitlimits anhand bestimmter Anwendungsfälle anpassen. Wir empfehlen, mit längeren Zeitüberschreitungen zu beginnen und die Dauer nach Bedarf zu reduzieren. Sie können die Zeitlimits anpassen, indem Sie Zeitparameter und die preStopHook
auf folgende Weise konfigurieren:
Zeitlimit für Back-End-Dienst-Drain
Der Parameter Backend Service Drain Timeout
ist standardmäßig nicht festgelegt und hat keine Auswirkungen. Wenn Sie den Parameter Backend Service Drain Timeout
festlegen und aktivieren, beendet der Load-Balancer die Weiterleitung neuer Anfragen an den Endpunkt und wartet das Zeitlimit, bevor vorhandene Verbindungen beendet werden.
Sie können den Parameter Backend Service Drain Timeout
mit BackendConfig
mit Ingress, mit GCPBackendPolicy
mit Gateway oder manuell auf dem BackendService
mit eigenständigen NEGs festlegen. eine Das Zeitlimit sollte 1,5- bis 2-mal länger sein als die Zeit für die Verarbeitung einer Anfrage. Dadurch wird sichergestellt, dass eine Anfrage, die kurz vor dem Drain eingegangen ist, abgeschlossen wird, bevor die Zeitüberschreitung beendet ist. Wenn Sie den Parameter Backend Service Drain Timeout
auf einen Wert größer als 0 setzen, werden 503-Fehler minimiert, da keine neuen Anfragen an Endpunkte gesendet werden, die zum Entfernen vorgemerkt sind. Damit dieses Zeitlimit wirksam ist, müssen Sie es in Verbindung mit preStopHook
verwenden. So bleibt der Pod während des Drains aktiv. Ohne diese Kombination erhalten vorhandene Anfragen, die nicht abgeschlossen wurden, den Fehler 502.
Zeit preStopHook
preStopHook
muss das Herunterfahren des Pods so lange verzögern, bis sowohl die Drain-Latenz als auch die Zeitüberschreitung für den Drain des Back-End-Dienstes abgeschlossen sind, sodass ein ordnungsgemäßer Verbindungsausgleich und die Entfernung des Endpunkts vom NEG gewährleistet sind, bevor der Pod heruntergefahren wird.
Achten Sie für optimale Ergebnisse darauf, dass die Ausführungszeit von preStopHook
kleiner oder gleich der Summe von Backend Service Drain Timeout
und der Drain-Latenz ist.
Der Wert kann so berechnet werden:
preStopHook >= Backend Service Drain Timeout + Drain Latency
Wir empfehlen, die Drain-Latenz auf 1 Minute festzulegen. Wenn 500-Fehler bestehen bleiben, schätzen Sie die Gesamtdauer des Vorkommens und fügen Sie der Latenz das Doppelte davon hinzu. Dadurch wird sichergestellt, dass der Pod ausreichend Zeit zum ordnungsgemäßen Drain hat, bevor er aus dem Dienst entfernt wird. Sie können diesen Wert anpassen, wenn er für Ihren spezifischen Anwendungsfall zu lang ist.
Alternativ können Sie den Zeitpunkt schätzen, indem Sie den Löschzeitstempel vom Pod und den Zeitstempel für die Entfernung des Endpunkts aus der NEG in den Cloud-Audit-Logs untersuchen.
Parameter für den Kulanzzeitraum für die Beendigung
Sie müssen den Parameter terminationGracePeriod
so konfigurieren, dass ausreichend Zeit für den Abschluss des preStopHook
und für das ordnungsgemäße Herunterfahren des Pods bleibt.
Wenn nicht explizit festgelegt, beträgt der terminationGracePeriod
standardmäßig 30 Sekunden.
Sie können den optimalen terminationGracePeriod
mit der folgenden Formel berechnen:
terminationGracePeriod >= preStopHook Time + Pod shutdown time
So definieren Sie terminationGracePeriod
in der Pod-Konfiguration so:
spec:
terminationGracePeriodSeconds: <terminationGracePeriod>
containers:
- name: my-app
...
...
NEG beim Erstellen einer internen Ingress-Ressource nicht gefunden
Der folgende Fehler kann auftreten, wenn Sie ein internes Ingress in GKE erstellen:
Error syncing: error running backend syncing routine: googleapi: Error 404: The resource 'projects/PROJECT_ID/zones/ZONE/networkEndpointGroups/NEG' was not found, notFound
Dieser Fehler tritt auf, weil Ingress für interne Anwendungs-Load-Balancer Netzwerk-Endpunktgruppen (NEGs) als Back-Ends erfordert.
Fügen Sie in freigegebenen VPC-Umgebungen oder -Clustern mit aktivierten Netzwerkrichtlinien dem Dienstmanifest die Annotation cloud.google.com/neg: '{"ingress": true}'
hinzu.
504 Gateway-Zeitüberschreitung: Upstream-Zeitüberschreitung bei Anfrage
Der folgende Fehler kann auftreten, wenn Sie über einen internen Ingress in GKE auf einen Dienst zugreifen:
HTTP/1.1 504 Gateway Timeout
content-length: 24
content-type: text/plain
upsteam request timeout
Dieser Fehler tritt auf, weil Traffic, der an interne Anwendungs-Load-Balancer gesendet wird, von Envoy-Proxys im Nur-Proxy-Subnetzbereich weitergeleitet wird.
Erstellen Sie eine Firewallregel im targetPort
des Dienstes, um Traffic aus dem Nur-Proxy-Subnetzbereich zuzulassen.
Fehler 400: Ungültiger Wert für das Feld "resource.target"
Der folgende Fehler kann auftreten, wenn Sie über einen internen Ingress in GKE auf einen Dienst zugreifen:
Error syncing:LB_NAME does not exist: googleapi: Error 400: Invalid value for field 'resource.target': 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/regions/REGION_NAME/targetHttpProxies/LB_NAME. A reserved and active subnetwork is required in the same region and VPC as the forwarding rule.
Stellen Sie ein Nur-Proxy-Subnetz bereit, um dieses Problem zu beheben.
Fehler während der Synchronisierung: Fehler beim Ausführen der Synchronisierungsroutine des Load-Balancers: Load-Balancer existiert nicht
Einer der folgenden Fehler kann auftreten, wenn die GKE-Steuerungsebene aktualisiert wird oder Sie ein Ingress-Objekt ändern:
"Error during sync: error running load balancer syncing routine: loadbalancer
INGRESS_NAME does not exist: invalid ingress frontend configuration, please
check your usage of the 'kubernetes.io/ingress.allow-http' annotation."
oder:
Error during sync: error running load balancer syncing routine: loadbalancer LOAD_BALANCER_NAME does not exist:
googleapi: Error 400: Invalid value for field 'resource.IPAddress':'INGRESS_VIP'. Specified IP address is in-use and would result in a conflict., invalid
Um diese Probleme zu beheben, führen Sie die folgenden Schritte aus:
- Fügen Sie das Feld
hosts
im Abschnitttls
des Ingress-Manifests hinzu und löschen Sie dann das Ingress-Objekt. Warten Sie fünf Minuten, bis GKE die nicht verwendeten Ingress-Ressourcen gelöscht hat. Erstellen Sie dann das Ingress neu. Weitere Informationen finden Sie unter Feld „Hosts“ eines Ingress-Objekts. - Setzen Sie die Änderungen zurück, die Sie am Ingress-Objekt vorgenommen haben. Fügen Sie dann ein Zertifikat mit einer Annotation oder einem Kubernetes-Secret hinzu.
Bekannte Probleme
HTTPS-Weiterleitungen können nicht mit dem V1-Ingress-Namensschema aktiviert werden
Sie können HTTPS-Weiterleitungen für GKE-Ingress-Ressourcen, die in GKE-Version 1.16.8-gke.12 und früher erstellt wurden, nicht aktivieren. Sie müssen das Ingress neu erstellen, bevor Sie HTTPS-Weiterleitungen aktivieren können. Andernfalls wird ein Fehlerereignis erstellt und das Ingress wird nicht synchronisiert.
Die Fehlermeldung sieht in etwa so aus:
Error syncing: error running load balancer syncing routine: loadbalancer lb-name does not exist: ensureRedirectUrlMap() = error: cannot enable HTTPS Redirects with the V1 Ingress naming scheme. Please recreate your ingress to use the newest naming scheme.
Google Cloud Armor-Sicherheitsrichtlinienfelder wurden aus BackendConfig entfernt
Es gibt ein bekanntes Problem, bei dem beim Aktualisieren einer BackendConfig-Ressource mithilfe der v1beta1
API eine aktive Google Cloud Armor-Sicherheitsrichtlinie aus ihrem Service entfernt wird.
Dieses Problem betrifft die folgenden GKE-Versionen:
- 1.18.19-gke.1400 bis 1.18.20-gke.5099
- 1.19.10-gke.700 bis 1.19.14-gke.299
- 1.20.6-gke.700 bis 1.20.9-gke.899
Wenn Sie Google Cloud Armor für Ihre Ingress-Ressourcen nicht über die BackendConfig konfigurieren, sind Ihre Cluster nicht von diesem Problem betroffen.
Für GKE-Cluster, die Google Cloud Armor über die BackendConfig konfigurieren, wird dringend empfohlen, nur BackendConfig-Ressourcen mit der v1
API zu aktualisieren. Wenn Sie eine BackendConfig mit v1beta1
-BackendConfig-Ressourcen auf Ihren Cluster anwenden, wird die Google Cloud Armor-Sicherheitsrichtlinie aus dem Service entfernt, auf den sie verweist.
Aktualisieren Sie Ihre BackendConfig nur mit der v1
BackendConfig API, um dieses Problem zu beheben. Die v1
-BackendConfig unterstützt dieselben Felder wie v1beta1
und nimmt keine funktionsgefährdenden Änderungen vor, sodass das API-Feld transparent aktualisiert werden kann.
Ersetzen Sie das Feld apiVersion
aller aktiven BackendConfig-Manifeste durch cloud.google.com/v1
und verwenden Sie nicht cloud.google.com/v1beta1
.
Das folgende Beispielmanifest beschreibt eine BackendConfig-Ressource, die die v1
API verwendet:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backend-config
spec:
securityPolicy:
name: "ca-how-to-security-policy"
Wenn Sie CI/CD-Systeme oder -Tools haben, die BackendConfig-Ressourcen regelmäßig aktualisieren, achten Sie darauf, dass Sie in diesen Systemen die cloud.google.com/v1
-API-Gruppe verwenden.
Wenn Ihre BackendConfig bereits mit der v1beta1
API aktualisiert wurde, wurde Ihre Google Cloud Armor-Sicherheitsrichtlinie möglicherweise entfernt.
Mit dem folgenden Befehl können Sie feststellen, ob dies der Fall ist:
kubectl get backendconfigs -A -o json | jq -r '.items[] | select(.spec.securityPolicy == {}) | .metadata | "\(.namespace)/\(.name)"'
Wenn die Antwort eine Ausgabe zurückgibt, ist Ihr Cluster von diesem Problem betroffen.
Die Ausgabe dieses Befehls gibt eine Liste der BackendConfig-Ressourcen (<namespace>/<name>
) zurück, die vom Problem betroffen sind. Ist die Ausgabe leer, wurde Ihre BackendConfig seit dem Auftreten des Problems nicht mit der v1beta1
API aktualisiert. Alle zukünftigen Updates Ihrer BackendConfig sollten nur v1
verwenden.
Wenn Ihre Google Cloud Armor-Sicherheitsrichtlinie entfernt wurde, können Sie mit der folgenden Logging-Abfrage feststellen, wann sie entfernt wurde:
resource.type="gce_backend_service"
protoPayload.methodName="v1.compute.backendServices.setSecurityPolicy"
protoPayload.authenticationInfo.principalEmail:"container-engine-robot.iam.gserviceaccount.com"
protoPayload.response.status = "RUNNING"
NOT protoPayload.authorizationInfo.permission:"compute.securityPolicies.use"
Wenn einer Ihrer Cluster betroffen ist, kann dies durch Aktualisieren der BackendConfig-Ressource mithilfe der v1
API korrigiert werden.
Führen Sie ein Upgrade Ihrer GKE-Steuerungsebene auf eine der folgenden aktualisierten Versionen durch, in denen dieses Problem behoben wurde und die sichere Verwendung von v1beta1
-BackendConfig-Ressourcen möglich ist.
- 1.18.20-gke.5100 und höher
- 1.19.14-gke.300 und höher
- 1.20.9-gke.900 und höher