IBM Cloud Docs
Personnalisation du routage ALB

Personnalisation du routage ALB

Modifiez les paramètres par défaut des équilibreurs de charge d'application qui exécutent l'image Ingress Kubernetes.

Parfois, vous pouvez personnaliser le routage pour Ingress en ajoutant des Kubernetes NGINX (nginx.ingress.kubernetes.io/<annotation>). Kubernetes Les annotations NGINX sont toujours appliquées à tous les chemins de service de la ressource et vous ne pouvez pas spécifier de noms de service dans les annotations. Annotations personnalisées IBM Cloud Kubernetes Service (ingress.bluemix.net/<annotation> ) ne sont pas pris en charge.

Kubernetes Les contrôleurs d'ingestion (ALB) des clusters créés à partir du 31 janvier 2022 ne traitent pas par défaut les ressources d'ingestion comportant des annotations de type "snippet" (par exemple, nginx.ingress.kubernetes.io/configuration-snippet), car tous les nouveaux clusters sont déployés avec la configuration allow-snippet-annotations: "false" dans l'ALB ConfigMap. Si vous ajoutez des fragments de configuration recommandés ici, vous devez éditer la ConfigMap de l'équilibreur de charge d'application (kube-system/ibm-k8s-controller-config) et remplacer allow-snippet-annotations: "false" par allow-snippet-annotations: "true".

Ajout d'un port de serveur à un en-tête d'hôte

Pour ajouter un port de serveur à la demande du client avant que la demande ne soit transmise à votre application de back end, configurez un proxy vers des services externes dans une annotation de fragment de serveur ou en tant que zone ibm-k8s-controller-config ConfigMap .

Routage des demandes entrantes avec un équilibreur de charge d'application privé

Pour acheminer les demandes entrantes vers vos applications avec un équilibreur de charge d'application privé, spécifiez l'annotation de classe private-iks-k8s-nginx dans la ressource Ingress. Les équilibreurs de charge d'application privés sont configurés pour utiliser des ressources avec cette classe.

kubernetes.io/ingress.class: "private-iks-k8s-nginx"

Authentification des applications avec App ID

Configurez Ingress avec IBM Cloud App ID pour appliquer l'authentification pour vos applications en modifiant des zones Ingress Kubernetes spécifiques. Pour plus d'informations, voir Ajout de l'authentification App ID aux applications.

Définition de la taille maximale du corps de la demande client

Pour définir la taille maximale du corps que le client peut envoyer dans le cadre d'une demande, utilisez l'annotation Kubernetes Ingress resource suivante.

nginx.ingress.kubernetes.io/proxy-body-size: 8m

Activation et désactivation de la mise en mémoire tampon des données de réponse client

Vous pouvez désactiver ou activer le stockage des données de réponse sur l'ALB pendant que les données sont envoyées au client. Par défaut, ce paramètre est désactivé. Pour l'activer, définissez l'annotationde ressource Ingress suivante:

nginx.ingress.kubernetes.io/proxy-buffering: "on"

Personnalisation des délais de connexion et de lecture

Pour définir la durée pendant laquelle l'équilibreur de charge d'application attend de se connecter à l'application de back end et de la lire avant de la considérer comme non disponible, utilisez les annotationssuivantes.

nginx.ingress.kubernetes.io/proxy-connect-timeout: 62
nginx.ingress.kubernetes.io/proxy-read-timeout: 62

Personnalisation des actions d'erreur

Pour indiquer les actions personnalisées que l'ALB peut entreprendre pour des erreurs d' HTTP s spécifiques, définissez le champ « custom-http-errors ».

Modification des ports par défaut HTTP et HTTPS

Pour modifier les ports par défaut pour le trafic réseau HTTP (port 80) et HTTPS (port 443), modifiez chaque service ALB avec l' Kubernetes suivante dans les champs Ingress ibm-ingress-deploy-config ConfigMap.

Exemple de paramètre de zone.

httpPort=8080
httpsPort=8443

Personnalisation de l'en-tête de demande

Pour ajouter des informations d'en-tête à une demande client avant de transmettre la demande à votre application de back end, utilisez la zone Kubernetes ibm-k8s-controller-config configmap suivante:

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

Pour les exigences de custom-headers ConfigMap, voir cet exemple.

Personnalisation de l'en-tête de réponse

Pour ajouter des informations d'en-tête à une réponse client avant de l'envoyer au client, utilisez l'annotationsuivante.

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

Ajouter des définitions de chemin aux services externes

Pour ajouter des définitions de chemin à des services externes, tels que des services hébergés dans IBM Cloud, configurez un proxy vers des services externes dans un fragment d'emplacement. Ou bien, remplacez le proxy par une redirection permanente vers des services externes.

Redirection des demandes non sécurisées

Par défaut, les requêtes client non sécurisées d' HTTP s sont redirigées vers HTTPS. Pour désactiver ce paramètre, utilisez la zone et l'annotation suivantes.

  • ibm-k8s-controller-config Zone ConfigMap
    ssl-redirect: "false"
    
  • Annotationde ressource Ingress:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    

Activation et désactivation de l' HTTP Sécurité de transport stricte

Définissez le navigateur pour accéder au domaine uniquement à l'aide de HTTPS. Cette option est activée par défaut.

  • Pour ajouter l'âge maximum et la granularité des sous-domaines, voir ce blog NGINX.
  • Pour le désactiver, définissez le champ ibm-k8s-controller-config configmap.
    hsts: false
    

Définition d'un nombre maximal de demandes de signal de présence

Pour définir le nombre maximal de demandes pouvant être traitées via une connexion persistante, utilisez la zone Kubernetes ibm-k8s-controller-config configmap suivante.

keep-alive-requests: 100

La valeur par défaut de keep-alive-requests dans Kubernetes Ingress est 100, ce qui est beaucoup moins que la valeur par défaut de 4096 dans IBM Cloud Kubernetes Service Ingress. Si vous avez migré votre configuration Ingress depuis IBM Cloud Kubernetes Service Ingress vers Kubernetes Ingress, il vous faudra peut-être modifier keep-alive-requests pour réussir les tests de performance existants.

Définition d'un délai maximal de demande de signal de présence

