IBM Cloud Docs
ALB-Routing anpassen

ALB-Routing anpassen

Ändern Sie die Standardeinstellungen für ALBs, die das Ingress-Image für Kubernetes ausführen.

Manchmal können Sie das Routing für Ingress anpassen, indem Sie Kubernetes NGINX-Annotationen (nginx.ingress.kubernetes.io/<annotation>) hinzufügen. Kubernetes NGINX-Annotationen werden immer auf alle Servicepfade in der Ressource angewendet und Sie können in den Annotationen keine Servicenamen angeben. Benutzerdefinierte IBM Cloud Kubernetes Service Anmerkungen (ingress.bluemix.net/<annotation>) werden nicht unterstützt.

Kubernetes Ingress Controller (ALBs) auf Clustern, die am oder nach dem 31. Januar 2022 erstellt werden, 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" im ALB ConfigMap bereitgestellt werden. Wenn Sie hier empfohlene Konfigurationssnippets hinzufügen, müssen Sie die ConfigMap (kube-system/ibm-k8s-controller-config) der ALB bearbeiten und allow-snippet-annotations: "false" in allow-snippet-annotations: "true" ändern.

Server-Port zu einem Host-Header hinzufügen

Um einen Server-Port zur Clientanforderung hinzuzufügen, bevor die Anforderung an Ihre Back-End-App weitergeleitet wird, konfigurieren Sie einen Proxy für externe Services in einer Serverausschnittsannotation oder als Feld ibm-k8s-controller-config ConfigMap .

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 Apps zu erzwingen, indem Sie bestimmte Ingress-Felder für Kubernetes ändern. Weitere Informationen finden Sie unter App ID-Authentifizierung zu Apps hinzufügen.

Maximale Größe des Clientanforderungshauptteils festlegen

Verwenden Sie die folgende Kubernetes Ingress resource , um die maximale Größe des Hauptteils festzulegen, die der Client als Teil einer Anforderung senden kann.

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 von Verbindungs- und Lesezeitüberschreitungen

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 ausführen kann, legen Sie die custom-http-errors Feld.

Ä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 dem folgenden Kubernetes Ingress ibm-ingress-deploy-config ConfigMap Felder.

Beispielfeldeinstellung.

httpPort=8080
httpsPort=8443

Anforderungsheader anpassen

Um einer Clientanforderung Headerinformationen hinzuzufügen, bevor die Anforderung an Ihre Back-End-App weitergeleitet wird, verwenden Sie das folgende Kubernetes ibm-k8s-controller-config configmap .

proxy-set-headers: "ingress-nginx/custom-headers"

Die Anforderungen für custom-headers ConfigMap 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 Pfaddefinitionen zu externen Diensten

Wenn Sie Pfaddefinitionen zu externen Services hinzufügen möchten, z. B. zu in IBM Cloudgehosteten Services, konfigurieren Sie einen Proxy zu externen Services in einem Positionssnippet. Oder ersetzen Sie den Proxy durch eine permanente Umleitung zu externen Services.

Unsichere Anforderungen umleiten

Standardmäßig werden unsichere HTTP-Clientanfragen an HTTPS umgeleitet. Verwenden Sie das folgende Feld und die folgende Anmerkung, um diese Einstellung zu inaktivieren.

  • ibm-k8s-controller-config Feld ConfigMap
    ssl-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.

  • Um das maximale Alter und die Subdomain-Granularität hinzuzufügen, siehe diesen NGINX-Blog.
  • Um sie zu deaktivieren, setzen Sie das Feld ibm-k8s-controller-config configmap.
    hsts: false
    

Maximale Anzahl von Keepalive-Anforderungen festlegen

Um die maximale Anzahl Anforderungen festzulegen, die über eine Keepalive-Verbindung bedient werden können, verwenden Sie das folgende Kubernetes ibm-k8s-controller-config configmap .

keep-alive-requests: 100

