ALB-Routing anpassen
Ändern Sie die Standardeinstellungen für ALBs, die das Kubernetes Ingress-Image ausführen.
Manchmal können Sie das Routing für Ingress anpassen, indem Sie Kubernetes NGINX Anmerkungen (nginx.ingress.kubernetes.io/<annotation>)
hinzufügen. Kubernetes NGINX Anmerkungen werden immer auf alle Dienstpfade in der Ressource angewendet, und Sie können keine Dienstnamen innerhalb der Anmerkungen angeben. Benutzerdefinierte Anmerkungen im Format IBM Cloud Kubernetes Service
(ingress.bluemix.net/<annotation>) werden nicht unterstützt.
Kubernetes Ingress-Controller (ALBs) in Clustern, die am oder nach dem 31. Januar 2022 erstellt wurden, verarbeiten standardmäßig keine Ingress-Ressourcen mit Snippet-Annotationen (z. B. nginx.ingress.kubernetes.io/configuration-snippet),
da alle neuen Cluster mit der Konfiguration allow-snippet-annotations: "false" in der Datei ConfigMap des ALB bereitgestellt werden. Wenn Sie die hier empfohlenen Konfigurationsschnipsel hinzufügen, müssen Sie die ConfigMap
(kube-system/ibm-k8s-controller-config) des ALB bearbeiten und allow-snippet-annotations: "false" in allow-snippet-annotations: "true" ändern.
Server-Port zu einem Host-Header hinzufügen
Um der Client-Anfrage einen Server-Port hinzuzufügen, bevor die Anfrage an Ihre Back-End-Anwendung weitergeleitet wird, konfigurieren Sie einen Proxy für externe Dienste in einer Server-Snippet-Anmerkung oder als ibm-k8s-controller-config ConfigMap Feld.
Eingehende Anforderungen mit einer privaten ALB weiterleiten
Zum Weiterleiten eingehender Anforderungen an Ihre Apps mit einer privaten ALB geben Sie die Klassenannotation private-iks-k8s-nginx in der Ingress-Ressource an. Private ALBs sind für die Verwendung von Ressourcen mit dieser Klasse konfiguriert.
kubernetes.io/ingress.class: "private-iks-k8s-nginx"
Apps mit App ID authentifizieren
Konfigurieren Sie Ingress mit IBM Cloud App ID um die Authentifizierung für Ihre Anwendungen zu erzwingen, indem Sie bestimmte Kubernetes Ingress-Felder ändern. Weitere Informationen finden Sie unter Hinzufügen der Authentifizierung App ID zu Anwendungen.
Maximale Größe des Clientanforderungshauptteils festlegen
Um die maximale Größe des Body festzulegen, den der Client als Teil einer Anfrage senden kann, verwenden Sie die folgende Kubernetes Ingress resource annotation.
nginx.ingress.kubernetes.io/proxy-body-size: 8m
Pufferung von Clientantwortdaten aktivieren und inaktivieren
Sie können die Speicherung von Antwortdaten auf dem ALB deaktivieren oder aktivieren, während die Daten an den Client gesendet werden. Die Einstellung ist standardmäßig inaktiviert. Legen Sie zum Aktivieren die Annotationfür die Ingress-Ressource fest.
nginx.ingress.kubernetes.io/proxy-buffering: "on"
Anpassen der Zeitüberschreitungen für Verbindungsaufbau und Lesevorgänge
Verwenden Sie die folgenden Anmerkungen, um festzulegen, wie lange die ALB darauf wartet, eine Verbindung zur Back-End-App herzustellen und aus der Back-End-App zu lesen, bevor die Back-End-App als nicht verfügbar betrachtet wird.
nginx.ingress.kubernetes.io/proxy-connect-timeout: 62
nginx.ingress.kubernetes.io/proxy-read-timeout: 62
Fehleraktionen anpassen
Um benutzerdefinierte Aktionen anzugeben, die der ALB für bestimmte HTTP Fehler durchführen kann, setzen Sie das Feld custom-http-errors.
Ändern der Standard-Ports HTTP und HTTPS
Um die Standardports für HTTP (Port 80) und HTTPS (Port 443) Netzwerkverkehr zu ändern, ändern Sie jeden ALB-Dienst mit den folgenden Feldern Kubernetes Ingress ibm-ingress-deploy-config ConfigMap.
Beispielfeldeinstellung.
httpPort=8080
httpsPort=8443
Anforderungsheader anpassen
Um einer Client-Anfrage Header-Informationen hinzuzufügen, bevor die Anfrage an Ihre Backend-Anwendung weitergeleitet wird, verwenden Sie das folgende Feld „ Kubernetes “ in der ConfigMap „ ibm-k8s-controller-config “
proxy-set-headers: "ingress-nginx/custom-headers"
Informationen zu den Anforderungen an die ConfigMapcustom-headers finden Sie in diesem Beispiel.
Antwortheader anpassen
Um einer Clientantwort Headerinformationen hinzuzufügen, bevor sie an den Client gesendet wird, verwenden Sie die folgende Annotation.
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Request-Id: $req_id";
Hinzufügen von Pfaddfinitionen zu externen Diensten
Um Pfaddefinitionen zu externen Diensten hinzuzufügen, z. B. zu Diensten, die auf IBM Cloud gehostet werden, konfigurieren Sie einen Proxy zu externen Diensten in einem Location Snippet. Oder ersetzen Sie den Proxy durch eine permanente Umleitung zu externen Services.
Unsichere Anforderungen umleiten
Standardmäßig werden unsichere HTTP Client-Anfragen auf HTTPS umgeleitet. Verwenden Sie das folgende Feld und die folgende Anmerkung, um diese Einstellung zu inaktivieren.
ibm-k8s-controller-configFeld ConfigMapssl-redirect: "false"- Annotationfür Ingress-Ressource:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
HTTP aktivieren und deaktivieren Strict Transport Security
Browser so einrichten, dass Zugriffe auf die Domäne nur unter Verwendung von HTTPS erfolgen. Diese Option wird standardmäßig aktiviert.
- Informationen zur Festlegung der maximalen Gültigkeitsdauer und zur Granularität von Subdomains finden Sie in diesem Blogbeitrag unter NGINX.
- Um die Funktion zu deaktivieren, legen Sie das Feld configmap
ibm-k8s-controller-configfest.hsts: false
Maximale Anzahl von Keepalive-Anforderungen festlegen
Um die maximale Anzahl der Anfragen festzulegen, die über eine Keepalive-Verbindung bedient werden können, verwenden Sie das folgende Feld Kubernetes ibm-k8s-controller-config configmap.
keep-alive-requests: 100
Der Standardwert für keep-alive-requests im Kubernetes-Ingress ist 100, was deutlich unter dem Standardwert von 4096 im IBM Cloud Kubernetes Service-Ingress liegt. Wenn Sie Ihre Ingress-Konfiguration von
IBM Cloud Kubernetes Service Ingress nach Kubernetes Ingress migriert haben, müssen Sie keep-alive-requests unter Umständen ändern, um vorhandene Leistungstests zu bestehen.
Maximales Zeitlimit für Keepalive-Anforderungen festlegen
Um die maximale Zeit festzulegen, die eine Keepalive-Verbindung zwischen dem Client und dem ALB-Proxy-Server offen bleibt, verwenden Sie das folgende Kubernetes ibm-k8s-controller-config configmap-Feld.
keep-alive: 60
Maximale Anzahl großer Client-Header-Puffer festlegen
Um die maximale Anzahl und Größe von Puffern festzulegen, die große Client-Request-Header lesen, verwenden Sie das folgende Kubernetes ibm-k8s-controller-config configmap-Feld.
large-client-header-buffers: 4 8k
Übereinstimmung der ALB mit dem Anforderungs-URI ändern
Um die Art und Weise zu ändern, wie die ALB den Anfrage-URI mit dem App-Pfad abgleicht, verwenden Sie die folgende Kubernetes Ingress Resource Annotation.
nginx.ingress.kubernetes.io/use-regex: "true"
Weitere Informationen finden Sie in diesem Blog.
Angepasste Positionsblockkonfigurationen hinzufügen
Um eine benutzerdefinierte Standortblockkonfiguration für einen Dienst hinzuzufügen, verwenden Sie die folgende Kubernetes Ingress-Ressourcenanmerkung.
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Request-Id: $req_id";
Gegenseitige Authentifizierung konfigurieren
Um die gegenseitige Authentifizierung für den ALB zu konfigurieren, verwenden Sie die folgenden Kubernetes Ingress-Ressourcen-Anmerkungen. Beachten Sie, dass die gegenseitige Authentifizierung nicht auf angepasste Ports angewendet werden kann und auf den HTTPS-Port angewendet werden muss.
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/auth-tls-error-page: "http://www.mysite.com/error-cert.html"
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
Größe des Proxy-Puffers konfigurieren
Um die Größe des Proxy-Puffers zu konfigurieren, der den ersten Teil der Antwort liest, verwenden Sie die folgende Kubernetes Ingress resource annotation.
nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"
Proxy-Puffernummern konfigurieren
Um die Anzahl der Proxy-Puffer für den ALB zu konfigurieren, verwenden Sie die folgende Kubernetes Ingress Resource Annotation.
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
Größe des belegten Proxy-Puffers konfigurieren
Um die Größe der Proxy-Puffer zu konfigurieren, die belegt sein können, verwenden Sie ein Positionssnippet. Weitere Informationen finden Sie in der Dokumentation zu NGINX.
Konfigurieren, wann eine ALB eine Anforderung übergeben kann
Um festzulegen, wann der ALB eine Anfrage an den nächsten Upstream-Server weiterleiten kann, verwenden Sie die folgenden Felder Kubernetes Ingress.
-
Globale Einstellung:
ibm-k8s-controller-configConfigMap Felder:retry-non-idempotent: true proxy-next-upstream: error timeout http_500 -
Einstellung pro Ressource: Ingress-Ressource Annotationen:
nginx.ingress.kubernetes.io/proxy-next-upstream: http_500 nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: 50 nginx.ingress.kubernetes.io/proxy-next-upstream-tries: 3
Durchsatzbegrenzung
Um die Anforderungsverarbeitungsrate und die Anzahl der Verbindungen pro definiertem Schlüssel für Services zu begrenzen, verwenden Sie die Ingress-Ressource Annotationen für Ratenbegrenzung.
Antwortheader entfernen
Sie können Header-Informationen, die in der Client-Antwort enthalten sind, aus der Backend-App entfernen, bevor die Antwort an den Client gesendet wird. Konfigurieren Sie die Entfernung des Antwort-Headers in einem Standort-Snippet, oder verwenden Sie das Feld proxy_hide_header als
Konfigurations-Snippet in der ibm-k8s-controller-config ConfigMap.
Pfade neu schreiben
Um eingehenden Netzwerkverkehr auf einem ALB-Domänenpfad an einen anderen Pfad weiterzuleiten, den Ihre Back-End-App abhört, verwenden Sie die folgende Kubernetes Ingress-Ressourcenanmerkung.
nginx.ingress.kubernetes.io/rewrite-target: /newpath
Serverblockkonfigurationen anpassen
Um eine benutzerdefinierte Serverblockkonfiguration hinzuzufügen, verwenden Sie die folgende Kubernetes Ingress-Ressourcenanmerkung.
nginx.ingress.kubernetes.io/server-snippet: |
location = /health {
return 200 'Healthy';
add_header Content-Type text/plain;
}
Ermöglichung der Verschlüsselung des Datenverkehrs durch die Dienste von SSL
Um die Unterstützung von SSL Services für die Verschlüsselung des Datenverkehrs zu Ihren Upstream-Anwendungen zu ermöglichen, die HTTPS erfordern, verwenden Sie die Kubernetes Ingress Resource Backend Protocol Annotation und die Backend Certificate Authentication Annotations.
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/proxy-ssl-secret: app1-ssl-secret
nginx.ingress.kubernetes.io/proxy-ssl-verify-depth: 5
nginx.ingress.kubernetes.io/proxy-ssl-name: proxy-ssl-name=mydomain.com
nginx.ingress.kubernetes.io/proxy-ssl-verify: true
Zugriff auf Anwendungen mit nicht standardmäßigen Anschlüssen TCP
Führen Sie die folgenden Schritte aus, um über einen nicht standardmäßigen Anschluss TCP auf eine Anwendung zuzugreifen.
-
Erstellen Sie eine
tcp-services-ConfigMap, um Ihren TCP-Port anzugeben (z. B. folgende Beispielports). Informationen zu den Anforderungen des ConfigMap,tcp-servicesfinden Sie in diesem Blog.apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: kube-system data: 9000: "<namespace>/<service>:8080" -
Erstellen Sie die Konfigurationszuordnung im Namensbereich
kube-system.kubectl apply -f tcp-services.yaml -n kube-system -
Geben Sie die
tcp-services-Konfigurationszuordnung als Feld in deribm-ingress-deploy-config-Konfigurationszuordnung an."tcpServicesConfig":"kube-system/tcp-services" -
Ändern Sie jeden ALB-Service, um die Ports hinzuzufügen.
Maximale Anzahl vorgeschalteter Keepalive-Anforderungen festlegen
Um die maximale Anzahl von Anfragen festzulegen, die über eine Keepalive-Verbindung bedient werden können, verwenden Sie das folgende Feld Kubernetes ibm-k8s-controller-config ConfigMap.
upstream-keepalive-requests: 32
Maximales Upstream-Keepalive-Zeitlimit festlegen
Um die maximale Zeit festzulegen, die eine Keepalive-Verbindung zwischen dem ALB-Proxy-Server und dem Upstream-Server Ihrer Anwendung offen bleibt, verwenden Sie das folgende Kubernetes ibm-k8s-controller-config configmap-Feld.
upstream-keepalive-timeout: 32
ALB-Bereitstellung anpassen
Passen Sie durch das Erstellen einer Konfigurationszuordnung des Typs ibm-ingress-deploy-config die Bereitstellung für ALBs an, die ein Kubernetes Ingress-Image ausführen.
-
Rufen Sie die Namen der Services ab, die die einzelnen ALBs zugänglich machen.
- Klassische Cluster:
kubectl get svc -n kube-system | grep alb ``` * VPC-Cluster: Suchen Sie in der Ausgabe nach einem Servicenamen, der zum Beispiel wie folgt formatiert ist: `public-crc204dl7w0qf6n6sp7tug`. ```sh {: pre} kubectl get svc -n kube-system | grep LoadBalancer ```
Erstellen einer ConfigMap, um die Ingress-Bereitstellung anzupassen
-
Erstellen Sie eine YAML-Datei für eine Konfigurationszuordnung (configmap) namens
ibm-ingress-deploy-config. Für jede ALB-ID können Sie eine oder mehrere der folgenden optionalen Einstellungen angeben. Es müssen nicht alle Einstellungen angegeben werden. Sie können sich auf die Einstellungen beschränken, die Sie konfigurieren möchten.apiVersion: v1 kind: ConfigMap metadata: name: ibm-ingress-deploy-config namespace: kube-system data: <alb1-id>: '{"deepInspect":"<true|false>", "defaultBackendService":"<service_name>", "defaultCertificate":"<namespace>/<secret_name>", "defaultConfig":"<namespace>/<configmap-name>","enableSslPassthrough":"<true|false>", "httpPort":"<port>", "httpsPort":"<port>", "ingressClass":"<class>", "logLevel":<log_level>, "replicas":<number_of_replicas>, "tcpServicesConfig":"<kube-system/tcp-services>", "enableIngressValidation":"<true|false>", "tolerations":[{"key":"<key>","operator":"<Exists|Equal>","value":"<value>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>", "tolerationSeconds": <number_of_seconds>},{"key":"<key>","operator":"<Exists|Equal>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>"}]}' <alb2-id>: '{"deepInspect":"<true|false>", "defaultBackendService":"<service_name>", "defaultCertificate":"<namespace>/<secret_name>", "enableSslPassthrough":"<true|false>", "httpPort":"<port>", "httpsPort":"<port>", "ingressClass":"<class>","logLevel":<log_level>, "replicas":<number_of_replicas>, "tcpServicesConfig":"<kube-system/tcp-services>", "enableIngressValidation":"<true|false>", "tolerations":[{"key":"<key>","operator":"<Exists|Equal>","value":"<value>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>", "tolerationSeconds": <number_of_seconds>},{"key":"<key>","operator":"<Exists|Equal>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>"}]}'deepInspect-
- Tiefen-Inspector für die Ingress-Objektsicherheit aktivieren oder inaktivieren. Wenn diese Option aktiviert ist, überprüfen ALBs vor der Verarbeitung Konfigurationswerte in Ingress-Ressourcen. Weitere Informationen finden Sie unter Quellcode für ingress-nginx.
- Dieses Feature ist für ALB Version 1.2.0 und höher verfügbar und standardmäßig aktiviert.
defaultBackendService- Geben Sie den Namen eines optionalen Standardservice an, der Anforderungen empfängt, wenn kein Host konfiguriert ist oder kein übereinstimmender Host gefunden wird. Dieser Service ersetzt den von IBM bereitgestellten Standardservice,
der die Nachricht
404generiert. Sie können diesen Service verwenden, um angepasste Fehlerseiten zu konfigurieren oder Verbindungen zu testen. defaultCertificate- Ein geheimer Schlüssel für ein TLS-Standardzertifikat, das auf alle Unterdomänen angewendet werden soll, die mit Ingress-ALBs im Format
secret_namespace/secret_namekonfiguriert sind. Sie können den geheimen Schlüssel mit dem Befehl ibmcloud ks ingress secret create erstellen. Wenn im Abschnittspec.tlseiner Ingress-Ressource ein geheimer Schlüssel für ein anderes TLS-Zertifikat angegeben ist und sich dieser im selben Namensbereich wie die Ingress-Ressource befindet, wird dieser geheime Schlüssel anstelle des geheimen Standardschlüssels angewendet. defaultConfig- Geben Sie eine Standardkonfigurationszuordnung für Ihre ALBs an. Geben Sie die Position der ConfigMap, die Sie verwenden wollen, im Format
namespace/configmap-nameein. Beispiel:kube-system/ibm-k8s-controller-config. enableAnnotationValidation-
- Aktivieren oder inaktivieren Sie die Validierung der Ingress-Objektanmerkung. Wenn diese Option aktiviert ist, validieren ALBs vor der Verarbeitung Annotationswerte in Ingress-Ressourcen. Weitere Informationen finden Sie unter Quellcode für ingress-nginx.
- Dieses Feature ist für ALB-Versionen ab 1.9.0 verfügbar und standardmäßig aktiviert.
enableSslPassthrough- Aktivieren Sie den SSL-Durchgriff für die ALB. Die TLS-Verbindung wird nicht beendet und der Durchgriff erfolgt ungehindert.
httpPort,httpsPort- Machen Sie die Nicht-Standardports für die Ingress-ALB zugänglich, indem Sie die HTTP-oder HTTPS-Ports hinzufügen, die Sie öffnen möchten.
ingressClass- Wenn Sie eine andere Klasse als
public-iks-k8s-nginxoderprivate-iks-k8s-nginxin Ihrer Ingress-Ressource angegeben haben, geben Sie die Klasse an. logLevel-
- Geben Sie die Protokollstufe an, die verwendet werden soll. Die folgenden Werte stehen zur Auswahl.
2: Zeigt die Details mit dem Befehl**diff**an, um Änderungen in der Konfiguration inNGINXanzuzeigen.3: Zeigt die Details zu Änderungen des Service, der Ingress-Regel und des Endpunkts im JSON-Format an.5: KonfiguriertNGINXim Debug-Modus.- Weitere Informationen zur Protokollierung finden Sie unter Debugprotokollierung.
replicas- Standardmäßig hat jede ALB 2 Replikate. Führen Sie ein Scale-up für die Verarbeitungsfunktionen Ihrer ALB durch, indem Sie die Anzahl der ALB-Pods erhöhen. Weitere Informationen finden Sie unter Anzahl der ALB-Podreplikate erhöhen.
tcpServicesConfig- Geben Sie eine Konfigurationszuordnung und den Namensbereich an, in dem sich die Konfigurationszuordnung befindet, z. B.
kube-system/tcp-services, das Informationen über den Zugriff auf Ihren App-Service über einen Nicht-Standard-TCP-Port enthält. enableIngressValidation- Implementierung des Ingress-Validierungs-Webhooks für diese ALB aktivieren. Der Webhook validiert Ingress-Ressourcen, bevor er auf den Cluster angewendet wird, um ungültige Konfigurationen zu verhindern. (Die ALB verarbeitet nur Ingress-Ressourcen,
die zur Ingress-Klasse gehören, die sie zugänglich macht.) Standardwert:
"false". tolerations- Geben Sie zusätzliche benutzerdefinierte Toleranzen für die ALB-Pods an. Weitere Informationen finden Sie unter Taints und Tolerationen.
-
Erstellen Sie die Konfigurationszuordnung
ibm-ingress-deploy-configin Ihrem Cluster.kubectl create -f ibm-ingress-deploy-config.yaml -
Aktualisieren Sie Ihre ALBs, damit die vorgenommenen Änderungen übernommen und wirksam werden. Beachten Sie, dass es bis zu 5 Minuten dauern kann, bis die Änderungen auf Ihre ALBs angewendet werden.
ibmcloud ks ingress alb update -c CLUSTER_NAME_OR_ID -
Wenn Sie HTTP-, HTTPS- oder TCP-Ports angegeben haben, die nicht Standardports sind, müssen Sie die Ports für jeden ALB-Service öffnen.
- Bearbeiten Sie für jeden ALB-Service, den Sie in Schritt 1 gefunden haben, die YAML-Datei.
kubectl edit svc -n kube-system <alb_svc_name> ``` 2. Fügen Sie im Abschnitt `spec.ports` die Ports hinzu, die Sie öffnen möchten. Standardmäßig sind Port 80 und 443 geöffnet. Wenn Sie die Ports 80 und 443 geöffnet bleiben sollen, entfernen Sie sie nicht aus dieser Datei. Ein Port, der nicht angegeben wird, wird geschlossen. Geben Sie keinen Wert für `nodePort` an. Nach dem Hinzufügen des Ports und Anwenden der Änderungen wird automatisch ein Knotenport (`nodePort`) zugewiesen. ```sh {: screen} ... ports: - name: port-80 nodePort: 32632 port: 80 protocol: TCP targetPort: 80 - name: port-443 nodePort: 32293 port: 443 protocol: TCP targetPort: 443 - name: <new_port> port: <port> protocol: TCP targetPort: <port> ... ``` 3. Speichern und schließen Sie die Datei. Ihre Änderungen werden automatisch angewendet.
Ingress-Klasse anpassen
Eine Ingress-Klasse ordnet einen Klassennamen einem Ingress-Controller-Typ zu. Mit der Ressource IngressClass können Sie Ingress-Klassen anpassen.
App ID-Authentifizierung zu Apps hinzufügen
Richten Sie die Authentifizierung für Ihre Apps ein, indem Sie Ingress mit IBM Cloud App ID konfigurieren.
-
Wählen Sie eine vorhandene Instanz aus oder erstellen Sie eine neue App ID-Instanz.
Eine App ID-Instanz kann nur in einem Namensbereich in Ihrem Cluster verwendet werden. Wenn Sie App ID für Ingress-Ressourcen in mehreren Namensbereichen konfigurieren möchten, wiederholen Sie die Schritte in diesem Abschnitt, um eine eindeutige App ID-Instanz für die Ingress-Ressourcen in jedem Namensbereich anzugeben.
- Wenn Sie eine vorhandene Instanz verwenden möchten, stellen Sie sicher, dass der Serviceinstanzname nur Kleinbuchstaben alphanumerische Zeichen enthält und die Länge 25 Zeichen nicht überschreitet. Wenn Sie den Namen ändern möchten, wählen Sie Service umbenennen im Menü "Weitere Optionen" auf der Detailseite der Serviceinstanz aus.
- Gehen Sie wie folgt vor, um eine neue App ID-Instanz bereitzustellen:
- Ersetzen Sie Servicename durch Ihren eindeutigen Namen für die Serviceinstanz. Der Name der Service-Instanz darf nur aus alphanumerischen Kleinbuchstaben bestehen und darf nicht länger als 25 Zeichen sein.
- Wählen Sie die Region aus, in der Ihr Cluster implementiert ist.
- Klicken Sie auf Erstellen.
-
Fügen Sie Umleitungs-URLs für Ihre App hinzu. Eine Umleitungs-URL ist der Callback-Endpunkt Ihrer App. Um Phishing-Attacken zu verhindern, validiert die IBM Cloud App ID die Anforderungs-URL anhand der Zulassungsliste mit Umleitungs-URLs.
- Navigieren Sie in der App ID-Managementkonsole zu Authentifizierung verwalten.
- Stellen Sie sicher, dass Sie auf der Registerkarte Identitätsprovider einen Identitätsprovider ausgewählt haben. Wenn kein Identitätsanbieter ausgewählt ist, wird der Benutzer nicht authentifiziert, erhält jedoch ein Zugriffstoken für den anonymen Zugriff auf die App.
- Fügen Sie auf der Registerkarte Authentifizierungseinstellungen Umleitungs-URLs für Ihre App im Format
https://<hostname>/oauth2-<App_ID_service_instance_name>/callbackhinzu. Beachten Sie, dass alle Buchstaben im Serviceinstanznamen als Kleinbuchstaben angegeben werden müssen.
Wenn Sie die Abmeldefunktion von IBM Cloud App ID verwenden, müssen Sie
/sign_outim Formathttps://<hostname>/oauth2-<App_ID_service_instance_name>/sign_outan Ihre Domäne anhängen und diese URL in die Liste der Umleitungs-URLs eintragen. Wenn Sie eine benutzerdefinierte Abmeldeseite verwenden möchten, müssen Siewhitelist_domainsin der ConfigMap für OAuth2-Proxy einstellen. Rufen Sie den Endpunkthttps://<hostname>/oauth2-<App_ID_service_instance_name>/sign_outmit dem Abfrageparameterrdauf oder legen Sie den HeaderX-Auth-Request-Redirectmit Ihrer angepassten Abmeldeseite fest. Weitere Informationen finden Sie unter Abmelden. -
Binden Sie die App ID-Serviceinstanz an den Cluster. Der Befehl erstellt einen Dienstschlüssel für die Dienstinstanz. Alternativ können Sie die Option
--keyangeben, um vorhandene Anmeldedaten für den Dienstschlüssel zu verwenden. Stellen Sie sicher, dass Sie die Serviceinstanz an den Namensbereich binden, in dem sich auch Ihre Ingress-Ressourcen befinden. Beachten Sie, dass alle Buchstaben im Serviceinstanznamen als Kleinbuchstaben angegeben werden müssen.ibmcloud ks cluster service bind --cluster CLUSTER_NAME_OR_ID --namespace NAMESPACE --service APP_ID_SERVICE_INSTANCE_NAME [--key SERVICE_INSTANCE_KEY]Wenn der Service erfolgreich an Ihren Cluster gebunden wurde, wird ein geheimer Schlüssel für den Cluster erstellt, der die Berechtigungsnachweise Ihrer Serviceinstanz enthält. CLI-Beispielausgabe:
ibmcloud ks cluster service bind --cluster mycluster --namespace mynamespace --service appid1 Binding service instance to namespace... OK Namespace: mynamespace Secret name: binding-<service_instance_name> -
Aktivieren Sie das Add-on für den ALB-OAuth-Proxy in Ihrem Cluster. Dieses Add-on erstellt und verwaltet die folgenden Kubernetes-Ressourcen: eine OAuth2-Proxy-Bereitstellung für Ihre App ID-Serviceinstanz, einen geheimen Schlüssel, der die Konfiguration der OAuth2-Proxy-Bereitstellung enthält, und eine Ingress-Ressource, die ALBs konfiguriert, um eingehende Anforderungen an die OAuth2-Proxy-Bereitstellung für Ihre App ID-Instanz weiterzuleiten. Der Name jeder dieser Ressourcen beginnt mit
oauth2-.- Aktivieren Sie das
alb-oauth-proxy-Add-on.
ibmcloud ks cluster addon enable alb-oauth-proxy --cluster CLUSTER_NAME_OR_ID ``` 2. Stellen Sie sicher, dass das Add-on für den ALB-OAuth-Proxy den Status `Addon Ready` (Add-on bereit) aufweist. ```sh {: pre} ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID ``` - Aktivieren Sie das
-
Stellen Sie in den Ingress-Ressourcen für Apps, denen Sie die Authentifizierung App ID hinzufügen möchten, sicher, dass der Ressourcenname nicht länger als 25 Zeichen ist. Fügen Sie anschließend die folgenden Annotationen zum Abschnitt
metadata.annotationshinzu:- Fügen Sie die folgende Annotation
auth-urlhinzu. Diese Annotation gibt die URL des OAuth2-Proxys für Ihre App ID-Instanz an, die als OIDC-Relying Party (RP) für App ID fungiert. Beachten Sie, dass alle Buchstaben im Serviceinstanznamen als Kleinbuchstaben angegeben werden müssen.
... annotations: nginx.ingress.kubernetes.io/auth-url: https://oauth2-<App_ID_service_instance_name>.<namespace_of_Ingress_resource>.svc.cluster.local/oauth2-<App_ID_service_instance_name>/auth ... ``` 2. Manchmal überschreitet das von `OAuth2-Proxy` verwendete Authentifizierungscookie 4 KB. Daher wird sie in zwei Teile aufgeteilt. Das folgende Snippet muss hinzugefügt werden, um sicherzustellen, dass beide Cookies von `OAuth2-Proxy` ordnungsgemäß aktualisiert werden können. ```yaml {: codeblock} ... annotations: nginx.ingress.kubernetes.io/configuration-snippet: | auth_request_set $_oauth2_<App_ID_service_instance_name>_upstream_1 $upstream_cookie__oauth2_<App_ID_service_instance_name>_1; access_by_lua_block { if ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 ~= "" then ngx.header["Set-Cookie"] = "_oauth2_<App_ID_service_instance_name>_1=" .. ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 .. ngx.var.auth_cookie:match("(; .*)") end } ... ``` 3. Wählen Sie aus, welche Tokens im Header `Authorization` an Ihre App gesendet werden sollen. Weitere Informationen zu ID- und Zugriffstoken finden Sie in der [Dokumentation zu App ID.](/docs/appid?topic=appid-tokens){: external} * Um nur die zu versenden `ID Token`, fügen Sie folgende Anmerkung hinzu: ```yaml {: codeblock} ... annotations: nginx.ingress.kubernetes.io/auth-response-headers: Authorization ... ``` * Um nur die zu senden `Access Token`, fügen Sie die folgenden Informationen zur Anmerkung `configuration-snippet` hinzu. (Dadurch wird das Snippet aus Schritt 5.2erweitert). ```yaml {: codeblock} ... annotations: nginx.ingress.kubernetes.io/configuration-snippet: | auth_request_set $_oauth2_<App_ID_service_instance_name>_upstream_1 $upstream_cookie__oauth2_<App_ID_service_instance_name>_1; auth_request_set $access_token $upstream_http_x_auth_request_access_token; access_by_lua_block { if ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 ~= "" then ngx.header["Set-Cookie"] = "_oauth2_<App_ID_service_instance_name>_1=" .. ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 .. ngx.var.auth_cookie:match("(; .*)") end if ngx.var.access_token ~= "" then ngx.req.set_header("Authorization", "Bearer " .. ngx.var.access_token) end } ... ``` * Um das und `Access Token` das zu senden `ID Token`, fügen Sie die folgenden Informationen zur Anmerkung `configuration-snippet` hinzu. (Dadurch wird das Snippet aus Schritt 5.2erweitert). ```yaml {: codeblock} ... annotations: nginx.ingress.kubernetes.io/configuration-snippet: | auth_request_set $_oauth2_<App_ID_service_instance_name>_upstream_1 $upstream_cookie__oauth2_<App_ID_service_instance_name>_1; auth_request_set $access_token $upstream_http_x_auth_request_access_token; auth_request_set $id_token $upstream_http_authorization; access_by_lua_block { if ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 ~= "" then ngx.header["Set-Cookie"] = "_oauth2_<App_ID_service_instance_name>_1=" .. ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 .. ngx.var.auth_cookie:match("(; .*)") end if ngx.var.id_token ~= "" and ngx.var.access_token ~= "" then ngx.req.set_header("Authorization", "Bearer " .. ngx.var.access_token .. " " .. ngx.var.id_token:match("%s*Bearer%s*(.*)")) end } ... ``` 4. Optional: Wenn Ihre App die [Web-App-Strategie](/docs/appid?topic=appid-key-concepts#term-web-strategy) und/oder die [API-Strategie](/docs/appid?topic=appid-key-concepts#term-api-strategy) unterstützt, fügen Sie die Annotation `nginx.ingress.kubernetes.io/auth-signin: https://$host/oauth2-<App_ID_service_instance_name>/start?rd=$escaped_request_uri` hinzu. Beachten Sie, dass alle Buchstaben im Namen der Service-Instanz in Kleinbuchstaben geschrieben sein müssen. * Wenn Sie diese Annotation angeben und die Authentifizierung für einen Client fehlschlägt, wird der Client an die URL des OAuth2-Proxys für Ihre App ID-Instanz umgeleitet. Dieser OAuth2-Proxy, der als OIDC-Relying Party (RP) für App ID dient, leitet den Client zur Authentifizierung an Ihre App ID-Anmeldeseite weiter. * Wenn Sie diese Annotation nicht angeben, muss sich der Client mit einem gültigen Trägertoken authentifizieren. Wenn die Authentifizierung für einen Client fehlschlägt, wird die Anforderung des Clients mit der Fehlernachricht `401 Unauthorized` zurückgewiesen. - Fügen Sie die folgende Annotation
-
Wenden Sie Ihre Ingress-Ressourcen erneut an, um die App ID-Authentifizierung zu erzwingen. Nachdem eine Ingress-Ressource mit den entsprechenden Annotationen erneut angewendet wird, stellt das ALB-OAuth-Proxy-Add-on eine OAuth2-Proxy-Bereitstellung bereit, erstellt einen Service für die Bereitstellung und erstellt eine separate Ingress-Ressource, um das Routing für die OAuth2-Proxy-Bereitstellungsnachrichten zu konfigurieren. Diese Add-on-Ressourcen dürfen Sie nicht löschen.
kubectl apply -f <app_ingress_resource>.yaml -n namespace -
Stellen Sie sicher, dass die App ID-Authentifizierung für Ihre Apps erzwungen wird.
- Wenn Ihre Apps die Web-App-Strategie unterstützen: Greifen Sie auf die URL Ihrer App in einem Web-Browser zu. Wenn App ID korrekt angewendet wird, werden Sie auf eine entsprechende Anmeldeseite für die App ID-Authentifizierung weitergeleitet.
- Wenn Ihre Apps die API-Strategie unterstützen: Geben Sie Ihr
Bearer-Zugriffstoken im Autorisierungsheader von Anforderungen an die Apps an. Informationen zum Abrufen Ihres Zugriffstokens finden Sie in der Dokumentation zu App ID. Wenn App ID korrekt angewendet wird, wird die Anforderung erfolgreich authentifiziert und an Ihre App weitergeleitet. Wenn Sie Anforderungen an Ihre Apps ohne ein Zugriffstoken im Autorisierungsheader senden oder wenn das Zugriffstoken nicht von App ID akzeptiert wird, wird die Anforderung zurückgewiesen.
-
Optional: Wenn Sie Netzwerkrichtlinien oder eine andere Firewall-Lösung auf Ihrem Cluster verwenden, um den ausgehenden Datenverkehr zu begrenzen, müssen Sie sicherstellen, dass der Zugriff auf den öffentlichen Dienst AppID's von Ihrem Cluster aus möglich ist. Um den IP-Adressbereich für diesen Dienst zu erhalten, stellen Sie bitte eine Anfrage an den Kundensupport.
-
Optional: Sie können das Standardverhalten des OAuth2-Proxys anpassen, indem Sie eine Kubernetes-Konfigurationszuordnung erstellen.
- Erstellen Sie eine YAML-Datei für die Konfigurationszuordnung, die Werte für die OAuth2-Proxy-Einstellungen angibt, die Sie ändern möchten.
apiVersion: v1 kind: ConfigMap metadata: name: oauth2-<App_ID_service_instance_name> namespace: <ingress_resource_namespace> data: auth_logging: <true|false> # Log all authentication attempts. auth_logging_format: # Format for authentication logs. For more info, see https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#logging-configuration cookie_csrf_expire: "15m" # Expiration time for CSRF cookie. Default is "15m". cookie_csrf_per_request: <true|false> # Enable multiple CSRF cookies per request, making it possible to have parallel requests. Default is "false". cookie_domains: # A list of optional domains to force cookies to. The longest domain that matches the request’s host is used. If there is no match for the request’s host, the shortest domain is used. Example: sub.domain.com,example.com cookie_expire: "168h0m0s" # Expiration time for cookies. Default: "168h0m0s". cookie_samesite: "" # SameSite attribute for cookies. Supported values: "lax", "strict", "none", or "". email_domains: "" # Authenticate IDs that use the specified email domain. To authenticate IDs that use any email domain, use "*". Default: "". Example: example.com,example2.com pass_access_token: <true|false> # Pass the OAuth access token to the backend app via the X-Forwarded-Access-Token header. request_logging: <true|false> # Log all requests to the backend app. request_logging_format: # Format for request logs. For more info, see https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#request-log-format scope: # Scope of the OAuth authentication. For more info, see https://oauth.net/2/scope/ set_authorization_header: <true|false> # Set the Authorization Bearer response header when the app responds to the Ingress ALB, such when using the NGINX auth_request mode. set_xauthrequest: <true|false> # Set X-Auth-Request-User, X-Auth-Request-Email, and X-Auth-Request-Preferred-Username response headers when the app responds to the Ingress ALB, such as when using the NGINX auth_request mode. standard_logging: <true|false> # Log standard runtime information. standard_logging_format: # Format for standard logs. For more info, see https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#standard-log-format tls_secret_name: # The name of a secret that contains the server-side TLS certificate and key to enable TLS between the OAuth2-Proxy and the Ingress ALB. By default, the TLS secret defined in your Ingress resources is used. whitelist_domains: # Allowed domains for redirection after authentication. Default: "". Example: example.com,*.example2.com For more info, see: https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#command-line-options oidc_extra_audiences: # Additional audiences which are allowed to pass verification. cookie_refresh: # Refresh the cookie after this duration. Example: "15m". To use this feature, you must enable "Refresh token" for the AppID instance. For more info, see: /docs/appid?topic=appid-managing-idp&interface=ui#idp-token-lifetime ``` 2. Wenden Sie die Konfigurationszuordnungsressource auf das Add-on an. Ihre Änderungen werden automatisch angewendet. ```sh {: pre} kubectl apply -f oauth2-<App_ID_service_instance_name>.yaml ```
Eine Liste der Änderungen für jede Version des ALB- OAuth-Proxy-Add-ons finden Sie im Änderungsprotokoll für das ALB- OAuth-Proxy-Add-on unter IBM Cloud.
Upgrade für ALB-OAuth-Proxy-Add-on durchführen
Um das Add-on ALB- OAuth-Proxy zu aktualisieren, müssen Sie das Add-on zunächst deaktivieren, anschließend wieder aktivieren und die Version angeben.
Der Upgradeprozess verursacht keine Betriebsunterbrechung, da die überwachten OAuth2-Proxy-Instanzen im Cluster verbleiben, wenn das Add-on inaktiviert ist.
- Inaktivieren Sie das -Add-on.
ibmcloud ks cluster addon disable alb-oauth-proxy --cluster CLUSTER_NAME_OR_ID - Listen Sie die verfügbaren Add-on-Versionen auf und entscheiden Sie, welche Version Sie verwenden möchten.
ibmcloud ks cluster addon versions --addon alb-oauth-proxy - Aktivieren Sie das Add-on und geben Sie die Option
--versionan. Wenn Sie keine Version angeben, wird die Standardversion aktiviert.ibmcloud ks cluster addon enable alb-oauth-proxy --cluster CLUSTER_NAME_OR_ID [--version VERSION]
Quellen-IP-Adresse beibehalten
Standardmäßig werden die Quellen-IP-Adressen der Clientanforderungen von der Ingress-ALB nicht beibehalten. Um Quellen-IP-Adressen beizubehalten, können Sie das PROXY-Protokoll in VPC-Clustern aktivieren oder externalTrafficPolicy in klassischen Clustern ändern.
PROXY-Protokoll in VPC-Clustern aktivieren
Um die Quell-IP-Adresse der Client-Anfrage in einem VPC-Cluster zu erhalten, können Sie das PROXY-Protokoll NGINX für alle Load Balancer aktivieren, die Ingress-ALBs in Ihrem Cluster bereitstellen.
-
Optional Führen Sie die folgenden Schritte aus, wenn Sie Cloud Internet Services (CIS) verwenden.
- Aktivieren Sie die Einstellung True client IP header in der Konsole CIS, indem Sie auf Security > Advanced > True client IP header klicken.
- Bearbeiten Sie die
kube-system/ibm-k8s-controller-config configmapund stellen Sieallow-snippet-annotations: "true"ein. - Fügen Sie die Bemerkung
nginx.ingress.kubernetes.io/server-snippet: real_ip_header CF-Connecting-IP;hinzu.
-
Aktivieren Sie das PROXY-Protokoll. Weitere Informationen zu den Parametern dieses Befehls finden Sie in der CLI-Referenz. Nachdem Sie diesen Befehl ausgeführt haben, werden neue Lastausgleichsfunktionen mit der aktualisierten PROXY-Protokollkonfiguration erstellt. Während der Neuerstellung der Lastausgleichsfunktionen müssen in jedem Teilnetz zwei nicht verwendete IP-Adressen für jede Lastausgleichsfunktion verfügbar sein. Sobald diese Lastausgleichsfunktionen erstellt sind, werden die vorhandenen ALB-Lastausgleichsfunktionen gelöscht. Der Prozess zum erneuten Erstellen der Lastausgleichsfunktion kann Serviceunterbrechungen verursachen.
ibmcloud ks ingress lb proxy-protocol enable --cluster CLUSTER_NAME_OR_ID --cidr SUBNET_CIDR --header-timeout TIMEOUT -
Stellen Sie sicher, dass das PROXY-Protokoll für die Lastausgleichsfunktionen aktiviert ist, die ALBs in Ihrem Cluster zugänglich machen.
ibmcloud ks ingress lb get --cluster CLUSTER_NAME_OR_ID -
Um das PROXY-Protokoll später zu inaktivieren, können Sie den folgenden Befehl ausführen:
ibmcloud ks ingress lb proxy-protocol disable --cluster CLUSTER_NAME_OR_ID
externalTrafficPolicy in klassischen Clustern ändern
Die Quellen-IP-Adresse für Clientanforderungen in einem klassischen Cluster beibehalten.
In klassischen Clustern erhöht eine Erhöhung der ALB-Replikatanzahl auf über 2 die Anzahl der Replikate. Wenn externalTrafficPolicy jedoch als Local konfiguriert ist, werden Replikate über 2 nicht verwendet. Im Cluster sind nur zwei Load Balancer-Pods vorhanden (in einer Aktiv-Passiv-Konfiguration). Aufgrund dieser Verkehrsrichtlinie wird der eingehende Datenverkehr nur an den ALB-Pod
auf demselben Knoten weitergeleitet.
Standardmäßig wird die Quellen-IP-Adresse der Clientanforderung nicht beibehalten. Wenn eine Clientanforderung für Ihre App an Ihren Cluster gesendet wird, wird die Anforderung an einen Pod für den Load Balancer-Service weitergeleitet, der die ALB zugänglich macht. Wenn ein App-Pod nicht auf demselben Workerknoten vorhanden ist wie der Lastausgleichsservice-Pod, leitet die Lastausgleichsfunktion die Anforderung an einen App-Pod auf einem anderen Workerknoten weiter. Die Quellen-IP-Adresse des Pakets wird in die öffentliche IP-Adresse des Workerknotens geändert, auf dem der App-Pod ausgeführt wird.
Um die ursprüngliche Quell-IP-Adresse der Client-Anfrage beizubehalten, können Sie die Beibehaltung der Quell-IP aktivieren. Das Beibehalten der IP des Clients ist nützlich, z. B. wenn App-Server Sicherheits- und Zugriffssteuerungsrichtlinien genügen müssen.
Wenn die Beibehaltung der Quell-IP aktiviert ist, leiten Load Balancer den Datenverkehr nicht mehr an einen ALB-Pod auf einem anderen Worker-Knoten weiter, sondern an einen ALB-Pod auf demselben Worker-Knoten. Während dieses Wechsels kann es bei Ihren Apps zu Ausfallzeiten kommen. Wenn Sie eine ALB inaktivieren, gehen alle Änderungen an der Quellen-IP, die Sie an dem LoadBalancer-Service vornehmen, der die ALB bereitstellt, verloren. Wenn Sie die ALB erneut aktivieren, müssen Sie auch die Quellen-IP erneut aktivieren.
Um die Beibehaltung der Quellen-IP zu aktivieren, bearbeiten Sie den LoadBalancer-Service, der eine Ingress-ALB bereitstellt:
-
Aktivieren Sie die Beibehaltung der Quellen-IP für eine einzelne ALB oder für alle ALBs in Ihrem Cluster.
- Gehen Sie wie folgt vor, um die Beibehaltung der Quellen-IP für eine einzelne ALB einzurichten:
-
Rufen Sie die ID der ALB ab, für die Sie die Quellen-IP aktivieren möchten. Die ALB-Services weisen ein Format ähnlich wie
public-cr18e61e63c6e94b658596ca93d087eed9-alb1für eine öffentliche ALB oderprivate-cr18e61e63c6e94b658596ca93d087eed9-alb1für eine private ALB auf.kubectl get svc -n kube-system | grep alb -
Öffnen Sie die YAML-Datei für den Lastausgleichsservice, der die ALB zugänglich macht.
kubectl edit svc <ALB_ID> -n kube-system -
Ändern Sie unter
specden Wert vonexternalTrafficPolicyvonClusterinLocal. -
Speichern und schließen Sie die Konfigurationsdatei. Die Ausgabe ist ähnlich wie die folgende:
service "public-cr18e61e63c6e94b658596ca93d087eed9-alb1" edited
-
- Führen Sie den folgenden Befehl aus, um die Beibehaltung der Quellen-IP für alle öffentlichen ALBs in Ihrem Cluster einzurichten:
kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^public" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Local"}}'; done ``` Beispielausgabe ```sh {: screen} "public-cr18e61e63c6e94b658596ca93d087eed9-alb1", "public-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched ``` * Führen Sie den folgenden Befehl aus, um die Beibehaltung der Quellen-IP für alle privaten ALBs in Ihrem Cluster einzurichten: ```sh {: pre} kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^private" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Local"}}'; done ``` Beispielausgabe ```sh {: screen} "private-cr18e61e63c6e94b658596ca93d087eed9-alb1", "private-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched ``` - Gehen Sie wie folgt vor, um die Beibehaltung der Quellen-IP für eine einzelne ALB einzurichten:
-
Stellen Sie sicher, dass die Quellen-IP in den Pod-Protokollen der ALB beibehalten wird.
- Rufen Sie die ID eines Pods für die ALB ab, die Sie geändert haben.
kubectl get pods -n kube-system | grep alb ``` 2. Öffnen Sie die Protokolle für diesen ALB-Pod. Stellen Sie sicher, dass die IP-Adresse für das Feld `client` die IP-Adresse der Clientanforderung und nicht die Service-IP-Adresse des LoadBalancer-Service ist. ```sh {: pre} kubectl logs <ALB_pod_ID> nginx-ingress -n kube-system ``` -
Wenn Sie nun nach den Headern für die Anforderungen suchen, die an Ihre Back-End-App gesendet wurden, wird die IP-Adresse des Clients im Header
x-forwarded-forangezeigt. -
Wenn Sie die Quellen-IP nicht mehr beibehalten wollen, können Sie die Änderungen, die Sie an dem Service vorgenommen haben, zurücksetzen.
- Gehen Sie wie folgt vor, um die Beibehaltung der Quellen-IP für die öffentlichen ALBs zurückzusetzen:
kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^public" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'; done ``` * Gehen Sie wie folgt vor, um die Beibehaltung der Quellen-IP für die privaten ALBs zurückzusetzen: ```sh {: pre} kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^private" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'; done ```
SSL-Protokolle und SSL-Verschlüsselungen auf HTTP-Ebene konfigurieren
Aktivieren Sie SSL-Protokolle und Verschlüsselungen auf der globalen HTTP-Ebene, indem Sie die Konfigurationszuordnung ibm-k8s-controller-config entsprechend bearbeiten.
Wenn Sie beispielsweise noch ältere Clients haben, die Unterstützung für TLS 1.0 oder 1.1 benötigen, müssen Sie diese TLS-Versionen manuell aktivieren, um nur die Standardeinstellung von TLS 1.2 und TLS 1.3 zu überschreiben.
Wenn Sie die aktivierten Protokolle für alle Hosts angeben, funktionieren die Parameter TLSv1.1 und TLSv1.2 (1.1.13, 1.0.12) nur, wenn OpenSSL 1.0.1 oder eine höhere Version verwendet wird. Der Parameter TLSv1.3 (1.13.0) funktioniert nur, wenn OpenSSL 1.1.1 mit der Unterstützung von TLSv1.3 erstellt und dann verwendet wird.
Gehen Sie wie folgt vor, um die Konfigurationszuordnung zu bearbeiten und SSL-Protokolle und Verschlüsselungen zu aktivieren.
-
Bearbeiten Sie die Konfigurationsdatei für die Konfigurationszuordnungsressource
ibm-k8s-controller-config.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Fügen Sie SSL-Protokolle und Verschlüsselungen hinzu. Formatieren Sie Verschlüsselungsalgorithmen gemäß dem Format der Verschlüsselungsalgorithmenliste der Bibliothek OpenSSL.
apiVersion: v1 data: ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3" ssl-ciphers: "HIGH:!aNULL:!MD5:!CAMELLIA:!AESCCM:!ECDH+CHACHA20" kind: ConfigMap metadata: name: ibm-k8s-controller-config namespace: kube-system -
Speichern Sie die Konfigurationsdatei.
-
Stellen Sie sicher, dass die Änderungen an der Konfigurationszuordnung angewendet wurden. Die Änderungen werden automatisch auf Ihre ALBs angewendet.
kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
Angepasstes Zertifikat an ältere Clients senden
Wenn Sie über traditionelle Einheiten ohne Unterstützung für SNI (Server Name Indication) verfügen und ein angepasstes TLS-Zertifikat in Ihren Ingress-Ressourcen verwenden, müssen Sie die Servereinstellungen der ALB bearbeiten, damit Ihr angepasstes TLS-Zertifikat und der angepasste geheime TLS-Schlüssel verwendet werden.
Wenn Sie einen klassischen Cluster erstellen, wird das LetsEncrypt-Zertifikat standardmäßig für den geheimen Ingress-Schlüssel generiert, der von IBM bereitgestellt wird. Wenn Sie einen angepassten geheimen Schlüssel in Ihrem Cluster erstellen und diesen angepassten geheimen Schlüssel für die TLS-Terminierung in Ihren Ingress-Ressourcen angeben, sendet die Ingress-ALB das Zertifikat für Ihren angepassten geheimen Schlüssel an den Client anstelle des LetsEncrypt-Standardzertifikats. Wenn ein Client SNI jedoch nicht unterstützt, verwendet die Ingress-ALB standardmäßig das LetsEncrypt-Zertifikat an, da der standardmäßig verwendete geheime Schlüssel in den Standardservereinstellungen der ALB aufgelistet ist. Damit Ihr angepasstes Zertifikat an die Einheiten ohne SNI-Unterstützung gesendet wird, führen Sie die folgenden Schritte aus, um in den Standardservereinstellungen der ALB Ihren angepassten geheimen Schlüssel anzugeben.
Die standardmäßig generierten Let' s Encrypt-Zertifikate sind nicht für den Einsatz in Produktionsumgebungen bestimmt. Verwenden Sie für Produktionsworkloads ein eigenes angepasstes Zertifikat.
-
Bearbeiten Sie die Ingress-Ressource
alb-default-server.kubectl edit ingress alb-default-server -n kube-system -
Ändern Sie im Abschnitt
spec.tlsden Wert der Einstellunghosts.secretNamein den Namen Ihres angepassten geheimen Schlüssels, der Ihr angepasstes Zertifikat enthält. Beispiel:spec: rules: ... tls: - hosts: - invalid.mycluster-<hash>-0000.us-south.containers.appdomain.cloud secretName: <custom_secret_name> -
Speichern Sie die Ressourcendatei.
-
Stellen Sie sicher, dass die Ressource jetzt auf den Namen Ihres geheimen Schlüssels verweist. Die Änderungen werden automatisch auf Ihre ALBs angewendet.
kubectl get ingress alb-default-server -n kube-system -o yaml
Feinabstimmung der Verbindungsbehandlung
Die Einstellungen client-header-timeout, client-body-timeout und keep-alive sind wichtige Konfigurationen, die bestimmen, wie lange Verbindungen zwischen Clients, dem Ingress-Controller und den Backend-Servern
aktiv bleiben. Diese Timeouts spielen eine wichtige Rolle bei der Optimierung der Anfragebearbeitung, insbesondere wenn es um lang andauernde Client-Verbindungen und verzögerte Antworten von Backend-Servern geht, und verhindern, dass wertvolle
Ressourcen unnötig belegt werden.
Die client-header-timeout definiert die maximale Zeit, die der Server auf einen vollständigen Client-Header wartet. In ähnlicher Weise gibt client-body-timeout die Dauer an, die der Server darauf wartet, dass der Client
den Hauptteil der Anfrage sendet. Diese beiden Timeouts müssen mit dem Parameter keep-alive übereinstimmen, der festlegt, wie lange der Server eine Verbindung offen hält, während er auf weitere Anfragen wartet. Wenn diese Timeouts
nicht mit der Keep-alive-Einstellung übereinstimmen, beendet NGINX die Verbindung, was zu unerwartetem Client-Verhalten oder Anfragefehlern führen kann.
Sie können diese Parameter in der Datei ConfigMapibm-k8s-controller-config im Namespace kube-system festlegen.
apiVersion: v1
kind: ConfigMap
metadata:
name: ibm-k8s-controller-config
namespace: kube-system
data:
...
client-body-timeout: "100"
client-header-timeout: "100"
keep-alive: "100"
Weitere Informationen finden Sie in der client-header-timeout, client-body-timeout und keep-alive in der Dokumentation zu Ingress Nginx.
Einstellen von Zeitüberschreitungen
Wenn Ihre Cluster mit IBM Cloud Cloud Internet Services (CIS) / Cloudflare exponiert sind und eine Web Application Firewall (WAF) oder einen globalen Lastausgleich verwenden, sollten Sie die Parameter client-header-timeout, client-body-timeout und keep-alive in der Ressource ibm-k8s-controller-config, die sich im Namensraum kube-system befindet, auf Werte von mehr als 900 Sekunden setzen, um vorzeitige Verbindungsabbrüche zu verhindern. Weitere
Informationen finden Sie in der Cloudflare-Dokumentation.
-
Aktualisieren Sie die Parameter
client-header-timeout,client-body-timeoutundkeep-aliveinibm-k8s-controller-configConfigMap innerhalb des Namensraumskube-system. Ein Beispielbefehl zum Einstellen jedes Parameters auf 905 Sekunden lautet wie folgt:kubectl patch cm --patch '{"data": {"client-header-timeout": "905", "client-body-timeout": "905", "keep-alive": "905"}}' --type=merge -n kube-system ibm-k8s-controller-config -
Nur bei VPC-Clustern: Es ist auch erforderlich, die Zeitüberschreitung für den Leerlauf der Verbindung für den VPC-Loadbalancer zu ändern. Stellen Sie die Zeitüberschreitung für den Dienst
public-cr<clusterid>LoadBalancer ein. Ein Beispielbefehl, der den Wert auf 910 Sekunden setzt, lautet wie folgt:kubectl annotate svc -n kube-system public-cr<clusterid> service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout="910"
ALB-Leistung optimieren
Um die Leistung Ihrer Ingress-ALBs zu optimieren, können Sie die Standardeinstellungen entsprechend Ihren Anforderungen ändern.
Protokollpufferung und Flush-Zeitlimit aktivieren
Standardmäßig protokolliert die Ingress-ALB jede Anforderung, wenn sie eintrifft. Bei einer Umgebung mit hoher Auslastung kann das Protokollieren jeder Anforderung bei ihrem Eintreffen eine erhebliche Zunahme der Platten-E/A-Aktivitäten zur
Folge haben. Um kontinuierliche Plattenein-/-ausgabeaktivitäten zu vermeiden, können Sie die Protokollpufferung und das Flush-Zeitlimit für die ALB aktivieren, indem Sie die Ingress-Konfigurationszuordnung ibm-k8s-controller-config bearbeiten. Wenn die Pufferung aktiviert ist, wird nicht für jeden Protokolleintrag eine separate Schreiboperation durchgeführt, sondern die ALB puffert eine Reihe von Einträgen und schreibt sie in einer einzigen Operation in die Datei.
-
Bearbeiten Sie die Konfigurationszuordnung
ibm-k8s-controller-config.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Legen Sie den Schwellenwert fest, ab dem die ALB den Pufferinhalt in das Protokoll schreiben soll.
- Puffergröße: Fügen Sie das Feld
bufferhinzu und legen Sie fest, wie viel Protokollspeicher im Puffer gespeichert werden kann, bevor die ALB den Pufferinhalt in die Protokolldatei schreibt. Wenn zum Beispiel der Standardwert100KBverwendet wird, schreibt die ALB den Pufferinhalt in die Protokolldatei, sobald der Puffer 100 KB des Protokollinhalts enthält. - Zeitintervall: Fügen Sie das Feld
flushhinzu und legen Sie fest, wie häufig die ALB in die Protokolldatei schreiben soll. Wenn zum Beispiel der Standardwert5mverwendet wird, schreibt die ALB alle 5 Minuten den Pufferinhalt in die Protokolldatei. - Zeitintervall oder Puffergröße: Wenn sowohl
flushals auchbufferfestgelegt sind, schreibt die ALB den Pufferinhalt in das Protokoll, abhängig davon, welcher Schwellenwertparameter zuerst erreicht wird.
apiVersion: v1 kind: ConfigMap data: access-log-params: "buffer=100KB, flush=5m" metadata: name: ibm-k8s-controller-config ... - Puffergröße: Fügen Sie das Feld
-
Speichern und schließen Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.
-
Stellen Sie sicher, dass die Protokolle für eine ALB jetzt gepufferte Inhalte enthalten, die entsprechend der von Ihnen festgelegten Speichergröße oder des Zeitintervalls geschrieben werden.
kubectl logs -n kube-system <ALB_ID> -c nginx-ingress
Anzahl oder Dauer der Keepalive-Verbindungen ändern
Keepalive-Verbindungen können eine große Auswirkung auf die Leistung haben, indem sie die CPU- und Netzauslastung zum Öffnen und Schließen von Verbindungen reduzieren. Um die Leistung Ihrer ALBs zu optimieren, können Sie die maximale Anzahl der Keepalive-Verbindungen zwischen der ALB und dem Client ändern und angeben, wie lange die Keepalive-Verbindungen andauern können.
-
Bearbeiten Sie die Konfigurationszuordnung
ibm-k8s-controller-config.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Ändern Sie die Werte von
keep-alive-requestsundkeep-alive.keep-alive-requests: Die Anzahl der Keepalive-Clientverbindungen, die für die Ingress-ALB geöffnet bleiben können. Der Standardwert ist100.keep-alive: Das Zeitlimit in Sekunden, während dessen die Keepalive-Clientverbindung für die Ingress-ALB geöffnet bleibt. Der Standardwert ist75.
apiVersion: v1 data: keep-alive-requests: 100 keep-alive: 75 kind: ConfigMap metadata: name: ibm-k8s-controller-config ... -
Speichern und schließen Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.
-
Stellen Sie sicher, dass die Änderungen an der Konfigurationszuordnung angewendet wurden.
kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
Anzahl der gleichzeitigen Verbindungen oder Workerprozesse ändern
Ändern Sie die Standardeinstellung dafür, wie viele gleichzeitige Verbindungen die NGINX-Workerprozesse für eine ALB verarbeiten können oder wie viele Workerprozesse für eine ALB ausgeführt werden können.
Jede ALB verfügt über NGINX-Workerprozesse, die die Clientverbindungen verarbeiten und mit den Upstream-Servern für die Apps kommunizieren, die von der ALB verfügbar gemacht werden. Wenn Sie die Anzahl der Workerprozesse pro ALB oder die Anzahl
der durch Workerprozesse verarbeiteten Verbindungen ändern, können Sie die maximale Anzahl der Clients verwalten, die eine ALB verarbeiten kann. Berechnen Sie Ihre maximalen Clientverbindungen mit der folgenden Formel: maximum clients = worker_processes * worker_connections.
- Das Feld
max-worker-connectionslegt die maximale Anzahl gleichzeitiger Verbindungen fest, die von den NGINX-Workerprozessen für eine ALB verarbeitet werden können. Der Standardwert ist16384. Beachten Sie, dass der Parametermax-worker-connectionsalle Verbindungen enthält, die die ALB als Proxy verarbeitet, nicht nur Verbindungen mit Clients. Außerdem darf die tatsächliche Anzahl gleichzeitiger Verbindungen den Grenzwert für die maximale Anzahl geöffneter Dateien nicht überschreiten, der durch den Parametermax-worker-open-filesfestgelegt wird. Wenn Sie den Wert vonmax-worker-connectionsauf0setzen, wird stattdessen der Wert fürmax-worker-open-filesverwendet. - Das Feld
worker-processeslegt die maximale Anzahl an NGINX-Workerprozessen für eine ALB fest. Der Standardwert ist"auto". Dieser Wert gibt an, dass die Anzahl der Workerprozesse mit der Anzahl der Kerne auf dem Workerknoten übereinstimmt, in dem die ALB implementiert ist. Sie können diesen Wert in eine Zahl ändern, wenn die Workerprozesse eine hohe Anzahl von E/A-Operationen ausführen müssen.
-
Bearbeiten Sie die Konfigurationszuordnung
ibm-k8s-controller-config.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Ändern Sie den Wert von
max-worker-connectionsoderworker-processes.apiVersion: v1 data: max-worker-connections: 16384 worker-processes: "auto" kind: ConfigMap metadata: name: ibm-k8s-controller-config ... -
Speichern Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.
-
Stellen Sie sicher, dass die Änderungen an der Konfigurationszuordnung angewendet wurden.
kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
Anzahl geöffneter Dateien für Workerprozesse ändern
Ändern Sie den maximalen Standardwert für die Anzahl der Dateien, die von jedem Workerknotenprozess für eine ALB geöffnet werden können.
Jede ALB verfügt über NGINX-Workerprozesse, die die Clientverbindungen verarbeiten und mit den Upstream-Servern für die Apps kommunizieren, die von der ALB verfügbar gemacht werden. Wenn Ihre Workerprozesse die maximale Anzahl der Dateien,
die geöffnet werden können, erreichen, wird möglicherweise ein Fehler Too many open files (Zu viele geöffnete Dateien) in Ihren NGINX-Protokollen angezeigt. Standardmäßig ist der Parameter max-worker-open-files auf 0 gesetzt. Dieser Wert gibt an, dass der Wert aus der folgenden Formel verwendet wird: system limit of maximum open files / worker-processes - 1024. Wenn Sie den Wert in eine andere ganze Zahl ändern, gilt die
Formel nicht mehr.
-
Bearbeiten Sie die Konfigurationszuordnung
ibm-k8s-controller-config.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Ändern Sie den Wert von
max-worker-open-files.apiVersion: v1 data: max-worker-open-files: 0 kind: ConfigMap metadata: name: ibm-k8s-controller-config ... -
Speichern Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.
-
Stellen Sie sicher, dass die Änderungen an der Konfigurationszuordnung angewendet wurden.
kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
Kernelleistung optimieren
Um die Leistung Ihrer Ingress-ALBs zu optimieren, können Sie auch die sysctl Linux-Kernelparameter auf den Workerknoten ändern. Workerknoten werden automatisch mit optimierter
Kerneloptimierung bereitgestellt. Ändern Sie daher diese Einstellungen nur, wenn Sie bestimmte Anforderungen hinsichtlich der Leistungsoptimierung haben.