Pour définir la durée maximale pendant laquelle une connexion persistante reste ouverte entre le client et le serveur proxy ALB, utilisez la zone Kubernetes ibm-k8s-controller-config configmap suivante.

keep-alive: 60

Définition d'un nombre maximal de mémoires tampon d'en-tête de client de grande taille

Pour définir le nombre maximal et la taille des mémoires tampon qui lisent les en-têtes de demande client volumineux, utilisez la zone Kubernetes ibm-k8s-controller-config configmap suivante.

large-client-header-buffers: 4 8k

Modification de la façon dont l'équilibreur de charge d'application correspond à l'URI de la demande

Pour modifier la façon dont l'équilibreur de charge d'application met en correspondance l'URI de la demande avec le chemin d'application, utilisez l'annotation Kubernetes Ingress resource suivante.

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

Pour plus d'informations, voir ce blogue.

Ajout de configurations de blocs d'emplacement personnalisées

Pour ajouter une configuration de bloc d'emplacement personnalisé pour un service, utilisez l'annotation Kubernetes Ingress resource suivante.

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

Configuration de l'authentification mutuelle

Pour configurer l'authentification mutuelle pour l'équilibreur de charge d'application, utilisez la Kubernetes ressource Ingress annotationssuivante. Notez que l'authentification mutuelle ne peut pas être appliquée aux ports personnalisés et doit être appliquée au port HTTPS.

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"

Configuration de la taille de mémoire tampon du proxy

Pour configurer la taille de la mémoire tampon de proxy qui lit la première partie de la réponse, utilisez l'annotation Kubernetes Ingress resource suivante.

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

Configuration des numéros de mémoire tampon de proxy

Pour configurer le nombre de mémoires tampon de proxy pour l'équilibreur de charge d'application, utilisez l'annotation Kubernetes Ingress resource suivante.

nginx.ingress.kubernetes.io/proxy-buffers-number: "4"

Configuration de la taille de la mémoire tampon du proxy occupée

Pour configurer la taille des mémoires tampon de proxy pouvant être occupées, utilisez un fragment d'emplacement. Pour plus d'informations, voir la documentation de NGINX.

Configuration lorsqu'un équilibreur de charge d'application peut transmettre une demande

Pour définir quand l'équilibreur de charge d'application peut transmettre une demande au prochain serveur en amont, utilisez les zones Kubernetes Ingress suivantes.

  • Paramètre global: ibm-k8s-controller-config ConfigMap zones:

    retry-non-idempotent: true
    proxy-next-upstream: error timeout http_500
    
  • Paramètre par ressource: annotationsde ressource Ingress:

    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
    

Limitation de débit

Pour limiter le débit de traitement des demandes et le nombre de connexions par clé définie pour les services, utilisez les annotations de limitation de débitde la ressource Ingress.

Suppression de l'en-tête de réponse

Vous pouvez supprimer les informations d'en-tête qui sont incluses dans la réponse du client à partir de l'application finale back-end avant que la réponse ne soit envoyée au client. Configurez la suppression de l'en-tête de réponse dans un fragment d'emplacementou utilisez la zone proxy_hide_header en tant que fragment de configuration dans ibm-k8s-controller-config ConfigMap.

Réécriture des chemins

Pour acheminer le trafic réseau entrant sur un chemin de domaine ALB vers un autre chemin sur lequel votre application de back end est à l'écoute, utilisez l'annotation Kubernetes Ingress resource suivante.

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

Personnalisation des configurations de bloc serveur

Pour ajouter une configuration de bloc de serveur personnalisé, utilisez l'annotation Kubernetes Ingress resource suivante.

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

Routage du trafic réseau entrant

Pour toujours router le trafic réseau entrant vers le même serveur en amont à l'aide d'un cookie de maintien de routage, utilisez la Kubernetes ressource Ingress annotationssuivante.

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

Le contrôleur Kubernetes Ingress ajoute les attributs Secure et HttpOnly aux cookies persistants par défaut qui ne peuvent pas être modifiés.

Autorisation de la prise en charge des services SSL pour chiffrer le trafic

Pour permettre aux services SSL de prendre en charge le chiffrement du trafic vers vos applications en amont qui nécessitent HTTPS, utilisez l'annotation de protocole backend de ressource Kubernetes Ingress et les annotations d'authentification de certificat backend.

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

Accès aux applications avec des ports TCP non standard

Pour accéder à une application via un port TCP non standard, procédez comme suit.

  1. Créez une mappe de configuration (configmap) tcp-services pour spécifier votre port TCP (voir les exemples de port suivants). Pour les exigences du site tcp-services ConfigMap,, voir ce blog.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tcp-services
      namespace: kube-system
    data:
      9000: "<namespace>/<service>:8080"
    
  2. Créez la mappe de configuration dans l'espace de noms kube-system.

    kubectl apply -f tcp-services.yaml -n kube-system
    
  3. Spécifiez la mappe de configuration tcp-services en tant que zone dans la mappe de configuration ibm-ingress-deploy-config.

    "tcpServicesConfig":"kube-system/tcp-services"
    
  4. Modifiez chaque service d'équilibreur de charge d'application pour ajouter les ports.

Définition d'un nombre maximal de demandes de signal de présence en amont

Pour définir le nombre maximal de demandes pouvant être traitées via une connexion persistante, utilisez la zone Kubernetes ibm-k8s-controller-config ConfigMap suivante.

upstream-keepalive-requests: 32

Définition du délai d'attente maximal de signal de présence en amont

Pour définir la durée maximale pendant laquelle une connexion persistante reste ouverte entre le serveur proxy ALB et le serveur en amont de votre application, utilisez la zone Kubernetes ibm-k8s-controller-config configmap suivante.

upstream-keepalive-timeout: 32

Personnalisation du déploiement d'équilibreur de charge d'application

Personnalisez le déploiement des équilibreurs de charge d'application qui exécutent l'image Kubernetes Ingress en créant une mappe de configuration ibm-ingress-deploy-config.

  1. Récupérez les noms des services qui exposent chaque équilibreur de charge d'application.

    • Clusters classiques :

      kubectl get svc -n kube-system | grep alb
      
    • Clusters VPC : dans la sortie, recherchez un nom de service formaté de la manière suivante public-crc204dl7w0qf6n6sp7tug.

      kubectl get svc -n kube-system | grep LoadBalancer
      