Der Standardwert für keep-alive-requests in Kubernetes Ingress ist 100, was viel weniger ist als der Standardwert von 4096 in IBM Cloud Kubernetes Service Ingress. 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 geöffnet bleibt, verwenden Sie das folgende Feld Kubernetes ibm-k8s-controller-config configmap .

keep-alive: 60

Maximale Anzahl großer Client-Header-Puffer festlegen

Um die maximale Anzahl und Größe der Puffer festzulegen, die große Clientanforderungsheader lesen, verwenden Sie das folgende Kubernetes ibm-k8s-controller-config configmap .

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 Anforderungs-URI mit dem App-Pfad abgleicht, verwenden Sie die folgende Kubernetes Ingress resource .

nginx.ingress.kubernetes.io/use-regex: "true"

Weitere Informationen finden Sie in diesem Blog.

Angepasste Positionsblockkonfigurationen hinzufügen

Verwenden Sie die folgende Kubernetes Ingress resource , um eine angepasste Positionsblockkonfiguration für einen Service hinzuzufügen.

nginx.ingress.kubernetes.io/configuration-snippet: |
    more_set_headers "Request-Id: $req_id";

Gegenseitige Authentifizierung konfigurieren

Um die gegenseitige Authentifizierung für die ALB zu konfigurieren, verwenden Sie die folgenden Kubernetes Ingress resource . 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

Verwenden Sie die folgende Kubernetes Ingress resource , um die Größe des Proxy-Puffers zu konfigurieren, der den ersten Teil der Antwort liest.

nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"

Proxy-Puffernummern konfigurieren

Verwenden Sie die folgende Kubernetes Ingress resource , um die Anzahl der Proxy-Puffer für die ALB zu konfigurieren.

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 den NGINX-Dokumenten.

Konfigurieren, wann eine ALB eine Anforderung übergeben kann

Um festzulegen, wann die ALB eine Anforderung an den nächsten Upstream-Server übergeben kann, verwenden Sie die folgenden Kubernetes-Ingress-Felder.

  • Globale Einstellung: ibm-k8s-controller-config ConfigMap 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 Back-End-Endanwendung entfernen, bevor die Antwort an den Client gesendet wird. Konfigurieren Sie das Entfernen des Antwortheaders in einem Positionssnippetoder verwenden Sie das Feld proxy_hide_header als Konfigurationssnippet in der ibm-k8s-controller-config ConfigMap.

Pfade neu schreiben

Verwenden Sie die folgende Kubernetes Ingress resource , um eingehenden Netzverkehr in einem ALB-Domänenpfad an einen anderen Pfad weiterzuleiten, den Ihre Back-End-App überwacht.

nginx.ingress.kubernetes.io/rewrite-target: /newpath

Serverblockkonfigurationen anpassen

Verwenden Sie die folgende Kubernetes Ingress resource , um eine angepasste Serverblockkonfiguration hinzuzufügen.

nginx.ingress.kubernetes.io/server-snippet: |
    location = /health {
    return 200 'Healthy';
    add_header Content-Type text/plain;
    }

Eingehenden Netzverkehr weiterleiten

Um eingehenden Netzverkehr immer unter Verwendung eines permanenten Cookies an denselben Upstream-Server weiterzuleiten, verwenden Sie die folgenden Kubernetes Ingress-Ressourcen .

nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "cookie_name1"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/configuration-snippet: |
  more_set_headers "Set-Cookie: HttpOnly";

Der Kubernetes Ingress-Controller fügt den permanenten Cookies standardmäßig die Attribute Secure und HttpOnly hinzu, die nicht geändert werden können.

SSL-Services-Unterstützung zum Verschlüsseln von Datenverkehr zulassen

Um SSL-Diensten die Verschlüsselung des Datenverkehrs zu Ihren Upstream-Apps zu ermöglichen, die HTTPS erfordern, verwenden Sie die Kubernetes Ingress-Ressourcen -Backend-Protokollannotation und die Backend-Zertifikatauthentifizierungsannotationen.

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

