Cette page explique comment configurer l'équilibrage de charge groupé pour Anthos clusters on bare metal. Anthos Clusters on Bare Metal déploie des équilibreurs de charge de couche 4 qui s'exécutent sur un pool dédié de nœuds de calcul ou sur les mêmes nœuds que le plan de contrôle.
Pour obtenir des exemples de topologies d'équilibrage de charge disponibles dans Anthos clusters on bare metal, consultez la page Présentation des équilibreurs de charge.
Conditions requises
- Tous les nœuds d'équilibreur de charge doivent se trouver dans le même sous-réseau de couche 2.
- Tous les adresses IP virtuelles doivent se trouver dans le sous-réseau des nœuds d'équilibrage de charge et pouvoir être acheminés par la passerelle du sous-réseau.
- La passerelle du sous-réseau d'équilibrage de charge doit écouter les messages ARP gratuits et transmettre les paquets ARP aux nœuds d'équilibrage de charge.
Champs de configuration
Modifiez la section cluster.spec.loadBalancer
du fichier de configuration de cluster pour configurer l'équilibrage de charge groupé. Pour obtenir des informations sur les fichiers de configuration de cluster et pour obtenir des exemples de configurations valides, consultez l'une des pages suivantes :
- Créer des clusters d'administrateur
- Créer des clusters d'utilisateur
- Créer des clusters hybrides
- Créer des clusters autonomes
loadBalancer.mode
Cette valeur doit être définie sur bundled
pour activer l'équilibrage de charge groupé.
loadBalancer.ports.controlPlaneLBPort
Cette valeur spécifie le port de destination à utiliser pour le trafic envoyé au plan de contrôle Kubernetes (les serveurs d'API Kubernetes).
loadBalancer.vips.controlPlaneVIP
Cette valeur spécifie l'adresse IP de destination à utiliser pour le trafic envoyé au plan de contrôle Kubernetes (les serveurs d'API Kubernetes). Cette adresse IP doit se trouver dans le même sous-réseau de couche 2 que les nœuds exécutant des équilibreurs de charge. Ne répertoriez pas cette adresse dans la section address pools
du fichier de configuration.
loadBalancer.vips.ingressVIP
Cette valeur spécifie l'adresse IP à utiliser pour les services placés derrière l'équilibreur de charge pour le trafic entrant. Ce champ n'est pas autorisé dans les fichiers de configuration du cluster d'administrateur. Cette adresse doit être répertoriée dans la section pools d'adresses de la configuration.
loadBalancer.addressPools
Cette section de la configuration contient un ou plusieurs pools d'adresses spécifiés au format suivant :
- name: pool-name
avoidBuggyIPs: boolean
manualAssign: boolean
addresses:
- ip-range
- ip-range
- name : nom du pool d'adresses, pool-name, à des fins d'organisation.
- avoidBuggyIPs : (facultatif)
true
oufalse
. Si la valeur esttrue
, le pool omet les adresses IP se terminant par.0
et.255
. Certains matériels réseau suppriment le trafic vers ces adresses spéciales. Vous pouvez omettre ce champ, dont la valeur par défaut estfalse
. - manualAssign : (facultatif)
true
oufalse
. Si la valeur esttrue
, les adresses de ce pool ne sont pas automatiquement attribuées aux services Kubernetes. Si la valeur esttrue
, une adresse IP de ce pool ne va être utilisée que si elle est spécifiée explicitement par un service. Vous pouvez omettre ce champ, dont la valeur par défaut est "false". - addresses : liste d'une ou de plusieurs plages d'adresses IP qui ne se chevauchent pas.
ip-range peut être spécifié en notation CIDR (comme
198.51.100.0/24
) ou en notation de plage (comme198.51.100.0-198.51.100.10
, sans espace autour du tiret).
Les plages d'adresses IP de la liste addresses
ne doivent pas se chevaucher et doivent se trouver dans le même sous-réseau que les nœuds qui exécutent les équilibreurs de charge.
loadBalancer.nodePoolSpec
Cette section de la configuration spécifie une liste de nœuds sur lesquels exécuter les équilibreurs de charge. Les nœuds d'équilibrage de charge peuvent exécuter des charges de travail standards par défaut. Il n'existe pas de rejet spécial sur ces nœuds. L'exemple ci-dessous montre un pool de nœuds avec deux nœuds. Le premier nœud, 1.2.3.4
, utilise le champ k8sIP
pour spécifier l'adresse IP du nœud dans le cluster. L'adresse 1.2.3.4
n'est utilisée que pour l'accès SSH.
nodePoolSpec:
nodes:
- address: 1.2.3.4
k8sIP: 10.0.0.32
- address: 10.0.0.33
Tous les nœuds du pool de nœuds d'équilibrage de charge doivent se trouver dans le même sous-réseau de couche 2 que les adresses IP virtuelles de l'équilibreur de charge configurées dans la section loadBalancer.addressPools
du fichier de configuration.
Si un nœud a une adresse k8sIP
configurée, seule cette adresse doit se trouver dans le même sous-réseau de couche 2 que les autres adresses IP virtuelles de l'équilibreur de charge.
Si nodePoolSpec
n'est pas défini, les équilibreurs de charge groupés s'exécutent sur les nœuds du plan de contrôle. Si possible, nous vous recommandons d'exécuter des équilibreurs de charge sur des pools de nœuds distincts.
Équilibrage de charge du plan de contrôle
L'équilibreur de charge du plan de contrôle diffuse l'adresse IP virtuelle (VIP) du plan de contrôle. Les clusters Anthos sur Bare Metal exécutent Keepalived et HAProxy en tant que pods statiques Kubernetes sur les nœuds de l'équilibreur de charge pour annoncer l'adresse IP virtuelle de plan de contrôle. Keepalived utilise le protocole VRRP (Virtual Router Redundancy Protocol) sur les nœuds d'équilibrage de charge, pour une haute disponibilité.
Équilibrage de charge du plan de données
L'équilibreur de charge du plan de données est destiné à tous les services Kubernetes de type LoadBalancer
.
Les clusters Anthos sur Bare Metal utilisent MetalBB qui s'exécute en mode couche 2 pour l'équilibrage de charge du plan de données. L'équilibrage de charge du plan de données ne peut être configuré que via Anthos clusters on bare metal. Ne modifiez pas directement le fichier ConfigMap de MetalLB. Vous pouvez utiliser toutes les fonctionnalités de MetalLB, y compris le partage d'adresses IP entre plusieurs services.
Pour plus d'informations sur les fonctionnalités, consultez la documentation de MetalLB.
MetaLB exécute un pod d'enceintes sur chaque nœud avec un daemonset, en utilisant memberlist pour la haute disponibilité. Chaque service Kubernetes dispose d'un nœud d'équilibrage de charge dédié à metalLB, plutôt qu'un nœud pour l'ensemble du cluster. De cette façon, le trafic est réparti entre les nœuds d'équilibrage de charge s'il existe plusieurs services.
Les équilibreurs de charge du plan de données peuvent s'exécuter sur les nœuds du plan de contrôle ou sur un sous-ensemble de nœuds de calcul. En regroupant les équilibreurs de charge du plan de données sur les nœuds du plan de contrôle, vous augmentez l'utilisation de ces nœuds du plan de contrôle. Toutefois, le regroupement sur les nœuds du plan de contrôle augmente également le risque de surcharger le plan de contrôle et augmente le profil de risque des informations confidentielles du plan de contrôle, telles que les clés SSH.
Conserver l'adresse IP source du client
Le Service LoadBalancer
créé avec la solution groupée d'équilibrage de charge de couche 2 utilise le paramètre Cluster
par défaut pour la règle de trafic externe.
Ce paramètre, spec.externalTrafficPolicy: Cluster
, achemine le trafic externe vers les points de terminaison à l'échelle du cluster, mais il masque également l'adresse IP source du client.
Les sections suivantes expliquent comment configurer votre cluster pour conserver l'adresse IP source du client.
Services NodePort
Kubernetes effectue la traduction d'adresse réseau source (NAT) pour les Services NodePort
. Pour conserver les adresses IP sources du client, définissez service.spec.externalTrafficPolicy
sur Local
. Kubernetes n'effectuera plus de traduction NAT source, mais vous devez vous assurer que des pods s'exécutent exactement sur l'adresse IP du nœud que vous avez choisi.
Services LoadBalancer
Lorsque vous utilisez externalTrafficPolicy: Local
dans vos Services LoadBalancer
, configurez les pods de votre application pour qu'ils s'exécutent exactement sur les nœuds d'équilibreur de charge. Ajoutez le nodeSelector
suivant aux pods de votre application pour effectuer cette modification :
apiVersion: v1
kind: Pod
...
spec:
nodeSelector:
baremetal.cluster.gke.io/lbnode: "true"
...
Entrée
Si vos applications sont des services HTTP, vous pouvez obtenir une visibilité sur l'adresse IP du client en configurant des composants d'entrée :
Ouvrez le Service
istio-ingress
pour le modifier :kubectl edit service -n gke-system istio-ingress
Ajoutez
externalTrafficPolicy: Local
au fichierspec
, enregistrez et quittez l'éditeur.apiVersion: v1 kind: Service ... spec: ... externalTrafficPolicy: Local
Ouvrez le Déploiement
istio-ingress
pour le modifier :kubectl edit deployment -n gke-system istio-ingress
Ajoutez l'élément
nodeSelector
suivant au Déploiement. enregistrez et quittez l'éditeur.apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: ... nodeSelector: baremetal.cluster.gke.io/lbnode: "true" ...
Tous vos services derrière Ingress affichent désormais un en-tête X-Forwarded-For
avec l'adresse IP du client, comme dans l'exemple suivant :
X-Forwarded-For: 21.0.104.4