Création d'un site ConfigMap pour personnaliser le déploiement d'Ingress

  1. Créez un fichier YAML pour une mappe de configuration ibm-ingress-deploy-config. Pour chaque ID d'équilibreur de charge d'application, vous pouvez indiquer un ou plusieurs des paramètres facultatifs spécifiés ci-après. Notez que vous ne pouvez spécifier que les paramètres que vous souhaitez configurer, et n'avez pas besoin de spécifier tous les paramètres.

    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
    Activez ou désactivez l'inspecteur en profondeur de la sécurité des objets Ingress. Lorsqu'ils sont activés, les équilibreurs de charge d'application inspectent les valeurs de configuration dans les ressources Ingress avant le traitement. Pour plus d'informations, voir le code source ingress-nginx.
    Cette fonction est disponible pour les versions d'équilibreur de charge d'application 1.2.0 et ultérieures et activée par défaut.
    defaultBackendService
    Indiquez le nom d'un service par défaut facultatif pour recevoir des demandes lorsque aucun hôte n'est configuré ou qu'aucun hôte correspondant n'est trouvé. Ce service remplace le service par défaut fourni par IBM qui génère un message 404. Vous pouvez utiliser ce service pour configurer des pages d'erreur personnalisées ou tester des connexions.
    defaultCertificate
    Secret d'un certificat TLS par défaut à appliquer à tout sous-domaine configuré avec des équilibreurs de charge d'application Ingress au format secret_namespace/secret_name. Pour créer un secret, vous pouvez exécuter la commande ibmcloud ks ingress secret create. Si un secret pour un autre certificat TLS est spécifié dans la section spec.tls d'une ressource Ingress, et qu'il existe dans le même espace de noms que la ressource Ingress, celui-ci est appliqué à la place du secret par défaut.
    defaultConfig
    Spécifiez une mappe de configuration par défaut pour vos équilibreurs de charge d'application. Entrez l'emplacement de la mappe de configuration à utiliser au format namespace/configmap-name. Par exemple, kube-system/ibm-k8s-controller-config.
    enableAnnotationValidation
    Activez ou désactivez la validation des annotations d'objet Ingress. Lorsque cette option est activée, les équilibreurs de charge d'application valident les valeurs d'annotation dans les ressources Ingress avant le traitement. Pour plus d'informations, voir le code source ingress-nginx.
    Cette fonction est disponible pour les versions d'équilibreur de charge d'application 1.9.0 et ultérieures et activée par défaut.
    enableSslPassthrough
    Activer le passe-système SSL activé pour l'équilibreur de charge d'application. La connexion TLS est maintenue et fonctionne sans aucun changement.
    httpPort, httpsPort
    Exposer les ports autres que les ports par défaut pour l'équilibreur de charge d'application Ingress en ajoutant les ports HTTP ou HTTPS que vous voulez ouvrir.
    ingressClass
    Si vous avez indiqué une autre classe que public-iks-k8s-nginx ou private-iks-k8s-nginx dans votre ressource Ingress, indiquez la classe.
    logLevel
    Indiquez le niveau de journalisation à utiliser. Choisissez parmi les valeurs suivantes.
    2: Affiche les détails à l'aide de la commande **diff** pour afficher les modifications apportées à la configuration dans NGINX.
    3: Affiche les détails sur le service, la règle Ingress, les modifications de nœud final au format JSON.
    5: Configure NGINX en mode débogage.
    Pour plus d'informations sur la journalisation, voir Journalisation de débogage.
    replicas
    Par défaut, chaque équilibreur de charge d'application comporte 2 répliques. Augmentez vos capacités de traitement d'équilibreur de charge d'application en augmentant le nombre de pods d'équilibreur de charge d'application. Pour plus d'informations, voir Augmentation du nombre de répliques de pod d'équilibreur de charge d'application.
    tcpServicesConfig
    Spécifiez une mappe de configuration et l'espace de nom où se trouve la mappe de configuration, telle que kube-system/tcp-services, qui contient des informations sur l'accès à votre service d'application via un port TCP non standard.
    enableIngressValidation
    Activez le déploiement du webhook de validation Ingress pour cet équilibreur de charge d'application. Le webhook valide les ressources Ingress avant d'être appliqué au cluster afin d'éviter les configurations non valides. (L'équilibreur de charge d'application traite uniquement les ressources Ingress qui appartiennent à la classe Ingress qu'il expose.) Valeur par défaut : "false".
  2. Créez la mappe de configuration ibm-ingress-deploy-config dans votre cluster.

    kubectl create -f ibm-ingress-deploy-config.yaml
    
  3. Pour récupérer les modifications, mettez à jour vos équilibreurs de charge d'application. Notez que l'application des modifications à vos équilibreurs de charge d'application peut prendre jusqu'à 5 minutes.

    ibmcloud ks ingress alb update -c <cluster_name_or_ID>
    
  4. Si vous avez indiqué des ports HTTP, HTTPS ou TCP non standard, vous devez ouvrir les ports sur chaque service d'équilibreur de charge d'application.

    1. Editez le fichier YAML pour chaque service d'équilibreur de charge d'application trouvé à l'étape 1.

      kubectl edit svc -n kube-system <alb_svc_name>
      
    2. Dans la section spec.ports, ajoutez les ports que vous voulez ouvrir. Par défaut, les ports 80 et 443 sont ouverts. Si vous souhaitez conserver les ports 80 et 443 ouverts, ne les supprimez pas de ce fichier. Tout port non spécifié est fermé. Ne spécifiez pas de port de noeud (nodePort). Une fois que vous avez ajouté le port et appliqué les modifications, un nodePort est automatiquement affecté.

      ...
      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. Sauvegardez et fermez le fichier. Vos modifications sont appliquées automatiquement.

Personnalisation de la classe Ingress

Une classe Ingress associe un nom de classe à un type de contrôleur Ingress. Utilisez la ressource IngressClass pour personnaliser les classes Ingress.

Ajout de l'authentification App ID à des applications