Mit vom Standard abweichenden TCP-Ports auf Apps zugreifen

Führen Sie die folgenden Schritte aus, um über einen vom Standard abweichenden TCP-Port auf eine App zuzugreifen:

  1. Erstellen Sie eine tcp-services-ConfigMap, um Ihren TCP-Port anzugeben (z. B. folgende Beispielports). Zu den Anforderungen der Website tcp-services ConfigMap, siehe diesen Blog.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tcp-services
      namespace: kube-system
    data:
      9000: "<namespace>/<service>:8080"
    
  2. Erstellen Sie die Konfigurationszuordnung im Namensbereich kube-system.

    kubectl apply -f tcp-services.yaml -n kube-system
    
  3. Geben Sie die tcp-services-Konfigurationszuordnung als Feld in der ibm-ingress-deploy-config-Konfigurationszuordnung an.

    "tcpServicesConfig":"kube-system/tcp-services"
    
  4. Ändern Sie jeden ALB-Service, um die Ports hinzuzufügen.

Maximale Anzahl vorgeschalteter Keepalive-Anforderungen festlegen

Zum Festlegen der maximalen Anzahl von Anforderungen, 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 App geöffnet bleibt, verwenden Sie das folgende Kubernetes ibm-k8s-controller-config configmap .

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.

  1. 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.

      kubectl get svc -n kube-system | grep LoadBalancer
      

Erstellen einer ConfigMap zum Anpassen der Ingress-Bereitstellung

  1. 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>"}'
      <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>"}'
    
    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 404 generiert. 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_name konfiguriert sind. Sie können den geheimen Schlüssel mit dem Befehl ibmcloud ks ingress secret create erstellen. Wenn im Abschnitt spec.tls einer 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-name ein. 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-nginx oder private-iks-k8s-nginx in 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 in NGINX anzuzeigen.
    3: Zeigt die Details zu Änderungen des Service, der Ingress-Regel und des Endpunkts im JSON-Format an.
    5: Konfiguriert NGINX im 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".
  2. Erstellen Sie die Konfigurationszuordnung ibm-ingress-deploy-config in Ihrem Cluster.

    kubectl create -f ibm-ingress-deploy-config.yaml
    
  3. 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>
    
  4. Wenn Sie HTTP-, HTTPS- oder TCP-Ports angegeben haben, die nicht Standardports sind, müssen Sie die Ports für jeden ALB-Service öffnen.

    1. 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.

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

Erzwingen Sie die Authentifizierung für Ihre Anwendungen durch die Konfiguration von Ingress mit IBM Cloud App ID.

  1. 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:
      1. 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.
      2. Wählen Sie die Region aus, in der Ihr Cluster implementiert ist.
      3. Klicken Sie auf Erstellen.
  2. 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.

    1. Navigieren Sie in der App ID-Managementkonsole zu Authentifizierung verwalten.
    2. Stellen Sie sicher, dass Sie auf der Registerkarte Identitätsprovider einen Identitätsprovider ausgewählt haben. Wenn kein Identitätsanbieter ausgewählt wird, wird der Benutzer nicht authentifiziert, sondern erhält ein Zugriffstoken für den anonymen Zugriff auf die Anwendung.
    3. Fügen Sie auf der Registerkarte Authentifizierungseinstellungen Umleitungs-URLs für Ihre App im Format https://<hostname>/oauth2-<App_ID_service_instance_name>/callback hinzu. 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_out im Format https://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out an 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 Sie whitelist_domains in ConfigMap für OAuth2-Proxy festlegen. Rufen Sie den Endpunkt https://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out mit dem Abfrageparameter rd auf oder legen Sie den Header X-Auth-Request-Redirect mit Ihrer angepassten Abmeldeseite fest. Weitere Informationen finden Sie unter Abmelden.

  3. Binden Sie die App ID-Serviceinstanz an den Cluster. Der Befehl erstellt einen Serviceschlüssel für die Serviceinstanz, oder Sie können die Option --key angeben, um vorhandene Anmeldeinformationen für den Serviceschlü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>
    
  4. 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-.

    1. 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.
      ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>
      
  5. 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.annotations hinzu:

    1. Fügen Sie die folgende Annotation auth-url hinzu. 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.

      ...
      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 über ID- und Zugriffstoken finden Sie in der Dokumentation App ID.

      • Um nur die ID Token zu senden, fügen Sie die folgende Anmerkung hinzu:

        ...
        annotations:
            nginx.ingress.kubernetes.io/auth-response-headers: Authorization
        ...
        
      • Um nur die Access Token zu senden, fügen Sie die folgenden Informationen in die Anmerkung configuration-snippet ein. (Dadurch wird das Snippet aus Schritt 5.2erweitert).

        ...
        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 die Access Token und die ID Token zu senden, fügen Sie der Anmerkung configuration-snippet die folgenden Informationen hinzu. (Dadurch wird das Snippet aus Schritt 5.2erweitert).

        ...
         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 und/oder die API-Strategie 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 Serviceinstanz in Kleinbuchstaben geschrieben werden 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.
  6. 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
    
  7. 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.
  8. 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.

  9. Optional: Sie können das Standardverhalten des OAuth2-Proxys anpassen, indem Sie eine Kubernetes-Konfigurationszuordnung erstellen.

    1. 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.
      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 des IBM Cloud ALB OAuth Proxy-Add-ons.

