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

  • 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-config fest.
    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-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 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;
    }

Eingehenden Netzverkehr weiterleiten

Um eingehenden Netzwerkverkehr mit Hilfe eines Sticky-Cookies immer an denselben Upstream-Server zu leiten, verwenden Sie die folgenden Kubernetes Ingress-Ressourcen-Anmerkungen.

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.

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.

  1. Erstellen Sie eine tcp-services-ConfigMap, um Ihren TCP-Port anzugeben (z. B. folgende Beispielports). Informationen zu den Anforderungen des ConfigMap,tcp-services finden Sie in diesem 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

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.

  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`.
    
    ```sh {: pre}
        kubectl get svc -n kube-system | grep LoadBalancer
        ```
    

Erstellen einer ConfigMap, um die Ingress-Bereitstellung anzupassen

  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>", "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 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".
    tolerations
    Geben Sie zusätzliche benutzerdefinierte Toleranzen für die ALB-Pods an. Weitere Informationen finden Sie unter Taints und Tolerationen.
  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.
    
    ```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.

  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 ist, wird der Benutzer nicht authentifiziert, erhält jedoch ein Zugriffstoken für den anonymen Zugriff auf die App.
    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 der ConfigMap für OAuth2-Proxy einstellen. 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 Dienstschlüssel für die Dienstinstanz. Alternativ können Sie die Option --key angeben, 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>
    
  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.
    ```sh {: pre}
        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.
    ```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.
    
    
  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.
    ```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.

  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 PROXY-Protokoll NGINX 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 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:

  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
    
        ```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
        ```
    
  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.
    ```sh {: pre}
        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:
    ```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.

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

  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.