Renforcez l'authentification de vos applications en configurant Ingress à l'aide de la fonction IBM Cloud App ID.

  1. Choisissez une instance existante ou créer une nouvelle instance App ID.

    Une instance App ID ne peut être utilisée que dans un seul espace de noms de votre cluster. Si vous voulez configurer App ID pour des ressources Ingress dans plusieurs espaces de noms, répétez les étapes de cette section afin de spécifier une unique instance App ID pour les ressources Ingress de chaque espace de noms.

    • Pour utiliser une instance existante, assurez-vous que le nom de l'instance de service ne contient que des caractères alphanumériques minuscules et que sa longueur ne dépasse pas 25 caractères. Pour modifier le nom, sélectionnez Renommer le service dans le menu des options supplémentaires de la page de détails de votre instance de service.
    • Pour mettre à disposition une nouvelle instance App ID :
      1. Remplacez le nom du service par votre propre nom unique pour l'instance de service. Le nom de l'instance de service doit contenir uniquement des caractères alphanumériques en minuscules et ne peut pas dépasser 25 caractères.
      2. Choisissez la même région que celle dans laquelle est déployé votre cluster.
      3. Cliquez sur Créer.
  2. Ajoutez des URL de redirection pour votre application. Une URL de redirection est l'URL du point de terminaison de rappel de votre application. Pour éviter les attaques par hameçonnage, IBM Cloud App ID valide l'URL de la demande par rapport à la liste autorisée des URL de redirection.

    1. Dans la console de gestion App ID, accédez à Gérer l'authentification.
    2. Dans l'onglet Fournisseurs d'identité, assurez-vous qu'un fournisseur d'identité a été sélectionné. Si aucun fournisseur d'identité n'est sélectionné, l'utilisateur ne sera pas authentifié mais recevra un jeton d'accès pour un accès anonyme à l'application.
    3. Dans l'onglet Paramètres d'authentification, ajoutez des URL de redirection pour votre application au format https://<hostname>/oauth2-<App_ID_service_instance_name>/callback. Notez que toute les lettres du nom de l'instance de service doivent être spécifiées en minuscules.

    Si vous utilisez la fonction de déconnexion IBM Cloud App ID, vous devez ajouter /sign_out à votre domaine au format https://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out et inclure cette URL dans la liste des URL de redirection. Si vous souhaitez utiliser une page de déconnexion personnalisée, vous devez définir whitelist_domains dans l' ConfigMap e de OAuth2-Proxy. Appelez le noeud final https://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out avec le paramètre de requête rd ou définissez l'en-tête X-Auth-Request-Redirect avec votre page de déconnexion personnalisée. Pour plus de détails, voir Déconnexion.

  3. Effectuez la liaison de l'instance de service App ID à votre cluster. La commande crée une clé de service pour l'instance de service, ou vous pouvez inclure l'option --key pour utiliser les informations d'identification de la clé de service existante. Veillez à lier l'instance de service à l'espace de noms dans lequel se trouvent les ressources Ingress. Notez que toute les lettres du nom de l'instance de service doivent être spécifiées en minuscules.

    ibmcloud ks cluster service bind --cluster <cluster_name_or_ID> --namespace <namespace> --service <App_ID_service_instance_name> [--key <service_instance_key>]
    

    Une fois que le service a été correctement lié à votre cluster, un secret de cluster est créé pour héberger les données d'identification de votre instance de service. Exemple de sortie d'interface de ligne de commande :

    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. Activez le module complémentaire Proxy ALB OAuth dans votre cluster. Ce module complémentaire crée et gère les ressources Kubernetes suivantes : un déploiement OAuth2-Proxy pour votre instance de service App ID, un secret qui contient la configuration du déploiement OAuth2-Proxy et une ressource Ingress qui configure les équilibreurs de charge d'application de sorte qu'ils acheminent les demandes entrantes vers le déploiement OAuth2-Proxy de votre instance App ID. Le nom de chacune de ces ressources commence par oauth2-.

    1. Activez l'additif alb-oauth-proxy.
      ibmcloud ks cluster addon enable alb-oauth-proxy --cluster <cluster_name_or_ID>
      
    2. Vérifiez que le statut du module complémentaire Proxy ALB OAuth est Addon Ready.
      ibmcloud ks cluster addon ls --cluster <cluster_name_or_ID>
      
  5. Dans les ressources Ingress pour les applications dans lesquelles vous souhaitez ajouter l'authentification App ID, assurez-vous que le nom de la ressource ne dépasse pas 25 caractères. Ajoutez ensuite les annotations suivantes à la section metadata.annotations.

    1. Ajoutez l'annotation auth-url ci-après. Cette annotation spécifie l'URL d'OAuth2-Proxy pour votre instance App ID, qui sert de partie utilisatrice OIDC pour App ID. Notez que toute les lettres du nom de l'instance de service doivent être spécifiées en minuscules.

      ...
      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. Parfois, le cookie d'authentification utilisé par OAuth2-Proxy dépasse 4 Ko. Il est donc divisé en deux parties. Le fragment suivant doit être ajouté pour s'assurer que les deux cookies peuvent être correctement mis à jour par OAuth2-Proxy.

      ...
      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. Sélectionnez les jetons à envoyer à votre application dans l'en-tête Authorization. Pour plus d'informations sur les jetons d'identification et d'accès, voir la documentation de App ID.

      • Pour envoyer uniquement le site ID Token, ajoutez l'annotation suivante :

        ...
        annotations:
            nginx.ingress.kubernetes.io/auth-response-headers: Authorization
        ...
        
      • Pour envoyer uniquement le site Access Token, ajoutez les informations suivantes à l'annotation configuration-snippet. (Cela étend le fragment de l'étape 5.2.)

        ...
        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
            }
        ...
        
      • Pour envoyer le Access Token et le ID Token, ajoutez les informations suivantes à l'annotation configuration-snippet. (Cela étend le fragment de l'étape 5.2.)

        ...
         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. Facultatif : si votre application prend en charge la stratégie d'application Web en plus ou au lieu de la stratégie d'API, ajoutez l'annotation nginx.ingress.kubernetes.io/auth-signin: https://$host/oauth2-<App_ID_service_instance_name>/start?rd=$escaped_request_uri. Notez que toutes les lettres du nom de l'instance de service doivent être en minuscules.

      • Si vous spécifiez cette annotation et que l'authentification d'un client échoue, le client est redirigé vers l'URL d'OAuth2-Proxy pour votre instance App ID. Ce proxy OAuth2-Proxy, qui sert de partie utilisatrice OIDC pour App ID, redirige le client vers votre page de connexion App ID à des fins d'authentification.
      • Si vous ne spécifiez pas cette annotation, un client doit s'authentifier avec un jeton bearer valide. Si l'authentification d'un client échoue, la demande du client est rejetée avec le message d'erreur 401 Unauthorized.
  6. Réappliquez vos ressources Ingress pour imposer l'authentification App ID. Une fois qu'une ressource Ingress avec les annotations appropriées a été réappliquée, le module complémentaire du proxy OAuth d'équilibreur de charge d'application procède à un déploiement OAuth2-Proxy, crée un service pour le déploiement et crée une ressource Ingress distincte pour configurer le routage des messages de déploiement OAuth2-Proxy. Ne supprimez pas ces ressources complémentaires.

    kubectl apply -f <app_ingress_resource>.yaml -n namespace
    
  7. Vérifiez que l'authentification App ID est imposée à vos applications.

    • Si vos applications prennent en charge la stratégie d'application Web : accédez à l'URL de votre application dans un navigateur Web. Si App ID est correctement appliqué, vous êtes redirigés vers une page de connexion d'authentification App ID.
    • Si vos applications prennent en charge la stratégie d'API : spécifiez votre jeton d'accès Bearer dans l'en-tête Authorization des demandes aux applications. Pour obtenir votre jeton d'accès, consultez la documentation App ID. Si App ID est correctement appliqué, la demande est authentifiée avec succès et acheminée vers votre application. Si vous envoyez des demandes à vos applications sans jeton d'accès dans l'en-tête Authorization ou si App ID n'accepte pas le jeton d'accès, la demande est rejetée.
  8. Facultatif : Si vous utilisez des stratégies de réseau ou une autre solution de pare-feu sur votre cluster pour limiter le trafic sortant, vous devez vous assurer d'autoriser l'accès au service public AppID's à partir de votre cluster. Pour obtenir la plage d'adresses IP de ce service, il faut en faire la demande auprès du service d'assistance à la clientèle.

  9. Facultatif : vous pouvez personnaliser le comportement par défaut de OAuth2-Proxy en créant une mappe de configuration Kubernetes.

    1. Créez un fichier YAML ConfigMap qui spécifie des valeurs pour les paramètres OAuth2-Proxy que vous voulez modifier.
      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. Appliquez la ressource de mappe de configuration (ConfigMap) à votre module complémentaire. Vos modifications sont appliquées automatiquement.
      kubectl apply -f oauth2-<App_ID_service_instance_name>.yaml
      