Upgrade für ALB-OAuth-Proxy-Add-on durchführen

Um das ALB OAuth Proxy Add-on zu aktualisieren, müssen Sie das Add-on zunächst deaktivieren, dann 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.

  1. Inaktivieren Sie das -Add-on.
    ibmcloud ks cluster addon disable alb-oauth-proxy --cluster <cluster_name_or_ID>
    
  2. 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
    
  3. Aktivieren Sie das Add-on und geben Sie die Option --version an. 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 NGINX PROXY-Protokoll für alle Load Balancer aktivieren, die Ingress ALBs in Ihrem Cluster bereitstellen.

  1. Optional Führen Sie die folgenden Schritte aus, wenn Sie Cloud Internet Services (CIS) verwenden.

    1. Aktivieren Sie die Einstellung True client IP header in der Konsole CIS, indem Sie auf Security > Advanced > True client IP header klicken.
    2. Bearbeiten Sie die kube-system/ibm-k8s-controller-config configmap und stellen Sie allow-snippet-annotations: "true" ein.
    3. Fügen Sie die Bemerkung nginx.ingress.kubernetes.io/server-snippet: real_ip_header CF-Connecting-IP; hinzu.
  2. 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>
    
  3. 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>
    
  4. 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 zu erhalten, können Sie die Quell-IP-Erhaltung aktivieren. Das Beibehalten der IP des Clients ist nützlich, z. B. wenn App-Server Sicherheits- und Zugriffssteuerungsrichtlinien genügen müssen.

