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 ConfigMapssl-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;
}
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.
-
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 sitetcp-services
ConfigMap,, voir ce blog.apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: kube-system data: 9000: "<namespace>/<service>:8080"
-
Créez la mappe de configuration dans l'espace de noms
kube-system
.kubectl apply -f tcp-services.yaml -n kube-system
-
Spécifiez la mappe de configuration
tcp-services
en tant que zone dans la mappe de configurationibm-ingress-deploy-config
."tcpServicesConfig":"kube-system/tcp-services"
-
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
.
-
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
-
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 sectionspec.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
ouprivate-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 dansNGINX
.3
: Affiche les détails sur le service, la règle Ingress, les modifications de nœud final au format JSON.5
: ConfigureNGINX
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"
.
-
Créez la mappe de configuration
ibm-ingress-deploy-config
dans votre cluster.kubectl create -f ibm-ingress-deploy-config.yaml
-
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>
-
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.
-
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>
-
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, unnodePort
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> ...
-
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.
-
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 :
- 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.
- Choisissez la même région que celle dans laquelle est déployé votre cluster.
- Cliquez sur Créer.
-
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.
- Dans la console de gestion App ID, accédez à Gérer l'authentification.
- 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.
- 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 formathttps://<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éfinirwhitelist_domains
dans l' ConfigMap e de OAuth2-Proxy. Appelez le noeud finalhttps://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out
avec le paramètre de requêterd
ou définissez l'en-têteX-Auth-Request-Redirect
avec votre page de déconnexion personnalisée. Pour plus de détails, voir Déconnexion. -
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>
-
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-
.- Activez l'additif
alb-oauth-proxy
.ibmcloud ks cluster addon enable alb-oauth-proxy --cluster <cluster_name_or_ID>
- 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>
- Activez l'additif
-
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
.-
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 ...
-
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 parOAuth2-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 } ...
-
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'annotationconfiguration-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 leID Token
, ajoutez les informations suivantes à l'annotationconfiguration-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 } ...
-
-
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
.
-
-
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
-
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.
-
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.
-
Facultatif : vous pouvez personnaliser le comportement par défaut de OAuth2-Proxy en créant une mappe de configuration Kubernetes.
- 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
- 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
- Créez un fichier YAML ConfigMap qui spécifie des valeurs pour les paramètres OAuth2-Proxy que vous voulez modifier.
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é.
- Désactivez le module complémentaire.
ibmcloud ks cluster addon disable alb-oauth-proxy --cluster <cluster_name_or_ID>
- Répertoriez les versions complémentaires disponibles et choisissez la version que vous souhaitez utiliser.
ibmcloud ks cluster addon versions --addon alb-oauth-proxy
- 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.
-
Facultatif Effectuez les étapes suivantes si vous utilisez Cloud Internet Services (CIS).
- Activez le paramètre True client IP header dans la console CIS, en cliquant sur Security > Advanced > True client IP header.
- Modifiez le site
kube-system/ibm-k8s-controller-config configmap
et définissezallow-snippet-annotations: "true"
. - Ajouter l'annotation
nginx.ingress.kubernetes.io/server-snippet: real_ip_header CF-Connecting-IP;
.
-
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>
-
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>
-
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 :
-
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 :
-
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 ouprivate-cr18e61e63c6e94b658596ca93d087eed9-alb1
pour un équilibreur de charge d'application privé.kubectl get svc -n kube-system | grep alb
-
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
-
Sous
spec
, modifiez la valeur deexternalTrafficPolicy
en remplaçantCluster
parLocal
. -
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
-
-
Vérifiez que l'adresse IP source est conservée dans les journaux de pod de votre équilibreur de charge d'application.
- 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
- 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
- Obtenez l'ID d'un pod pour l'équilibreur de charge d'application que vous avez modifié.
-
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
. -
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
- Pour annuler la conservation de l'adresse IP source pour vos équilibreurs de charge d'application publics :
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 :
-
Editez le fichier de configuration correspondant à la ressource configmap
ibm-k8s-controller-config
.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
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
-
Sauvegardez le fichier de configuration.
-
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é.
-
Editez la ressource Ingress
alb-default-server
.kubectl edit ingress alb-default-server -n kube-system
-
Dans la section
spec.tls
, remplacez la valeur du paramètrehosts.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>
-
Sauvegardez le fichier de ressources.
-
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.
-
Mettre à jour les paramètres
client-header-timeout
,client-body-timeout
, etkeep-alive
dans l'espace de nomsibm-k8s-controller-config
ConfigMap au sein de l'espace de nomskube-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
-
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.
-
Editez la mappe de configuration
ibm-k8s-controller-config
.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
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éfaut100KB
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éfaut5m
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
etbuffer
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 ...
- Taille de mémoire tampon : ajoutez la zone
-
Sauvegardez et fermez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.
-
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.
-
Editez la mappe de configuration
ibm-k8s-controller-config
.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
Modifiez les valeurs des zones
keep-alive-requests
etkeep-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 est100
.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 est75
.
apiVersion: v1 data: keep-alive-requests: 100 keep-alive: 75 kind: ConfigMap metadata: name: ibm-k8s-controller-config ...
-
Sauvegardez et fermez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.
-
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 est16384
. Le paramètremax-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ètremax-worker-open-files
. Si vous affectez àmax-worker-connections
la valeur0
, la valeur demax-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.
-
Editez la mappe de configuration
ibm-k8s-controller-config
.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
Modifiez la valeur de
max-worker-connections
ouworker-processes
.apiVersion: v1 data: max-worker-connections: 16384 worker-processes: "auto" kind: ConfigMap metadata: name: ibm-k8s-controller-config ...
-
Sauvegardez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.
-
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.
-
Editez la mappe de configuration
ibm-k8s-controller-config
.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
Modifiez la valeur de
max-worker-open-files
.apiVersion: v1 data: max-worker-open-files: 0 kind: ConfigMap metadata: name: ibm-k8s-controller-config ...
-
Sauvegardez le fichier de configuration. Les modifications sont automatiquement appliquées à vos équilibreurs de charge d'application.
-
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.