Pour obtenir la liste des modifications apportées à chaque version du module complémentaire ALB OAuth Proxy, consultez le journal des modifications du module complémentaire ALB OAuth Proxy à l'adresse IBM Cloud.

Mise à niveau du module complémentaire ALB OAuth Proxy

Pour mettre à niveau le module complémentaire ALB OAuth Proxy, vous devez d'abord désactiver le module complémentaire, puis le réactiver et spécifier la version.

Le processus de mise à niveau n'est pas interruptif, car les instances de proxy OAuth2 surveillées restent sur le cluster, même lorsque le module complémentaire est désactivé.

  1. Désactivez le module complémentaire.
    ibmcloud ks cluster addon disable alb-oauth-proxy --cluster <cluster_name_or_ID>
    
  2. Répertoriez les versions complémentaires disponibles et choisissez la version que vous souhaitez utiliser.
    ibmcloud ks cluster addon versions --addon alb-oauth-proxy
    
  3. Activez le module complémentaire et spécifiez l'option --version. Si vous ne spécifiez pas de version, la version par défaut est activée.
    ibmcloud ks cluster addon enable alb-oauth-proxy --cluster <cluster_name_or_ID> [--version <version>]
    

Conservation de l'adresse IP source

Par défaut, les adresses IP source des demandes client ne sont pas conservées par l'équilibreur de charge d'application Ingress. Pour conserver les adresses IP source, vous pouvez activer le protocole PROXY dans les clusters de VPC ou modifier la règle externalTrafficPolicy dans les clusters classiques.

Activation du protocole PROXY dans les clusters de VPC

Pour préserver l'adresse IP source de la requête du client dans un cluster VPC, vous pouvez activer le protocole NGINX PROXY pour tous les équilibreurs de charge qui exposent les ALB Ingress dans votre cluster.

  1. Facultatif Effectuez les étapes suivantes si vous utilisez Cloud Internet Services (CIS).

    1. Activez le paramètre True client IP header dans la console CIS, en cliquant sur Security > Advanced > True client IP header.
    2. Modifiez le site kube-system/ibm-k8s-controller-config configmap et définissez allow-snippet-annotations: "true".
    3. Ajouter l'annotation nginx.ingress.kubernetes.io/server-snippet: real_ip_header CF-Connecting-IP;.
  2. Activez le protocole PROXY. Pour plus d'informations sur les paramètres de cette commande, voir les informations de référence de l'interface de ligne de commande. Une fois cette commande exécutée, de nouveaux équilibreurs de charge sont créés avec la configuration de protocole PROXY mise à jour. Deux adresses IP inutilisées pour chaque équilibreur de charge doivent être disponibles dans chaque sous-réseau lors de la récréation de l'équilibreur de charge. Une fois ces équilibreurs de charge créés, les équilibreurs de charge d'application existants sont supprimés. Le processus de recréation d'équilibreur de charge peut provoquer des interruptions de service.

    ibmcloud ks ingress lb proxy-protocol enable --cluster <cluster_name_or_ID> --cidr <subnet_CIDR> --header-timeout <timeout>
    
  3. Vérifiez que le protocole PROXY est activé pour les équilibreurs de charge qui exposent les équilibreurs de charge d'application dans votre cluster.

    ibmcloud ks ingress lb get --cluster <cluster_name_or_ID>
    
  4. Pour désactiver ultérieurement le protocole PROXY, vous pouvez exécuter la commande suivante :

    ibmcloud ks ingress lb proxy-protocol disable --cluster <cluster_name_or_ID>
    

