Classique : Configuration de l'équilibrage de charge DSR avec un équilibreur de charge de réseau (NLB) 2.0
Les NLB version 2.0 peuvent être créés uniquement dans des clusters classiques et ne peuvent pas être créés dans des clusters VPC. Pour effectuer un équilibrage de charge dans des clusters de VPC, voir Exposition d'applications avec des équilibreurs de charge pour VPC.
Exposez un port et utilisez une adresse IP portable pour un équilibreur de charge de réseau (NLB) de couche 4 afin d'exposer une application conteneurisée. Pour plus d'informations sur les équilibreurs de charge de réseau 2.0, voir Composants et architecture d'un équilibreur de charge de réseau 2.0.
Prérequis
Vous ne pouvez pas mettre à jour une version 1.0 NLB existante vers la version 2.0. Vous devez créer un nouvel équilibreur de charge de réseau 2.0. Vous pouvez exécuter simultanément les versions 1.0 et 2.0 de NLB au sein d'un même cluster. Pour utiliser un équilibreur de charge de réseau 2.0, votre cluster doit exécuter Red Hat OpenShift version 4.
Avant de créer un équilibreur de charge de réseau 2.0, vous devez respecter la procédure prérequise suivante.
-
Pour permettre à votre équilibreur de charge de réseau version 2.0 de transférer les demandes aux pods d'application dans plusieurs zones, ouvrez un cas de support afin de demander l'agrégation de capacité pour vos réseaux locaux virtuels (VLAN). Ce paramètre de configuration ne provoque pas d'indisponibilité ou d'interruption de réseau.
- Connectez-vous à la consoleIBM Cloud.
- Dans la barre de menu, cliquez sur Support, cliquez sur l'onglet Gérer les cas, puis sur Créer un cas.
- Dans les zones correspondant au cas, indiquez ceci : Thème : Réseau - Mise en service Sous-rubrique : Classique - VLAN
- Ajoutez les informations suivantes à la description:
Please set up the network to allow capacity aggregation on the public and private VLANs associated with my account. This is related to /docs/openshift?topic=openshift-loadbalancer-v2#ipvs_provision, and is needed so I can configure NLB v2.0 LoadBalancers in my Classic Kubernetes Cluster.. Notez que si vous souhaitez autoriser l'agrégation de capacité sur des réseaux VLAN spécifiques, tels que les VLAN publics pour un seul cluster, vous pouvez spécifier ces ID VLAN dans la description. - Cliquez sur Submit.
-
Activez une fonction VRF (Virtual Router Function) pour votre compte d'infrastructure IBM Cloud. Pour activer la fonction VRF, voir Activation de VRF. Pour vérifier si la fonction VRF est déjà activée, utilisez la commande
ibmcloud account show. Si vous ne pouvez pas ou ne souhaitez pas activer VRF, activez Réseau local virtuel. Lorsqu'une fonction VRF ou Spanning VLAN est activée, l'équilibreur de charge de réseau 2.0 peut router des paquets vers différents sous-réseaux dans le compte. -
Si vous utilisez des règles réseau Calico antérieures à DNAT pour gérer le trafic vers une NLB 2.0, vous devez ajouter les zones
applyOnForward: trueetdoNotTrack: trueet supprimer lepreDNAT: truede la sectionspecdans les règles.applyOnForward: truegarantit que la règle Calico est appliquée au trafic car elle est encapsulée et transmise.doNotTrack: truegarantit que les noeuds worker peuvent utiliser DSR pour renvoyer un paquet de réponses directement au client sans qu'il soit nécessaire de suivre la connexion. Par exemple, si vous utilisez une règle Calico pour autoriser le trafic provenant uniquement d'adresses IP spécifiques vers l'adresse IP de votre équilibreur de charge de réseau, la règle ressemble à ce qui suit :apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: allowlist spec: applyOnForward: true doNotTrack: true ingress: - action: Allow destination: nets: - <loadbalancer_IP>/32 ports: - 80 protocol: TCP source: nets: - <client_address>/32 selector: ibm.role=='worker_public' order: 500 types: - Ingress
Vous pouvez ensuite suivre la procédure décrite dans Configuration d'un équilibreur de charge de réseau 2.0 dans un cluster multizone ou dans un cluster à zone unique.
Configuration d'un équilibreur de charge de réseau 2.0 dans un cluster multizone
Avant de commencer
Veuillez remplir les conditions préalables à l' 2.0 ation de NLB avant de poursuivre.
-
Pour pouvoir créer des équilibreurs de charge de réseau publics dans plusieurs zones, au moins un VLAN public doit comporter des sous-réseaux portables disponibles dans chaque zone. Pour pouvoir créer des équilibreurs de charge de réseau (NLB) privés dans plusieurs zones, au moins un VLAN privé doit comporter des sous-réseaux portables disponibles dans chaque zone. Vous pouvez ajouter des sous-réseaux en suivant la procédure indiquée dans Configuration de sous-réseaux pour les clusters.
-
Assurez-vous de disposer du rôle d'accès au service IAM Writer ou Manager IBM Cloud pour l'espace de noms
default. -
Vérifiez que vous possédez le nombre requis de noeuds worker :
- Clusters classiques : si vous limitez le trafic réseau aux noeuds worker de périphérie, vérifiez qu'au moins deux noeuds worker de périphérie sont activés dans chaque zone pour assurer le déploiement uniforme des équilibreurs de charge de réseau.
-
Lorsque les nœuds de cluster sont rechargés ou lorsqu'une mise à jour de cluster de cluster inclut une nouvelle image
keepalived, l'adresse IP virtuelle de l'équilibreur de charge est déplacée vers l'interface réseau d'un nouveau noeud. Lorsque cela se produit, toute connexion de longue durée à votre équilibreur de charge doit être rétablie. Pensez à intégrer une logique de réessai dans votre application afin que les tentatives de rétablissement de la connexion soient effectuées rapidement.
Pour configurer un équilibreur de charge de réseau 2.0 dans un cluster multizone :
-
Déployez votre application sur le cluster. Prenez soin d'ajouter un libellé à votre déploiement dans la section "metadata" de votre fichier de configuration. Ce libellé personnalisé identifie tous les pods dans lesquels s'exécute votre application afin de pouvoir les inclure dans l'équilibrage de charge.
-
Créez un service d'équilibreur de charge pour l'application que vous désirez exposer sur l'Internet public ou sur un réseau privé.
- Créez un fichier de configuration de service nommé, par exemple,
myloadbalancer.yaml. - Définissez un service d'équilibreur de charge pour l'application que vous désirez exposer. Vous pouvez spécifier une zone, un VLAN et une adresse IP.
apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private> service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>" service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>" service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs" service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>" spec: type: LoadBalancer selector: <selector_key>: <selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: <IP_address> externalTrafficPolicy: Local ``` `service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type` : Annotation permettant de spécifier un équilibreur de charge `private` ou `public`. `service.kubernetes.io/ibm-load-balancer-cloud-provider-zone` : Annotation utilisée pour indiquer la zone dans laquelle est déployé le service d'équilibreur de charge. Pour afficher les zones, exécutez `ibmcloud oc zone ls`. `service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan` : Annotation utilisée pour spécifier un VLAN sur lequel est déployé le service d'équilibreur de charge. Pour voir les réseaux locaux virtuels, exécutez `ibmcloud oc vlan ls --zone ZONE`. `service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"` : Annotation utilisée pour spécifier un équilibreur de charge version 2.0. `service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler` : Facultatif : annotation utilisée pour spécifier l'algorithme de planification. Les valeurs acceptées sont `"rr"` pour le round-robin (par défaut) ou `"sh"` pour le Source Hashing. Pour plus d'informations, voir [2.0 : Algorithmes de planification](#scheduling). `selector` : Clé de libellé (`<selector_key>`) et valeur (`<selector_value>`) que vous avez utilisées dans la section `spec.template.metadata.labels` du déploiement de votre application YAML. `port` : Port sur lequel le service est à l'écoute. `loadBalancerIP` : Facultatif : pour créer un équilibreur de charge de réseau privé ou utiliser une adresse IP portable spécifique pour un équilibreur de charge de réseau public, indiquez l'adresse IP que vous désirez utiliser. Cette adresse IP doit se trouver dans la zone et dans le VLAN que vous avez spécifiés dans les annotations. Si vous ne spécifiez pas d'adresse IP : : Si votre cluster se trouve sur un VLAN public, une adresse IP publique portable est utilisée. La plupart des clusters se trouvent sur un VLAN public. : Si votre cluster se trouve sur un VLAN privé uniquement, une adresse IP privée portable est utilisée. `externalTrafficPolicy: Local` : Définit sur `Local`. Exemple de fichier de configuration permettant de créer un service NLB 2.0 `dal12` utilisant l'algorithme de répartition round-robin : ```yaml {: codeblock} apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs" service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr" spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. externalTrafficPolicy: Local ``` 3. Facultatif : limitez l'accès à votre service NLB à une plage d'adresses IP restreinte en spécifiant ces adresses dans le champ `spec.loadBalancerSourceRanges`. Cette fonctionnalité est `loadBalancerSourceRanges` mise en œuvre par `kube-proxy` dans votre cluster à l'aide de règles iptables sur les nœuds de travail. Pour plus d'informations, consultez la [documentation d' Kubernetes.](https://kubernetes.io/docs/concepts/services-networking/){: external} 4. Créez le service dans votre cluster. ```sh {: pre} oc apply -f myloadbalancer.yaml ``` - Créez un fichier de configuration de service nommé, par exemple,
-
Vérifiez que la création du service d'équilibreur de charge de réseau a abouti. La création du service d'équilibreur de charge de réseau et la mise à disposition de l'application peuvent prendre quelques minutes.
oc describe service myloadbalancerExemple de sortie :
NAME: myloadbalancer Namespace: default Labels: <none> Selector: app=liberty Type: LoadBalancer Zone: dal10 IP: 172.21.xxx.xxx LoadBalancer Ingress: 169.xx.xxx.xxx Port: <unset> 8080/TCP NodePort: <unset> 32040/TCP Endpoints: 172.30.xxx.xxx:8080 Session Affinity: None Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- ---- ------ ------- 10s 10s 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 10s 10s 1 {service-controller } Normal CreatedLoadBalancer Created load balancerL'adresse IP LoadBalancer Ingress est l'adresse IP portable affectée à votre service d'équilibreur de charge de réseau.
-
Si vous avez créé un équilibreur de charge de réseau public, accédez à votre application via Internet.
- Ouvrez le navigateur Web de votre choix.
- Entrez l'adresse IP publique portable de l'équilibreur de charge de réseau et le port.
http://169.xx.xxx.xxx:8080 ``` -
Pour garantir une haute disponibilité, répétez les étapes 2 à 4 afin d’ajouter une instance NLB 2.0 dans chaque zone où se trouvent des instances de votre application.
-
Facultatif : un service d'équilibreur de charge de réseau rend votre application accessible via les ports de noeud du service. Les ports de noeud (NodePort) sont accessibles sur toutes les adresses IP publiques et privées pour tous les noeuds figurant dans le cluster. Pour bloquer le trafic vers les ports de noeud lorsque vous utilisez un service d'équilibreur de charge de réseau, voir Contrôle du trafic entrant vers les services d'équilibreur de charge de réseau ou NodePort.
Ensuite, vous pouvez enregistrer un sous-domaine d'équilibreur de charge de réseau.
Configuration d'un équilibreur de charge de réseau 2.0 dans un cluster à zone unique
Avant de commencer
Veuillez remplir les conditions préalables à l' 2.0 ation de NLB avant de poursuivre.
-
Vous devez disposer d'une adresse IP publique ou privée portable disponible pour l'affecter au service d'équilibreur de charge de réseau. Pour plus d'informations, voir Configuration de sous-réseaux pour les clusters.
-
Assurez-vous de disposer du rôle d'accès au service IAM Writer ou Manager IBM Cloud pour l'espace de noms
default. -
Lorsque les nœuds de cluster sont rechargés ou lorsqu'une mise à jour de cluster de cluster inclut une nouvelle image
keepalived, l'adresse IP virtuelle de l'équilibreur de charge est déplacée vers l'interface réseau d'un nouveau noeud. Lorsque cela se produit, toute connexion de longue durée à votre équilibreur de charge doit être rétablie. Pensez à intégrer une logique de réessai dans votre application afin que les tentatives de rétablissement de la connexion soient effectuées rapidement.
Pour créer un service d'équilibreur de charge de réseau 2.0 dans un cluster à zone unique :
-
Déployez votre application sur le cluster. Prenez soin d'ajouter un libellé à votre déploiement dans la section "metadata" de votre fichier de configuration de déploiement. Ce libellé personnalisé identifie tous les pods dans lesquels s'exécute votre application afin de pouvoir les inclure dans l'équilibrage de charge.
-
Créez un service d'équilibreur de charge pour l'application que vous désirez exposer sur l'Internet public ou sur un réseau privé.
-
Créez un fichier de configuration de service nommé, par exemple,
myloadbalancer.yaml. -
Définissez un service d'équilibreur de charge 2.0 pour l'application que vous souhaitez exposer.
apiVersion: v1 kind: Service metadata: name: myloadbalancer annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private> service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>" service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs" service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>" spec: type: LoadBalancer selector: <selector_key>: <selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. loadBalancerIP: <IP_address> externalTrafficPolicy: Local ``` `service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type` : Annotation permettant de spécifier un équilibreur de charge `private` ou `public`. `service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan` : Facultatif : annotation utilisée pour spécifier un VLAN sur lequel est déployé le service d'équilibreur de charge. Pour voir les réseaux locaux virtuels, exécutez `ibmcloud oc vlan ls --zone ZONE`. `service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"` : Annotation utilisée pour spécifier un équilibreur de charge 2.0. `service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler` : Facultatif : annotation utilisée pour spécifier un algorithme de planification. Les valeurs acceptées sont `"rr"` pour le round-robin (par défaut) ou `"sh"` pour le Source Hashing. Pour plus d'informations, voir [2.0 : Algorithmes de planification](#scheduling). `selector` : Clé de libellé (`<selector_key>`) et valeur (`<selector_value>`) que vous avez utilisées dans la section `spec.template.metadata.labels` du déploiement de votre application YAML. `port` : Port sur lequel le service est à l'écoute. `loadBalancerIP` : Facultatif : pour créer un équilibreur de charge de réseau privé ou utiliser une adresse IP portable spécifique pour un équilibreur de charge de réseau public, indiquez l'adresse IP que vous désirez utiliser. Cette adresse IP doit se trouver sur le VLAN que vous avez spécifié dans les annotations. Si vous ne spécifiez pas d'adresse IP : - Si votre cluster se trouve sur un VLAN public, une adresse IP publique portable est utilisée. La plupart des clusters se trouvent sur un VLAN public. - Si votre cluster se trouve sur un VLAN privé uniquement, une adresse IP privée portable est utilisée. `externalTrafficPolicy: Local` : Définit sur `Local`. 3. Facultatif : limitez l'accès à votre service NLB à une plage d'adresses IP restreinte en spécifiant ces adresses dans le champ `spec.loadBalancerSourceRanges`. Cette fonctionnalité est `loadBalancerSourceRanges` mise en œuvre par `kube-proxy` dans votre cluster à l'aide de règles iptables sur les nœuds de travail. Pour plus d'informations, consultez la [documentation d' Kubernetes.](https://kubernetes.io/docs/concepts/services-networking/){: external} 4. Créez le service dans votre cluster. ```sh {: pre} oc apply -f myloadbalancer.yaml ``` -
-
Vérifiez que la création du service d'équilibreur de charge de réseau a abouti. La création du service et la mise à disposition de l'application peuvent prendre quelques minutes.
oc describe service myloadbalancerExemple de sortie :
NAME: myloadbalancer Namespace: default Labels: <none> Selector: app=liberty Type: LoadBalancer Location: dal10 IP: 172.21.xxx.xxx LoadBalancer Ingress: 169.xx.xxx.xxx Port: <unset> 8080/TCP NodePort: <unset> 32040/TCP Endpoints: 172.30.xxx.xxx:8080 Session Affinity: None Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- ---- ------ ------- 10s 10s 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 10s 10s 1 {service-controller } Normal CreatedLoadBalancer Created load balancerL'adresse IP LoadBalancer Ingress est l'adresse IP portable affectée à votre service d'équilibreur de charge de réseau.
-
Si vous avez créé un équilibreur de charge de réseau public, accédez à votre application via Internet.
- Ouvrez le navigateur Web de votre choix.
- Entrez l'adresse IP publique portable de l'équilibreur de charge de réseau et le port.
http://169.xx.xxx.xxx:8080 ``` -
Facultatif : un service d'équilibreur de charge de réseau rend votre application accessible via les ports de noeud du service. Les ports de noeud (NodePort) sont accessibles sur toutes les adresses IP publiques et privées pour tous les noeuds figurant dans le cluster. Pour bloquer le trafic vers les ports de noeud lorsque vous utilisez un service d'équilibreur de charge de réseau, voir Contrôle du trafic entrant vers les services d'équilibreur de charge de réseau ou NodePort.
Ensuite, vous pouvez enregistrer un sous-domaine d'équilibreur de charge de réseau.
Algorithmes de planification
Les algorithmes de planification déterminent comment un équilibreur de charge de réseau 2.0 affecte des connexions réseau à vos pods d'application. Lorsque les demandes du client parviennent à votre cluster, l'équilibreur de charge de réseau
achemine les paquets de demandes aux noeuds worker en fonction de l'algorithme de planification. Pour utiliser un algorithme de planification, indiquez son nom abrégé Keepalived dans l'annotation scheduler de votre fichier de
configuration du service NLB : service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr". Consultez les listes suivantes pour voir les algorithmes de planification pris en charge dans Red Hat OpenShift
on IBM Cloud. Si vous ne spécifiez pas d'algorithme de planification, l'algorithme round-robin est utilisé par défaut. Pour plus d'informations, consultez la documentation Keepalived.
Algorithmes de planification pris en charge
- Round Robin (
rr) - L'équilibreur de charge de réseau parcourt la liste des pods d'application lors du routage des connexions aux noeuds worker, en traitant chaque pod d'application de manière équitable. round-robin est l'algorithme de planification par défaut pour les équilibreurs de charge de réseau de la version 2.0.
- Hashing source (
sh) - L'équilibreur de charge de réseau génère une clé de hachage en fonction de l'adresse IP source du paquet de demandes du client. L'équilibreur de charge de réseau recherche ensuite la clé de hachage dans une table de hachage affectée de manière
statique et achemine la demande au pod d'application qui traite les hachages de cette plage. Cet algorithme garantit que les demandes d'un client particulier sont toujours dirigées vers le même pod d'application. Kubernetes utilise les
règles Iptables, qui entraînent l'envoi de requêtes à un pod aléatoire sur l'agent. Pour utiliser cet algorithme de planification, vous devez vous assurer qu'il n'y a qu'un seul pod de votre application déployé par noeud worker. Par exemple,
si chaque pod porte le libellé
run=<app_name>, ajoutez la règle anti-affinité suivante à la sectionspecde votre déploiement d'application :
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: run
operator: In
values:
- <APP_NAME>
topologyKey: kubernetes.io/hostname
Algorithmes de planification non pris en charge
- Hashing de destination (
dh) - La destination du paquet, qui correspond à l'adresse IP et au port de l'équilibreur de charge de réseau, est utilisée pour déterminer le noeud worker qui traite la demande entrante. Cependant, l'adresse IP et le port des équilibreurs de charge de réseau dans Red Hat OpenShift on IBM Cloud ne bougent pas. L'équilibreur de charge de réseau est obligé de conserver la demande dans le même noeud worker où il se trouve, donc seuls les pods d'application sur un noeud worker traitent toutes les demandes entrantes.
- Algorithmes de comptabilisation dynamique des connexions
- Les algorithmes suivants dépendent de la comptabilisation dynamique des connexions entre les clients et les équilibreurs de charge de réseau. Cependant le mode DSR (Direct Service Return) empêche les pods d'équilibreur de charge de réseau
2.0 d'être dans le chemin des paquets renvoyés et les équilibreurs de charge de réseau n'assurent pas le suivi des connexions établies.
- Connexion minimale (
lc) - Connexion minimale basée sur la localisation (
lblc) - Localité - Connexion minimale avec réplication (
lblcr) - Jamais de file d'attente (
nq) - Délai de retard prévu (
seq)
- Connexion minimale (
- Algorithmes de pods pondérés
- Les algorithmes suivants dépendent des pods d'application pondérés. Cependant, dans Red Hat OpenShift on IBM Cloud, une pondération égale est affectée à tous les pods d'application pour l'équilibrage de charge.
- Connexion la moins pondérée (
wlc) - Permutation circulaire pondérée (
wrr)
- Connexion la moins pondérée (