32.9. Configuration des services pour l'utilisation de MetalLB


En tant qu'administrateur de cluster, lorsque vous ajoutez un service de type LoadBalancer, vous pouvez contrôler la manière dont MetalLB attribue une adresse IP.

32.9.1. Demander une adresse IP spécifique

Comme d'autres implémentations de load-balancer, MetalLB accepte le champ spec.loadBalancerIP dans la spécification du service.

Si l'adresse IP demandée se trouve dans une plage d'un pool d'adresses, MetalLB attribue l'adresse IP demandée. Si l'adresse IP demandée ne se trouve dans aucune plage, MetalLB signale un avertissement.

Exemple de service YAML pour une adresse IP spécifique

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
  annotations:
    metallb.universe.tf/address-pool: <address_pool_name>
spec:
  selector:
    <label_key>: <label_value>
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: LoadBalancer
  loadBalancerIP: <ip_address>

Si la MetalLB ne peut pas attribuer l'adresse IP demandée, le site EXTERNAL-IP pour les rapports de service <pending> et l'exécution de oc describe service <service_name> comprend un événement comme dans l'exemple suivant.

Exemple d'événement lorsque MetalLB ne peut pas attribuer une adresse IP demandée

  ...
Events:
  Type     Reason            Age    From                Message
  ----     ------            ----   ----                -------
  Warning  AllocationFailed  3m16s  metallb-controller  Failed to allocate IP for "default/invalid-request": "4.3.2.1" is not allowed in config

32.9.2. Demande d'une adresse IP à partir d'un pool spécifique

Pour attribuer une adresse IP à partir d'une plage spécifique, mais sans vous préoccuper de l'adresse IP en question, vous pouvez utiliser l'annotation metallb.universe.tf/address-pool pour demander une adresse IP à partir du pool d'adresses spécifié.

Exemple de service YAML pour une adresse IP d'un pool spécifique

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
  annotations:
    metallb.universe.tf/address-pool: <address_pool_name>
spec:
  selector:
    <label_key>: <label_value>
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: LoadBalancer

Si le pool d'adresses que vous spécifiez pour <address_pool_name> n'existe pas, MetalLB tente d'attribuer une adresse IP à partir de n'importe quel pool autorisant l'attribution automatique.

32.9.3. Accepter n'importe quelle adresse IP

Par défaut, les pools d'adresses sont configurés pour permettre une attribution automatique. MetalLB attribue une adresse IP à partir de ces pools d'adresses.

Pour accepter n'importe quelle adresse IP de n'importe quel pool configuré pour l'attribution automatique, aucune annotation ou configuration spéciale n'est nécessaire.

Exemple de service YAML pour l'acceptation de n'importe quelle adresse IP

apiVersion: v1
kind: Service
metadata:
  name: <service_name>
spec:
  selector:
    <label_key>: <label_value>
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: LoadBalancer

32.9.4. Partager une adresse IP spécifique

Par défaut, les services ne partagent pas les adresses IP. Cependant, si vous avez besoin de colocaliser des services sur une seule adresse IP, vous pouvez activer le partage sélectif d'IP en ajoutant l'annotation metallb.universe.tf/allow-shared-ip aux services.

apiVersion: v1
kind: Service
metadata:
  name: service-http
  annotations:
    metallb.universe.tf/address-pool: doc-example
    metallb.universe.tf/allow-shared-ip: "web-server-svc"  1
spec:
  ports:
    - name: http
      port: 80  2
      protocol: TCP
      targetPort: 8080
  selector:
    <label_key>: <label_value>  3
  type: LoadBalancer
  loadBalancerIP: 172.31.249.7  4
---
apiVersion: v1
kind: Service
metadata:
  name: service-https
  annotations:
    metallb.universe.tf/address-pool: doc-example
    metallb.universe.tf/allow-shared-ip: "web-server-svc"  5
spec:
  ports:
    - name: https
      port: 443  6
      protocol: TCP
      targetPort: 8080
  selector:
    <label_key>: <label_value>  7
  type: LoadBalancer
  loadBalancerIP: 172.31.249.7  8
1 5
Spécifiez la même valeur pour l'annotation metallb.universe.tf/allow-shared-ip. Cette valeur est appelée sharing key.
2 6
Spécifiez des numéros de port différents pour les services.
3 7
Spécifiez des sélecteurs de pods identiques si vous devez spécifier externalTrafficPolicy: local pour que les services envoient du trafic au même ensemble de pods. Si vous utilisez la stratégie de trafic externe cluster, il n'est pas nécessaire que les sélecteurs de pods soient identiques.
4 8
Facultatif : Si vous spécifiez les trois éléments précédents, MetalLB peut colocaliser les services sur la même adresse IP. Pour s'assurer que les services partagent une adresse IP, spécifiez l'adresse IP à partager.

Par défaut, Kubernetes n'autorise pas les services d'équilibrage de charge multiprotocole. Cette limitation rendrait normalement impossible l'exécution d'un service comme DNS qui a besoin d'écouter à la fois sur TCP et UDP. Pour contourner cette limitation de Kubernetes avec MetalLB, créez deux services :

  • Pour un service, spécifiez TCP et pour le second service, spécifiez UDP.
  • Dans les deux services, spécifiez le même sélecteur de pods.
  • Spécifiez la même clé de partage et la même valeur spec.loadBalancerIP pour héberger les services TCP et UDP sur la même adresse IP.

32.9.5. Configurer un service avec MetalLB

Vous pouvez configurer un service de répartition de charge pour qu'il utilise une adresse IP externe provenant d'un pool d'adresses.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Installez l'opérateur MetalLB et démarrez MetalLB.
  • Configurez au moins un pool d'adresses.
  • Configurez votre réseau pour acheminer le trafic des clients vers le réseau hôte du cluster.

Procédure

  1. Créez un fichier <service_name>.yaml. Dans le fichier, assurez-vous que le champ spec.type est défini sur LoadBalancer.

    Reportez-vous aux exemples pour savoir comment demander l'adresse IP externe que MetalLB attribue au service.

  2. Créer le service :

    oc apply -f <service_name>.yaml

    Exemple de sortie

    service/-YRFFGUNA nom_du_service> créé

Vérification

  • Décrivez le service :

    oc describe service <service_name> $ oc describe service <service_name>

    Exemple de sortie

    Name:                     <service_name>
    Namespace:                default
    Labels:                   <none>
    Annotations:              metallb.universe.tf/address-pool: doc-example  <.>
    Selector:                 app=service_name
    Type:                     LoadBalancer  <.>
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.105.237.254
    IPs:                      10.105.237.254
    LoadBalancer Ingress:     192.168.100.5  <.>
    Port:                     <unset>  80/TCP
    TargetPort:               8080/TCP
    NodePort:                 <unset>  30550/TCP
    Endpoints:                10.244.0.50:8080
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:  <.>
      Type    Reason        Age                From             Message
      ----    ------        ----               ----             -------
      Normal  nodeAssigned  32m (x2 over 32m)  metallb-speaker  announcing from node "<node_name>"

    <.> L'annotation est présente si vous demandez une adresse IP à partir d'un pool spécifique. <.> Le type de service doit indiquer LoadBalancer. <.> Le champ d'entrée de l'équilibreur de charge indique l'adresse IP externe si le service est correctement attribué. <.> Le champ des événements indique le nom du nœud affecté à l'annonce de l'adresse IP externe. En cas d'erreur, le champ events indique la raison de l'erreur.

Red Hat logoGithubRedditYoutube

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.