Modification de la règle externalTrafficPolicy dans les clusters classiques

Conserver l'adresse IP source pour les demandes client dans un cluster classique.

Dans les clusters classiques, l'augmentation du nombre de répliques ALB à plus de 2 augmente le nombre de répliques, mais lorsque le " externalTrafficPolicy est configuré comme " Local, les répliques de plus de 2 ne sont pas utilisées. Seuls deux modules d'équilibrage de charge sont présents sur le cluster (dans une configuration active-passive) et, en raison de cette politique de trafic, ils ne transmettent le trafic entrant qu'au module ALB situé sur le même nœud.

Par défaut, l'adresse IP source de la demande client n'est pas conservée. Lorsqu'une demande client vers votre application est envoyée à votre cluster, elle est acheminée à un pod pour le service d'équilibreur de charge qui expose l'équilibreur de charge d'application (ALB). S'il n'existe aucun pod d'application sur le même noeud worker que le pod de service d'équilibreur de charge, l'équilibreur de charge transmet la demande à un pod d'application sur un autre noeud worker. L'adresse IP source du package est remplacée par l'adresse IP publique du noeud worker sur lequel s'exécute le pod d'application.

Pour préserver l'adresse IP source originale de la requête du client, vous pouvez activer la préservation de l'adresse IP source. Conserver l'adresse IP du client est pratique, notamment lorsque les serveurs d'applications doivent appliquer des règles de sécurité et de contrôle d'accès.

Lorsque la préservation de l'IP source est activée, les répartiteurs de charge passent de la transmission du trafic vers un module ALB situé sur un nœud de travail différent à un module ALB situé sur le même nœud de travail. Vos applications peuvent connaître un temps d'indisponibilité pendant ce changement. Si vous désactivez un ALB, toutes les modifications d'adresse IP source que vous effectuez dans le service d'équilibreur de charge qui expose l'ALB sont perdues. Lorsque vous réactivez l'équilibreur de charge d'application, vous devez également réactiver l'adresse IP source.

Pour activer la conservation de l'adresse IP source, éditez le service d'équilibreur de charge qui expose un équilibreur de charge d'application Ingress :

  1. Activez la conservation de l'adresse IP source d'un équilibreur de charge d'application unique ou de tous les équilibreurs de charge d'application figurant dans votre cluster.

    • Pour configurer la conservation de l'adresse IP source d'un seul ALB :

      1. Obtenez l'ID de l'équilibreur de charge d'application pour lequel vous voulez activer l'adresse IP source. Les services d'équilibreur de charge d'application ont un format de ce type : public-cr18e61e63c6e94b658596ca93d087eed9-alb1 pour un équilibreur de charge d'application public ou private-cr18e61e63c6e94b658596ca93d087eed9-alb1 pour un équilibreur de charge d'application privé.

        kubectl get svc -n kube-system | grep alb
        
      2. Ouvrez le fichier YAML correspondant au service d'équilibreur de charge qui expose l'équilibreur de charge d'application.

        kubectl edit svc <ALB_ID> -n kube-system
        
      3. Sous spec, modifiez la valeur de externalTrafficPolicy en remplaçant Cluster par Local.

      4. Sauvegardez et fermez le fichier de configuration. La sortie est similaire à la suivante :

        service "public-cr18e61e63c6e94b658596ca93d087eed9-alb1" edited
        
    • Pour configurer la conservation de l'adresse IP source pour tous les équilibreurs de charge d'application publics de votre cluster, exécutez la commande suivante :

      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
      

      Exemple de sortie

      "public-cr18e61e63c6e94b658596ca93d087eed9-alb1", "public-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched
      
    • Pour configurer la conservation de l'adresse IP source pour tous les équilibreurs de charge d'application privés de votre cluster, exécutez la commande suivante :

      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
      

      Exemple de sortie

      "private-cr18e61e63c6e94b658596ca93d087eed9-alb1", "private-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched
      
  2. Vérifiez que l'adresse IP source est conservée dans les journaux de pod de votre équilibreur de charge d'application.

    1. Obtenez l'ID d'un pod pour l'équilibreur de charge d'application que vous avez modifié.
      kubectl get pods -n kube-system | grep alb
      
    2. Ouvrez les journaux correspondant à ce pod d'équilibreur de charge d'application. Vérifiez que l'adresse IP de la zone client est l'adresse IP de la demande client au lieu de l'adresse IP du service d'équilibreur de charge.
      kubectl logs <ALB_pod_ID> nginx-ingress -n kube-system
      
  3. Désormais, quand vous recherchez les en-têtes des demandes qui sont envoyées à votre application de back end, vous pouvez voir l'adresse IP client dans l'en-tête x-forwarded-for.

  4. Pour cesser de conserver l'adresse IP source, vous pouvez annuler les modifications que vous avez apportées au service.

    • Pour annuler la conservation de l'adresse IP source pour vos équilibreurs de charge d'application publics :
      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
      
    • Pour annuler la conservation de l'adresse IP source pour vos équilibreurs de charge d'application privés :
      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
      

Configuration de protocoles et de chiffrements SSL au niveau HTTP

Activez les protocoles et chiffrements SSL au niveau HTTP global en éditant la ressource configmap ibm-k8s-controller-config.

Par exemple, si vous avez toujours des clients qui nécessitent la prise en charge de TLS 1.0 ou 1.1, vous devez activer manuellement ces versions TLS pour remplacer le paramétrage par défaut uniquement pour TLS 1.2 et TLS 1.3.

Lorsque vous indiquez les protocoles activés pour tous les hôtes, les paramètres TLSv1.1 et TLSv1.2 (1.1.13, 1.0.12) fonctionnent uniquement avec l'utilisation d'OpenSSL 1.0.1 ou version supérieure. Le paramètre TLSv1.3 (1.13.0) fonctionne uniquement avec l'utilisation d'OpenSSL 1.1.1 généré avec le support TLSv1.3.

Pour éditer le fichier configmap pour activer les chiffrements et protocoles SSL :

  1. Editez le fichier de configuration correspondant à la ressource configmap ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Ajoutez les chiffrements et protocoles SSL. Formater les chiffres selon le format de la liste de chiffrement de la bibliothèque 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. Sauvegardez le fichier de configuration.

  4. Vérifiez que les modifications apportées à configmap ont été appliquées. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Envoi de votre certificat personnalisé aux clients existants