Wenn die Quell-IP-Erhaltung aktiviert ist, wechseln die Load Balancer von der Weiterleitung des Datenverkehrs an einen ALB-Pod auf einem anderen Arbeitsknoten zu einem ALB-Pod auf demselben Arbeitsknoten. 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:

  1. 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:

      1. 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-alb1 für eine öffentliche ALB oder private-cr18e61e63c6e94b658596ca93d087eed9-alb1 für eine private ALB auf.

        kubectl get svc -n kube-system | grep alb
        
      2. Öffnen Sie die YAML-Datei für den Lastausgleichsservice, der die ALB zugänglich macht.

        kubectl edit svc <ALB_ID> -n kube-system
        
      3. Ändern Sie unter spec den Wert von externalTrafficPolicy von Cluster in Local.

      4. 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

      "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:

      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

      "private-cr18e61e63c6e94b658596ca93d087eed9-alb1", "private-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched
      
  2. Stellen Sie sicher, dass die Quellen-IP in den Pod-Protokollen der ALB beibehalten wird.

    1. 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.
      kubectl logs <ALB_pod_ID> nginx-ingress -n kube-system
      
  3. 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-for angezeigt.

  4. 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:
      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.

  1. Bearbeiten Sie die Konfigurationsdatei für die Konfigurationszuordnungsressource ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Fügen Sie SSL-Protokolle und Verschlüsselungen hinzu. Formatieren Sie die Chiffren entsprechend dem Format der Chiffrierliste 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
    
  3. Speichern Sie die Konfigurationsdatei.

  4. 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.

  1. Bearbeiten Sie die Ingress-Ressource alb-default-server.

    kubectl edit ingress alb-default-server -n kube-system
    
  2. Ändern Sie im Abschnitt spec.tls den Wert der Einstellung hosts.secretName in 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>
    
  3. Speichern Sie die Ressourcendatei.

  4. 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 die oben genannten Parameter in ibm-k8s-controller-config ConfigMap im Namensraum kube-system einstellen.

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 einstellen, um vorzeitige Verbindungsabbrüche zu verhindern. Weitere Informationen finden Sie in der Cloudflare-Dokumentation.

  1. Aktualisieren Sie die Parameter client-header-timeout, client-body-timeout und keep-alive in ibm-k8s-controller-config ConfigMap innerhalb des Namensraums kube-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
    
  2. 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.

  1. Bearbeiten Sie die Konfigurationszuordnung ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Legen Sie den Schwellenwert fest, ab dem die ALB den Pufferinhalt in das Protokoll schreiben soll.

    • Puffergröße: Fügen Sie das Feld buffer hinzu 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 Standardwert 100KB verwendet wird, schreibt die ALB den Pufferinhalt in die Protokolldatei, sobald der Puffer 100 KB des Protokollinhalts enthält.
    • Zeitintervall: Fügen Sie das Feld flush hinzu und legen Sie fest, wie häufig die ALB in die Protokolldatei schreiben soll. Wenn zum Beispiel der Standardwert 5m verwendet wird, schreibt die ALB alle 5 Minuten den Pufferinhalt in die Protokolldatei.
    • Zeitintervall oder Puffergröße: Wenn sowohl flush als auch buffer festgelegt 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
    ...
    
  3. Speichern und schließen Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.

  4. 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.

  1. Bearbeiten Sie die Konfigurationszuordnung ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Ändern Sie die Werte von keep-alive-requests und keep-alive.

    • keep-alive-requests: Die Anzahl der Keepalive-Clientverbindungen, die für die Ingress-ALB geöffnet bleiben können. Der Standardwert ist 100.
    • keep-alive: Das Zeitlimit in Sekunden, während dessen die Keepalive-Clientverbindung für die Ingress-ALB geöffnet bleibt. Der Standardwert ist 75.
    apiVersion: v1
    data:
      keep-alive-requests: 100
      keep-alive: 75
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Speichern und schließen Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.

  4. 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-connections legt die maximale Anzahl gleichzeitiger Verbindungen fest, die von den NGINX-Workerprozessen für eine ALB verarbeitet werden können. Der Standardwert ist 16384. Beachten Sie, dass der Parameter max-worker-connections alle 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 Parameter max-worker-open-files festgelegt wird. Wenn Sie den Wert von max-worker-connections auf 0 setzen, wird stattdessen der Wert für max-worker-open-files verwendet.
  • Das Feld worker-processes legt 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.
  1. Bearbeiten Sie die Konfigurationszuordnung ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Ändern Sie den Wert von max-worker-connections oder worker-processes.

    apiVersion: v1
    data:
      max-worker-connections: 16384
      worker-processes: "auto"
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Speichern Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.

  4. 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.

  1. Bearbeiten Sie die Konfigurationszuordnung ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Ä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
      ...
    
  3. Speichern Sie die Konfigurationsdatei. Die Änderungen werden automatisch auf Ihre ALBs angewendet.

  4. 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.