Si vous disposez déjà d'unités qui ne prennent pas en charge l'indication de nom de serveur (SNI) et que vous utilisez un certificat TLS personnalisé dans vos ressources Ingress, vous devez modifier les paramètres du serveur de l'ALB pour utiliser votre certificat TLS personnalisé et le secret TLS personnalisé.

Lorsque vous créez un cluster classique, un certificat Let's Encrypt est généré pour le secret Ingress par défaut fourni par IBM. Si vous créez un secret personnalisé dans votre cluster et que vous spécifiez ce secret personnalisé pour la terminaisons TLS dans vos ressources Ingress, l'équilibreur de charge d'application Ingress envoie le certificat pour votre secret personnalisé au client au lieu du certificat Let's Encrypt par défaut. Toutefois, si un client ne prend pas en charge SNI, l'équilibreur de charge d'application Ingress prend par défaut le certificat Let's Encrypt car le secret par défaut est répertorié dans les paramètres de serveur par défaut de l'équilibreur de charge d'application. Pour envoyer votre certificat personnalisé à des unités qui ne prennent pas en charge SNI, procédez comme suit pour modifier les paramètres de serveur par défaut de l'ALB sur votre secret personnalisé.

Les certificats Let's Encrypt générés par défaut ne sont pas destinés à l'utilisation de la production. Pour les charges de travail de production, apportez votre propre certificat personnalisé.

  1. Editez la ressource Ingress alb-default-server.

    kubectl edit ingress alb-default-server -n kube-system
    
  2. Dans la section spec.tls, remplacez la valeur du paramètre hosts.secretName par le nom de votre secret personnalisé qui contient votre certificat personnalisé. Exemple :

    spec:
        rules:
        ...
        tls:
        - hosts:
        - invalid.mycluster-<hash>-0000.us-south.containers.appdomain.cloud
        secretName: <custom_secret_name>
    
  3. Sauvegardez le fichier de ressources.

  4. Vérifiez que la ressource pointe désormais vers votre nom de secret personnalisé. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.

    kubectl get ingress alb-default-server -n kube-system -o yaml
    

Amélioration de la gestion des connexions

Les paramètres client-header-timeout, client-body-timeout et keep-alive sont des configurations cruciales qui déterminent la durée pendant laquelle les connexions restent actives entre les clients, le contrôleur Ingress et les serveurs dorsaux. Ces délais jouent un rôle important dans l'optimisation du traitement des demandes, en particulier lorsqu'il s'agit de connexions client de longue durée, de réponses retardées de la part des serveurs dorsaux et de la protection de ressources précieuses contre une occupation inutile.

L'adresse client-header-timeout définit la durée maximale pendant laquelle le serveur attend un en-tête client complet. De même, client-body-timeout indique la durée pendant laquelle le serveur attend que le client envoie le corps de la requête. Ces deux délais doivent être alignés sur le paramètre keep-alive, qui régit la durée pendant laquelle le serveur maintient une connexion ouverte en attendant d'autres demandes. Si ces délais ne correspondent pas au paramètre keep-alive, NGINX mettra fin à la connexion, ce qui pourrait entraîner un comportement inattendu du client ou des échecs de requête.

Vous pouvez définir les paramètres ci-dessus dans l'espace de noms ibm-k8s-controller-config ConfigMap kube-system.

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"

Pour plus d'informations, voir le site client-header-timeout, client-body-timeout et keep-alive dans la documentation Ingress Nginx.

Réglage des délais d'attente

Si vos clusters sont exposés avec IBM Cloud Cloud Internet Services (CIS) / Cloudflare et utilisent le Web Application Firewall (WAF) ou l'équilibrage de charge global, vous devez définir les paramètres client-header-timeout, client-body-timeout et keep-alive dans la ressource ibm-k8s-controller-config située dans l'espace de noms kube-system à des valeurs supérieures à 900 secondes afin d'éviter les terminaisons de connexion prématurées. Pour plus d'informations, consultez la documentation de Cloudflare.

  1. Mettre à jour les paramètres client-header-timeout, client-body-timeout, et keep-alive dans l'espace de noms ibm-k8s-controller-config ConfigMap au sein de l'espace de noms kube-system. Voici un exemple de commande permettant de régler chaque paramètre sur 905 secondes :

    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. Clusters VPC uniquement: il est également nécessaire de modifier le délai de connexion inactive pour l'équilibreur de charge VPC. Ajustez le délai d'attente pour le service public-cr<clusterid> LoadBalancer. Voici un exemple de commande permettant de la fixer à 910 secondes :

    kubectl annotate svc -n kube-system public-cr<clusterid> service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout="910"
    

Optimisation des performances de l'équilibreur de charge d'application (ALB)

Pour optimiser les performances de vos équilibreurs de charge d'application Ingress, vous pouvez modifier les paramètres par défaut selon vos besoins.

Activation de la mise en mémoire tampon des journaux et du délai d'attente du vidage

Par défaut, dès qu'une demande arrive, l'équilibreur de charge d'application Ingress la consigne dans un journal. Si vous disposez d'un environnement avec une utilisation intensive, la journalisation de chaque demande dès son arrivée peut considérablement augmenter l'utilisation d'E-S disque. Pour éviter d'obtenir des E-S disque en continu, vous pouvez activer la mise en mémoire tampon des journaux et du délai d'attente de vidage pour l'équilibreur de charge d'application en modifiant la mappe de configuration Ingress ibm-k8s-controller-config. Lorsque la mise en mémoire tampon est activée, au lieu d'effectuer une opération d'écriture distincte pour chaque entrée de journal, l'équilibreur de charge d'application met en mémoire tampon une série d'entrées et les écrit ensemble dans un fichier en une seule opération.

  1. Editez la mappe de configuration ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Définissez le seuil à partir duquel l'équilibreur de charge d'application doit commencer à écrire le contenu de la mémoire tampon dans le journal.

    • Taille de mémoire tampon : ajoutez la zone buffer et définissez-la avec la quantité de mémoire de journal que peut contenir la mémoire tampon avant que l'équilibreur de charge d'application écrive le contenu de la mémoire tampon dans le journal. Par exemple, si la valeur par défaut 100KB est utilisée, l'équilibreur de charge d'application écrit le contenu de la mémoire tampon dans le journal chaque fois que la mémoire tampon atteint 100 Ko de contenu de journal.
    • Intervalle de temps : ajoutez la zone flush et définissez la fréquence à laquelle l'équilibreur de charge d'application doit écrire dans le fichier journal. Par exemple, si la valeur par défaut 5m est utilisée, l'équilibreur de charge d'application écrit le contenu de la mémoire tampon dans le fichier journal toutes les 5 minutes.
    • Intervalle de temps ou taille de mémoire tampon : lorsque les deux zones flush et buffer sont définies, l'équilibreur de charge d'application écrit le contenu de la mémoire tampon dans le fichier journal en fonction du premier paramètre de seuil atteint.
    apiVersion: v1
    kind: ConfigMap
    data:
        access-log-params: "buffer=100KB, flush=5m"
      metadata:
    name: ibm-k8s-controller-config
    ...
    
  3. Sauvegardez et fermez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.

  4. Vérifiez que les journaux d'un équilibreur de charge d'application contiennent désormais le contenu de la mémoire tampon écrit en respectant la taille de mémoire et l'intervalle de temps que vous avez définis.

    kubectl logs -n kube-system <ALB_ID> -c nginx-ingress
    

Modification du nombre ou de la durée des connexions persistantes (keepalive)

Les connexions persistantes (keepalive) peuvent avoir un impact majeur sur les performances en diminuant l'utilisation de l'UC et du réseau nécessaire pour ouvrir et fermer les connexions. Pour optimiser les performances de vos équilibreurs de charge d'application, vous pouvez modifier le nombre maximal de connexions persistantes pour les connexions entre l'équilibreur de charge d'application et le client et la durée possible de ces connexions.

  1. Editez la mappe de configuration ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Modifiez les valeurs des zones keep-alive-requests et keep-alive.

    • keep-alive-requests : nombre de connexions client persistantes pouvant rester ouvertes dans l'équilibreur de charge d'application Ingress. La valeur par défaut est 100.
    • keep-alive : délai exprimé en secondes, pendant lequel la connexion client persistante reste ouverte dans l'équilibreur de charge d'application Ingress. La valeur par défaut est 75.
    apiVersion: v1
    data:
      keep-alive-requests: 100
      keep-alive: 75
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Sauvegardez et fermez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.

  4. Vérifiez que les modifications apportées à configmap ont été appliquées.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Modification du nombre de connexions simultanées ou de processus worker

Modifiez le paramètre par défaut du nombre de connexions simultanées que les processus worker NGINX d'un équilibreur de charge d'application peuvent gérer ainsi que le nombre de processus worker qui peuvent s'exécuter pour un équilibreur de charge d'application.

Chaque équilibreur de charge d'application dispose de processus worker NGINX qui traitent les connexions client et communiquent avec les serveurs en amont pour les applications qu'expose l'équilibreur de charge d'application. En modifiant le nombre de processus par équilibreur de charge d'application ou le nombre de connexions que peuvent traiter les processus worker, vous pouvez contrôler le nombre maximal de clients qu'un équilibreur de charge d'application peut gérer. Calculez votre nombre maximum de connexions avec la formule suivante : maximum clients = worker_processes * worker_connections.

  • La zone max-worker-connections définit le nombre maximum de connexions simultanées que peuvent traiter les processus worker NGINX pour un équilibreur de charge d'application. La valeur par défaut est 16384. Le paramètre max-worker-connections inclut toutes les connexions que l'équilibreur de charge d'application passe par des proxy, pas uniquement les connexions avec des clients. En outre, le nombre réel de connexions simultanées ne peut pas dépasser la limite du nombre maximal de fichiers ouverts qui est définie par le paramètre max-worker-open-files. Si vous affectez à max-worker-connections la valeur 0, la valeur de max-worker-open-files est utilisée à la place.
  • La zone worker-processes définit le nombre maximum de processus worker NGINX pour un équilibreur de charge d'application. La valeur par défaut est "auto", qui indique que le nombre de processus worker correspond au nombre de coeurs sur le noeud worker où l'équilibreur de charge d'application est déployé. Vous pouvez remplacer cette valeur par un nombre si vos processus worker doivent effectuer des opérations d'E-S de niveaux élevés.
  1. Editez la mappe de configuration ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Modifiez la valeur de max-worker-connections ou worker-processes.

    apiVersion: v1
    data:
      max-worker-connections: 16384
      worker-processes: "auto"
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Sauvegardez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.

  4. Vérifiez que les modifications apportées à configmap ont été appliquées.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Modification du nombre de fichiers ouverts pour les processus worker

Modifiez le nombre maximum par défaut de fichiers pouvant être ouverts par chaque processus de noeud worker pour un équilibreur de charge d'application.

Chaque équilibreur de charge d'application dispose de processus worker NGINX qui traitent les connexions client et communiquent avec les serveurs en amont pour les applications qu'expose l'équilibreur de charge d'application. Si vos processus worker atteignent le nombre maximum de fichiers pouvant être ouverts, une erreur Too many open files peut être écrite dans vos journaux NGINX. Par défaut, le paramètre max-worker-open-files est défini sur 0, ce qui indique que la valeur issue de la formule suivante est utilisée : system limit of maximum open files / worker-processes - 1024. Si vous remplacez la valeur par un autre entier, la formule ne s'applique plus.

  1. Editez la mappe de configuration ibm-k8s-controller-config.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Modifiez la valeur de max-worker-open-files.

    apiVersion: v1
    data:
      max-worker-open-files: 0
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Sauvegardez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.

  4. Vérifiez que les modifications apportées à configmap ont été appliquées.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Optimisation des performances du noyau

Pour optimiser les performances de vos ALB Ingress, vous pouvez également modifier les paramètres sysctl du noyau Linux sur les noeuds worker. Les noeuds worker sont automatiquement mis à disposition avec un noyau déjà optimisé, par conséquent ne modifiez ces paramètres que si vous nécessitez l'optimisation de performances spécifiques.