Configuration d'équilibreurs de charge et d'équilibreurs de charge réseau

Découvrez comment définir les équilibreurs de charge et les équilibreurs de charge réseau Oracle Cloud Infrastructure provisionnés par Kubernetes Engine (OKE) pour un service Kubernetes de type LoadBalancer.

Création d'équilibreurs de charge internes

Vous pouvez créer des équilibreurs de charge Oracle Cloud Infrastructure et des équilibreurs de charge réseau afin de contrôler l'accès aux services exécutés sur un cluster :

  • Lorsque vous créez un cluster dans le workflow Création personnalisée, vous devez sélectionner le réseau cloud virtuel existant qui contient les ressources réseau que le nouveau cluster doit utiliser. Si vous souhaitez utiliser un équilibreur de charge ou un équilibreur de charge réseau pour contrôler le trafic vers le VCN, vous sélectionnez un sous-réseau public ou privé existant dans ce VCN pour l'héberger.
  • Lorsque vous créez un cluster dans le workflow Création rapide, le VCN créé automatiquement contient un sous-réseau régional public pour héberger un équilibreur de charge ou un équilibreur de charge réseau. Si vous souhaitez héberger un équilibreur de charge ou un équilibreur de charge réseau dans un sous-réseau privé, vous pouvez ajouter un sous-réseau privé au VCN ultérieurement.

Vous pouvez également définir un service Kubernetes interne de type LoadBalancer (souvent appelé simplement "équilibreur de charge interne") dans un cluster pour permettre à d'autres programmes exécutés dans le même VCN que le cluster d'accéder aux services du cluster. Un équilibreur de charge interne peut être provisionné :

  • en tant qu'équilibreur de charge ou en tant qu'équilibreur de charge réseau
  • avec une adresse IP publique ou une adresse IP privée (affectée par le service Load Balancer ou le service Network Load Balancer)
  • dans un sous-réseau public ou dans un sous-réseau privé

Un équilibreur de charge ou un équilibreur de charge réseau avec une adresse IP publique est appelé public. Un équilibreur de charge public ou un équilibreur de charge réseau peut être hébergé dans un sous-réseau public ou privé.

Un équilibreur de charge ou un équilibreur de charge réseau avec une adresse IP privée est appelé "privé". Un équilibreur de charge privé ou un équilibreur de charge réseau peut être hébergé dans un sous-réseau public ou un sous-réseau privé.

Par défaut, les équilibreurs de charge internes sont provisionnés avec des adresses IP publiques et hébergés dans des sous-réseaux publics.

Pour plus d'informations :

Créer un équilibreur de charge interne en tant qu'équilibreur de charge OCI

Pour créer un équilibreur de charge interne en tant qu'équilibreur de charge OCI avec une adresse IP privée, hébergé sur le sous-réseau indiqué pour les équilibreurs de charge lors de la création du cluster, ajoutez l'annotation suivante à la section des métadonnées du fichier manifeste :

service.beta.kubernetes.io/oci-load-balancer-internal: "true"

Pour créer un équilibreur de charge interne en tant qu'équilibreur de charge OCI avec une adresse IP privée hébergée sur un autre sous-réseau que celui indiqué pour les équilibreurs de charge lors de la création du cluster, ajoutez les deux annotations suivantes à la section des métadonnées du fichier manifeste :

service.beta.kubernetes.io/oci-load-balancer-internal: "true"
service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"

ocid1.subnet.oc1..aaaaaa....vdfw est l'OCID du sous-réseau alternatif. Le sous-réseau alternatif peut être privé ou public.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    service.beta.kubernetes.io/oci-load-balancer-internal: "true"
    service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 8100
  selector:
    app: nginx
Créer un équilibreur de charge réseau interne en tant qu'équilibreur de charge réseau OCI

Pour créer un équilibreur de charge réseau interne en tant qu'équilibreur de charge réseau OCI avec une adresse IP privée, hébergé sur le sous-réseau indiqué pour les équilibreurs de charge lors de la création du cluster, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/internal: "true"

Pour créer un équilibreur de charge réseau interne en tant qu'équilibreur de charge réseau OCI avec une adresse IP privée, hébergé sur un autre sous-réseau que celui indiqué pour les équilibreurs de charge lors de la création du cluster, ajoutez les deux annotations suivantes dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/internal: "true"
oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1..aaaaaa....vdfw"

ocid1.subnet.oc1..aaaaaa....vdfw est l'OCID du sous-réseau privé. Le sous-réseau alternatif peut être privé ou public.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/internal: "true"
    oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1..aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Spécification d'adresses IP publiques réservées

Lorsqu'un service Kubernetes de type LoadBalancer est déployé sur un cluster, Kubernetes Engine crée un équilibreur de charge public ou un équilibreur de charge réseau Oracle Cloud Infrastructure pour accepter le trafic vers le cluster. Par défaut, une adresse IP publique éphémère est affectée à l'équilibreur de charge public ou à l'équilibreur de charge réseau Oracle Cloud Infrastructure. Cependant, une adresse IP publique éphémère est temporaire et ne dure que pendant la durée de vie de l'équilibreur de charge public ou de l'équilibreur de charge réseau.

Si vous voulez que l'équilibreur de charge public ou l'équilibreur de charge réseau Oracle Cloud Infrastructure créé par Kubernetes Engine dispose du même déploiement d'adresse IP publique après le déploiement, vous pouvez lui affecter une adresse IP publique réservée à partir du pool d'adresses IP publiques réservées. Pour plus d'informations sur la création et la visualisation d'adresses IP publiques réservées, reportez-vous à Adresses IP publiques.

Pour affecter une adresse IP publique réservée à l'équilibreur de charge public ou à l'équilibreur de charge réseau Oracle Cloud Infrastructure créé par Kubernetes Engine, ajoutez la propriété LoadBalancerIP à la section de spécification du fichier manifeste qui définit le service de type LoadBalancer, puis indiquez l'adresse IP publique réservée.

Affecter une adresse IP publique réservée à un équilibreur de charge public

Exemple :

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
spec:
  loadBalancerIP: 144.25.97.173
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
Affecter une adresse IP publique réservée à un équilibreur de charge de réseau public

Exemple :

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
  loadBalancerIP: 144.25.97.173
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Tenez compte des éléments suivants :

  • Si vous définissez la propriété loadBalancerIP du service LoadBalancer, vous ne pouvez pas modifier directement ultérieurement l'adresse IP de l'équilibreur de charge public ou de l'équilibreur de charge réseau Oracle Cloud Infrastructure créé par Kubernetes Engine. Si vous voulez modifier l'adresse IP, supprimez le service LoadBalancer, indiquez une autre adresse IP publique réservée dans le fichier manifeste, puis déployez à nouveau le service LoadBalancer.
  • Si vous ne définissez pas la propriété loadBalancerIP du service LoadBalancer, vous ne pouvez plus changer directement l'adresse IP de l'équilibreur de charge public ou de l'équilibreur de charge réseau Oracle Cloud Infrastructure créé par Kubernetes Engine à partir d'une adresse IP éphémère vers une adresse IP publique réservée. Si vous souhaitez basculer l'adresse IP éphémère vers une adresse IP publique réservée, supprimez le service de type LoadBalancer, définissez la propriété loadBalancerIP sur une adresse IP publique réservée dans le fichier manifeste, puis déployez à nouveau le service de type LoadBalancer.
  • Vous pouvez supprimer le service de type LoadBalancer et libérer l'adresse IP publique réservée pour d'autres utilisations (par exemple, pour l'affecter à un autre service de type LoadBalancer).
  • Vous ne pouvez pas indiquer d'adresse IP publique réservée pour un service de type LoadBalancer si la même adresse IP est déjà affectée à une autre ressource (par exemple, une instance de calcul ou un autre service de type LoadBalancer).
  • Vous ne pouvez pas ajouter la propriété loadBalancerIP au fichier manifeste d'un service d'équilibreur de charge interne (c'est-à-dire un fichier manifeste qui inclut l'annotation service.beta.kubernetes.io/oci-load-balancer-internal: "true" ou oci-network-load-balancer.oraclecloud.com/internal: "true").
  • Par défaut, l'adresse IP publique réservée que vous indiquez en tant que propriété loadBalancerIP d'un service de type LoadBalancer dans le fichier manifeste doit être une ressource dans le même compartiment que le cluster. Pour indiquer une adresse IP publique réservée dans un autre compartiment, procédez comme suit :

    • Pour les équilibreurs de charge publics, ajoutez la stratégie suivante à la location :
      ALLOW any-user to read public-ips in tenancy where request.principal.type = 'cluster'
      ALLOW any-user to manage floating-ips in tenancy where request.principal.type = 'cluster'
    • Pour les équilibreurs de charge réseau, ajoutez la stratégie suivante à la location :
      ALLOW any-user to use private-ips in TENANCY where ALL {request.principal.type = 'cluster', request.principal.compartment.id = 'target.compartment.id'}
      ALLOW any-user to manage public-ips in TENANCY where ALL {request.principal.type = 'cluster', request.principal.compartment.id = 'target.compartment.id'}

Spécification de groupes de sécurité réseau (recommandé)

Les groupes de sécurité réseau Oracle Cloud Infrastructure vous permettent de contrôler le trafic entrant et sortant des ressources, ainsi qu'entre les ressources. Les règles de sécurité définies pour un groupe de sécurité réseau garantissent que toutes les ressources de ce groupe ont le même état de sécurité. Pour plus d'informations, reportez-vous à Groupes de sécurité réseau.

Vous pouvez utiliser des groupes de sécurité réseau pour contrôler l'accès à l'équilibreur de charge Oracle Cloud Infrastructure ou à l'équilibreur de charge réseau provisionné par Kubernetes Engine pour un service Kubernetes de type LoadBalancer.

Lors de l'utilisation de groupes de sécurité réseau pour contrôler l'accès, des règles de sécurité appropriées doivent exister pour autoriser le trafic entrant et sortant vers et depuis le sous-réseau de l'équilibreur de charge ou de l'équilibreur de charge réseau. Reportez-vous à Règles de sécurité pour les équilibreurs de charge et les équilibreurs de charge réseau.

Si vous décidez d'utiliser des groupes de sécurité réseau pour contrôler l'accès aux équilibreurs de charge ou aux équilibreurs de charge réseau :

  • Les groupes de sécurité réseau et les règles de sécurité peuvent être entièrement gérés pour vous par oci-cloud-controller-manager (reportez-vous à Spécification des options de gestion des règles de sécurité pour les équilibreurs de charge et les équilibreurs de charge réseau).
  • Vous pouvez gérer vous-même les groupes de sécurité réseau et les règles de sécurité, et ajouter l'équilibreur de charge ou l'équilibreur de charge réseau aux groupes de sécurité réseau existants (comme décrit dans cette section).
  • Vous pouvez demander à oci-cloud-controller-manager de gérer certaines règles de sécurité dans un groupe de sécurité réseau, tandis que vous gérez d'autres règles de sécurité dans un autre.

Pour contrôler l'accès à l'aide d'un groupe de sécurité réseau que vous gérez, incluez des annotations dans le fichier manifeste pour indiquer le groupe de sécurité réseau auquel ajouter l'équilibreur de charge ou l'équilibreur de charge réseau.

Ajouter un équilibreur de charge à un groupe de sécurité réseau existant

Pour ajouter l'équilibreur de charge Oracle Cloud Infrastructure créé par Kubernetes Engine à un groupe de sécurité réseau que vous gérez, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"

<nsg-ocid> est l'OCID d'un groupe de sécurité réseau existant.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    oci.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
Ajouter un équilibreur de charge réseau à un groupe de sécurité réseau existant

Pour ajouter l'équilibreur de charge réseau Oracle Cloud Infrastructure créé par Kubernetes Engine à un groupe de sécurité réseau que vous gérez, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"

<nsg-ocid> est l'OCID d'un groupe de sécurité réseau existant.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Tenez compte des éléments suivants :

  • Le groupe de sécurité réseau que vous indiquez doit se trouver dans le même VCN que l'équilibreur de charge ou l'équilibreur de charge réseau Oracle Cloud Infrastructure.
  • Si le groupe de sécurité réseau que vous indiquez appartient à un autre compartiment du cluster, vous devez inclure une instruction de stratégie semblable à la suivante dans une stratégie IAM :
    ALLOW any-user to use network-security-groups in TENANCY where ALL { request.principal.type = 'cluster' }

    Si vous considérez cette instruction de stratégie comme trop permissive, vous pouvez limiter le droit d'accès permettant d'indiquer explicitement le compartiment auquel le groupe de sécurité réseau appartient et/ou d'indiquer explicitement le cluster. Par exemple :

    Allow any-user to use network-security-groups in compartment <compartment-ocid> where all { request.principal.id = '<cluster-ocid>' }
  • Vous pouvez indiquer jusqu'à cinq groupes de sécurité réseau, dans une liste séparée par des virgules, au format suivant :
    oci.oraclecloud.com/oci-network-security-groups: "<nsg1-ocid>,<nsg2-ocid>,<nsg3-ocid>,<nsg4-ocid>,<nsg5-ocid>"
  • Pour enlever un équilibreur de charge ou un équilibreur de charge réseau d'un groupe de sécurité réseau, ou pour modifier le groupe de sécurité réseau dans lequel se trouve l'équilibreur de charge ou l'équilibreur de charge réseau, mettez à jour l'annotation et appliquez de nouveau le manifeste.
  • Si vous décidez de contrôler l'accès à un équilibreur de charge Oracle Cloud Infrastructure ou à un équilibreur de charge réseau à l'aide d'un groupe de sécurité réseau que vous gérez, Oracle vous recommande de désactiver la gestion des listes de sécurité Kubernetes en ajoutant l'une des annotations suivantes dans la section de métadonnées du fichier manifeste de l'équilibreur de charge ou de l'équilibreur de charge réseau, respectivement :

    service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "None"
    oci-network-load-balancer.oraclecloud.com/security-list-management-mode:  "None"

    Vous pouvez également ajouter l'annotation équivalente suivante :

    oci.oraclecloud.com/security-rule-management-mode: "None" 

    Si vous suivez la recommandation et ajoutez l'annotation, la gestion des listes de sécurité Kubernetes n'est pas activée. Vous devez configurer des groupes de sécurité réseau avec des règles de sécurité entrantes et sortantes pour les pools de noeuds et l'adresse d'API Kubernetes (pour plus d'informations, reportez-vous à Configuration de règles de sécurité dans les groupes de sécurité réseau et/ou les listes de sécurité et à Exemples de configuration de ressource réseau). Vous devez également configurer des groupes de sécurité réseau avec des règles de sécurité entrantes et sortantes pour le port d'état de kube-proxy, pour la plage de ports de vérification de l'état et pour les équilibreurs de charge.

Spécification des options de gestion des règles de sécurité pour les équilibreurs de charge et les équilibreurs de charge réseau

Les règles de sécurité contrôlent l'accès aux équilibreurs de charge Oracle Cloud Infrastructure et aux équilibreurs de charge réseau provisionnés pour les services Kubernetes de type LoadBalancer. Les règles de sécurité peuvent être gérées (créées, mises à jour et supprimées) de l'une des manières suivantes :

  • Dans un groupe de sécurité réseau, ou groupe de sécurité réseau (recommandé) Les règles de sécurité d'un groupe de sécurité réseau s'appliquent à toute ressource Kubernetes ajoutée au groupe de sécurité réseau. Les groupes de sécurité réseau peuvent ainsi fournir un contrôle d'accès de niveau fin aux ressources individuelles.
  • Dans une liste de sécurité. Les règles de sécurité d'une liste de sécurité s'appliquent à toutes les ressources Kubernetes d'un sous-réseau. Les listes de sécurité ne fournissent pas de contrôle d'accès de niveau fin aux ressources individuelles du sous-réseau.

Pour consulter des informations importantes sur le fonctionnement des règles de sécurité et obtenir une comparaison générale entre les listes de sécurité et les groupes de sécurité réseau, reportez-vous à Règles de sécurité.

Remarque

Si les règles de sécurité sont gérées dans des listes de sécurité, la configuration et la gestion de la sécurité peuvent se compliquer lorsque l'infrastructure est complexe et lorsque vous utilisez des outils tels que Terraform. Notez également que la possibilité d'utiliser des listes de sécurité pour gérer les règles de sécurité sera en phase d'abandon dans une prochaine version. Pour ces raisons, Oracle recommande d'utiliser des groupes de sécurité réseau et l'annotation oci.oraclecloud.com/security-rule-management-mode pour gérer les règles de sécurité.

Vous pouvez gérer les règles de sécurité vous-même, en créant, en mettant à jour et en supprimant les règles selon vos besoins. Vous pouvez également indiquer que le gestionnaire oci-cloud-controller-manager (qui s'exécute sur le plan de contrôle de cluster) doit gérer pour vous une partie ou la totalité des règles de sécurité. Kubernetes Engine utilise oci-cloud-controller-manager pour provisionner les équilibreurs de charge et les équilibreurs de charge réseau pour les services Kubernetes de type LoadBalancer.

Utilisez des annotations différentes pour indiquer si oci-cloud-controller-manager gère les règles de sécurité d'un équilibreur de charge ou d'un équilibreur de charge réseau dans un groupe de sécurité réseau ou dans une liste de sécurité, comme suit :

Quelles que soient les annotations que vous utilisez et que vous ou le gestionnaire oci-cloud-controller-manager gériez les règles de sécurité dans une liste de sécurité ou dans un groupe de sécurité réseau, vous pouvez également indiquer l'OCID d'un ou de plusieurs groupes de sécurité réseau supplémentaires auxquels vous souhaitez que le gestionnaire oci-cloud-controller-manager ajoute l'équilibreur de charge ou l'équilibreur de charge réseau. Dans ce cas, vous utilisez l'annotation oci.oraclecloud.com/oci-network-security-groups ou oci-network-load-balancer.oraclecloud.com/oci-network-security-groups. Notez que le gestionnaire oci-cloud-controller-manager ne gère pas les règles de sécurité dans les groupes de sécurité réseau supplémentaires indiqués par ces annotations. Il est donc de votre responsabilité de gérer les règles de sécurité. Pour plus d'informations sur l'utilisation des annotations oci.oraclecloud.com/oci-network-security-groups ou oci-network-load-balancer.oraclecloud.com/oci-network-security-groups, reportez-vous à Spécification de groupes de sécurité réseau (recommandé).

Utilisation de l'annotation oci.oraclecloud.com/security-rule-management-mode pour gérer les règles de sécurité dans les groupes de sécurité réseau et les listes de sécurité

Stratégies IAM requises pour la gestion des règles de sécurité dans les groupes de sécurité réseau

Pour permettre à oci-cloud-controller-manager de gérer les règles de sécurité de l'équilibreur de charge d'un cluster dans les groupes de sécurité réseau, vous devez accorder au cluster le droit de gérer les groupes de sécurité réseau. Par exemple, pour accorder ce droit d'accès dans un compartiment particulier :

ALLOW any-user to manage network-security-groups in compartment <compartment-name> where request.principal.type = 'cluster' 

En outre, pour permettre à oci-cloud-controller-manager de créer un groupe de sécurité réseau, vous devez également autoriser le cluster à gérer des réseaux cloud virtuels ou des familles de réseaux virtuels. Par exemple, en spécifiant l'une ou l'autre des instructions de stratégie suivantes :

  • ALLOW any-user to manage vcns in compartment <compartment-name> where request.principal.type = 'cluster'
  • ALLOW any-user to manage virtual-network-family in compartment <compartment-name> where request.principal.type = 'cluster'

Utilisation de l'annotation oci.oraclecloud.com/security-rule-management-mode

Pour indiquer qu'oci-cloud-controller-manager doit gérer les règles de sécurité d'un équilibreur de charge ou d'un équilibreur de charge réseau dans un groupe de sécurité réseau (comme recommandé par Oracle), vous devez d'abord configurer les stratégies IAM nécessaires. Reportez-vous à Stratégies IAM requises pour la gestion des règles de sécurité dans les groupes de sécurité réseau. Après avoir configuré les stratégies IAM prérequises, vous pouvez ajouter l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci.oraclecloud.com/security-rule-management-mode: "NSG"

oci-cloud-controller-manager gère toutes les règles de sécurité requises pour l'entrée dans l'équilibreur de charge ou le service d'équilibreur de charge réseau, dans un groupe de sécurité réseau créé à cet effet par oci-cloud-controller-manager. Ce groupe de sécurité réseau est appelé groupe de sécurité réseau frontal et autorise le trafic entrant vers l'équilibreur de charge ou l'équilibreur de charge réseau à partir de 0.0.0.0/0, ou à partir du bloc CIDR source (et sur la plage de ports source) s'il est spécifié dans le fichier manifeste. oci-cloud-controller-manager crée les règles de sécurité suivantes dans le groupe de sécurité réseau frontal :

Direction Source Protocole/Port de destination Description
Entrant 0.0.0.0/0 (ou bloc CIDR source s'il est spécifié dans le fichier manifeste) Ports spécifiés dans le fichier manifeste. Autorisez le trafic entrant vers l'équilibreur de charge OCI.
Sortant Groupe de sécurité réseau back-end (si l'OCID d'un groupe de sécurité réseau back-end est indiqué dans le fichier manifeste) ALL/(ports pour le service) Autoriser le trafic vers les noeuds de processus actif.
Sortant Groupe de sécurité réseau back-end (si l'OCID d'un groupe de sécurité réseau back-end est indiqué dans le fichier manifeste) Port de la vérification de l'état TCP/ (10256)

Si l'adresse IP source est conservée, le port de vérification de l'état est automatiquement sélectionné par le service.

Autorisez l'équilibreur de charge OCI ou l'équilibreur de charge réseau à communiquer avec kube-proxy sur les noeuds de processus actif pour le port de vérification de l'état.

Si vous voulez que oci-cloud-controller-manager gère les règles de sécurité pour le trafic entrant vers les noeuds de processus actif de l'ensemble de back-ends, ainsi que le trafic sortant de l'équilibreur de charge ou du service d'équilibreur de charge réseau, vous devez indiquer l'OCID d'un groupe de sécurité réseau existant à utiliser à cette fin. Ce groupe de sécurité réseau est appelé groupe de sécurité réseau back-end. oci-cloud-controller-manager ajoute uniquement des règles sortantes au groupe de sécurité réseau frontal si vous spécifiez un groupe de sécurité réseau back-end. Pour indiquer le groupe de sécurité réseau à utiliser en tant que groupe de sécurité réseau back-end, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci.oraclecloud.com/oci-backend-network-security-group: "<nsg-ocid>"

où <NSG-OCID> est l'OCID d'un groupe de sécurité réseau existant qui se trouve à la fois dans le même VCN que le cluster, ainsi qu'un groupe de sécurité réseau auquel les instances de calcul hébergeant les noeuds de processus actif ont déjà été ajoutées. Par exemple :

oci.oraclecloud.com/oci-backend-network-security-group: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....cwex"

Vous pouvez indiquer les OCID de plusieurs groupes de sécurité réseau back-end dans une liste délimitée par des virgules. Par exemple :

oci.oraclecloud.com/oci-backend-network-security-group: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....cwex,ocid1.networksecuritygroup.oc1.phx.aaaaaa....jfle,ocid1.networksecuritygroup.oc1.phx.aaaaaa....pkrj"

Les instances de calcul hébergeant les noeuds de processus actif dans l'ensemble de back-ends doivent déjà avoir été ajoutées au groupe de sécurité réseau back-end que vous indiquez en tant que valeur de l'annotation oci.oraclecloud.com/oci-backend-network-security-group. Vous pouvez ajouter les instances de calcul au groupe de sécurité réseau back-end de l'une des manières suivantes :

  • En spécifiant le groupe de sécurité réseau lors de la création d'un pool de noeuds (dans le cas de noeuds gérés et de noeuds virtuels).
  • En ajoutant manuellement les cartes d'interface réseau virtuelles principales des instances de calcul hébergeant les noeuds de processus actif au groupe de sécurité réseau à l'aide du service Compute (dans le cas des noeuds gérés). Par exemple, à l'aide des pages de la console du service Compute (ou de l'interface de ligne de commande ou de l'API du service Compute).

oci-cloud-controller-manager crée les règles de sécurité suivantes dans le groupe de sécurité réseau back-end :

Direction Source Protocole/Port de destination Description
Entrant OCID de groupe de sécurité réseau frontal Port de la vérification de l'état TCP/ (10256)

Si l'adresse IP source est conservée, le port de vérification de l'état est automatiquement sélectionné par le service.

Autorisez l'équilibreur de charge OCI ou l'équilibreur de charge réseau à communiquer avec kube-proxy sur les noeuds de processus actif pour les vérifications de l'état.
Entrant OCID de groupe de sécurité réseau frontal ALL/(ports pour le service) Autorisez l'équilibreur de charge OCI ou l'équilibreur de charge réseau à communiquer avec les noeuds de processus actif.

Si vous n'indiquez pas d'OCID pour le groupe de sécurité réseau back-end, oci-cloud-controller-manager ne gère ni les règles de sécurité pour le trafic entrant vers les noeuds de processus actif de l'ensemble de back-ends, ni les règles de sécurité pour le trafic sortant de l'équilibreur de charge ou de l'équilibreur de charge réseau.

Vous pouvez également définir l'annotation oci.oraclecloud.com/security-rule-management-mode sur d'autres valeurs pour indiquer que vous voulez gérer vous-même les règles de sécurité, ou que vous voulez que oci-cloud-controller-manager gère les règles de sécurité dans les listes de sécurité. La syntaxe complète de l'annotation est la suivante :

oci.oraclecloud.com/security-rule-management-mode: <value>

<value> prend l'une des valeurs suivantes :

  • "NSG" : (recommandé) oci-cloud-controller-manager gère toutes les règles de sécurité requises pour l'entrée vers l'équilibreur de charge ou le service d'équilibreur de charge réseau, dans un groupe de sécurité réseau qu'il crée à cette fin.
  • "None" : (valeur par défaut pour les équilibreurs de charge réseau) aucune gestion de liste de sécurité n'est activée et oci-cloud-controller-manager ne gère pas les règles de sécurité. Il est de votre responsabilité de configurer une règle de sécurité qui autorise le trafic entrant vers les ports appropriés pour les plages de ports de noeud, le port d'état du proxy Kube et les plages de ports de vérification de l'état. En outre, vous devez configurer des règles de sécurité pour autoriser le trafic entrant vers les équilibreurs de charge et les équilibreurs de charge réseau (reportez-vous à Règles de sécurité pour les équilibreurs de charge et les équilibreurs de charge réseau). Cela équivaut à définir service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode ou oci-network-load-balancer.oraclecloud.com/security-list-management-mode sur "None".
  • "SL-All" : (valeur par défaut pour les équilibreurs de charge) oci-cloud-controller-manager gère toutes les règles de sécurité requises pour l'entrée et la sortie vers et depuis l'équilibreur de charge ou le service d'équilibreur de charge réseau, dans une liste de sécurité. Cela équivaut à définir service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode ou oci-network-load-balancer.oraclecloud.com/security-list-management-mode sur "All".
  • "SL-Frontend" : oci-cloud-controller-manager gère uniquement les règles de sécurité pour l'entrée vers les services d'équilibreur de charge et d'équilibreur de charge réseau, dans une liste de sécurité. Il est de votre responsabilité de configurer une règle de sécurité qui autorise le trafic entrant vers les ports appropriés pour les plages de ports de noeud, le port d'état du proxy Kube et les plages de ports de vérification de l'état. Cela équivaut à définir service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode ou oci-network-load-balancer.oraclecloud.com/security-list-management-mode sur "Frontend".

Dans les clusters avec des noeuds gérés, si vous n'indiquez pas explicitement de mode de gestion ou si vous indiquez une valeur non valide, oci-cloud-controller-manager gère toutes les règles de sécurité requises pour l'entrée et la sortie vers et depuis l'équilibreur de charge ou le service d'équilibreur de charge réseau, dans une liste de sécurité (équivalent à "SL-All"). Sachez que dans ce cas, oci-cloud-controller-manager crée une règle de sécurité qui autorise le trafic entrant de 0.0.0.0/0 (ou des plages de ports source indiquées dans le fichier manifeste) vers les ports de processus d'écoute. Dans les clusters avec noeuds virtuels, la gestion des listes de sécurité n'est jamais activée et vous devez toujours configurer manuellement les règles de sécurité (équivalent à "None").

Tenez compte des éléments suivants :

  • Si vous incluez à la fois l'annotation oci.oraclecloud.com/security-rule-management-mode et l'une des annotations service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode ou oci-network-load-balancer.oraclecloud.com/security-list-management-mode dans le manifeste, oci-cloud-controller-manager utilise toujours oci.oraclecloud.com/security-rule-management-mode et ignore l'autre annotation.
  • Le nombre de règles entrantes et sortantes autorisées dans les listes de sécurité et les groupes de sécurité réseau est limité (reportez-vous respectivement à Limites de liste de sécurité et à Limites de groupe de sécurité réseau). Si le nombre de règles entrantes ou sortantes dépasse la limite, la création ou la mise à jour de l'équilibreur de charge ou du groupe de sécurité réseau échoue.
  • Un équilibreur de charge ou un équilibreur de charge réseau peut être ajouté à cinq groupes de sécurité réseau au maximum. Si le nombre de groupes de sécurité réseau dépasse la limite, une erreur est renvoyée.
  • Si le service Kubernetes de type LoadBalancer est supprimé, les ressources OCI créées par OCI-cloud-controller-manager (groupe de sécurité réseau frontal et règles de sécurité créées dans le groupe de sécurité réseau frontal ou le groupe de sécurité réseau back-end) sont enlevées. Le groupe de sécurité réseau back-end et les règles de sécurité que le gestionnaire oci-cloud-controller-manager n'a pas créées ne sont pas supprimés.
  • Lors du provisionnement d'un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, vous pouvez utiliser l'annotation is-preserve-source: "true" pour indiquer la conservation de l'adresse IP client dans les en-têtes des paquets IP (valide uniquement lorsque l'annotation externalTrafficPolicy est définie sur "Local"). Dans ce cas, oci-cloud-controller-manager crée des règles de sécurité dans le groupe de sécurité réseau back-end pour autoriser l'accès aux noeuds de processus actif de l'ensemble de back-ends à partir des blocs CIDR indiqués par loadBalancerSourceRanges dans le manifeste de service LoadBalancer. Si les blocs CIDR ne sont pas spécifiés par loadBalancerSourceRanges, oci-cloud-controller-manager crée une règle de sécurité pour autoriser l'accès à partir d'Internet (0.0.0.0/0) sur le numéro de port indiqué par nodePort.
  • Le groupe de sécurité réseau back-end que vous indiquez comme valeur de l'annotation oci.oraclecloud.com/oci-backend-network-security-group doit se trouver dans le même VCN que le cluster.
  • Les instances de calcul hébergeant les noeuds de processus actif dans l'ensemble de back-ends doivent déjà avoir été ajoutées au groupe de sécurité réseau back-end que vous indiquez en tant que valeur de l'annotation oci.oraclecloud.com/oci-backend-network-security-group.

Exemples d'annotations liées à la gestion des règles de sécurité

Exemple 1 : créer un groupe de sécurité réseau frontal avec des règles de sécurité gérées et disposer de règles de sécurité gérées dans un groupe de sécurité réseau back-end existant

Dans cet exemple :

  • Vous voulez que le gestionnaire oci-cloud-controller-manager crée un groupe de sécurité réseau frontal pour un équilibreur de charge et gère les règles de sécurité dans ce groupe.
  • Vous voulez que le gestionnaire oci-cloud-controller-manager utilise un groupe de sécurité réseau back-end existant et gère les règles de sécurité de ce groupe.

Vous indiquez "NSG" en tant que valeur de l'annotation oci.oraclecloud.com/security-rule-management-mode et l'OCID du groupe de sécurité réseau existant en tant que valeur de l'annotation oci.oraclecloud.com/oci-backend-network-security-group :

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    oci.oraclecloud.com/oci-backend-network-security-group: <nsg_ocid> 
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Dans ce cas :

  • oci-cloud-controller-manager crée le groupe de sécurité réseau frontal pour l'équilibreur de charge et gère ses règles de sécurité.
  • oci-cloud-controller-manager gère les règles de sécurité du groupe de sécurité réseau back-end dont l'OCID est indiqué par l'annotation oci-backend-network-security-group.

Tenez compte des éléments suivants :

  • Le groupe de sécurité réseau back-end que vous indiquez comme valeur de l'annotation oci.oraclecloud.com/oci-backend-network-security-group doit se trouver dans le même VCN que le cluster.
  • Les instances de calcul hébergeant les noeuds de processus actif dans l'ensemble de back-ends doivent déjà avoir été ajoutées au groupe de sécurité réseau back-end que vous indiquez en tant que valeur de l'annotation oci.oraclecloud.com/oci-backend-network-security-group.

Exemple 2 : création d'un groupe de sécurité réseau frontal avec des règles de sécurité gérées et gestion manuelle des règles de sécurité dans un groupe de sécurité réseau back-end existant

Dans cet exemple :

  • Vous voulez que le gestionnaire oci-cloud-controller-manager crée un groupe de sécurité réseau frontal pour un équilibreur de charge et gère les règles de sécurité dans ce groupe.
  • Vous voulez définir manuellement des règles de sécurité pour contrôler le trafic entre le front-end de l'équilibreur de charge et le back-end dans un groupe de sécurité réseau que vous créez et gérez. Par exemple, vous pouvez créer des règles de sécurité pour empêcher l'acheminement du trafic de l'équilibreur de charge sur les noeuds de processus actif.

Vous indiquez "NSG" comme valeur de l'annotation oci.oraclecloud.com/security-rule-management-mode :

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Dans ce cas :

  • oci-cloud-controller-manager crée le groupe de sécurité réseau frontal pour l'équilibreur de charge et gère ses règles de sécurité.
  • Vous êtes responsable de la création et de la gestion des règles de sécurité dans un groupe de sécurité réseau back-end afin de contrôler le trafic du groupe de sécurité réseau frontal vers le groupe de sécurité réseau back-end.

Exemple 3 : créer un groupe de sécurité réseau frontal avec des règles de sécurité gérées et disposer de règles de sécurité gérées dans un groupe de sécurité réseau back-end existant (mais les annotations sont utilisées de manière incorrecte)

Dans cet exemple :

  • Vous voulez que le gestionnaire oci-cloud-controller-manager crée un groupe de sécurité réseau frontal pour un équilibreur de charge et gère les règles de sécurité dans ce groupe.
  • Vous voulez que le gestionnaire oci-cloud-controller-manager utilise un groupe de sécurité réseau back-end existant et gère les règles de sécurité de ce groupe. Toutefois, vous ne spécifiez pas correctement les annotations.

Vous indiquez correctement "NSG" comme valeur de l'annotation oci.oraclecloud.com/security-rule-management-mode. Cependant, vous incluez par erreur l'annotation service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode et omettez l'annotation oci.oraclecloud.com/oci-backend-network-security-group :

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "All"
  spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Dans ce cas :

  • oci-cloud-controller-manager crée le groupe de sécurité réseau frontal pour l'équilibreur de charge et gère ses règles de sécurité.
  • L'annotation service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode est ignorée par oci-cloud-controller-manager (car l'annotation oci.oraclecloud.com/security-rule-management-mode est présente).
  • Vous êtes responsable de la création et de la gestion des règles de sécurité dans un groupe de sécurité réseau back-end afin de contrôler le trafic du groupe de sécurité réseau frontal vers le groupe de sécurité réseau back-end (car l'annotation oci.oraclecloud.com/oci-backend-network-security-group n'est pas présente).

Exemple 4 : création d'un groupe de sécurité réseau frontal avec des règles de sécurité gérées, règles de sécurité gérées dans un groupe de sécurité réseau back-end existant et ajout de l'équilibreur de charge à un groupe de sécurité réseau existant

Dans cet exemple :

  • Vous voulez que le gestionnaire oci-cloud-controller-manager crée un groupe de sécurité réseau frontal pour un équilibreur de charge et gère les règles de sécurité dans ce groupe.
  • Vous voulez que le gestionnaire oci-cloud-controller-manager utilise un groupe de sécurité réseau back-end existant et gère les règles de sécurité de ce groupe.
  • Vous voulez que le gestionnaire oci-cloud-controller-manager ajoute l'équilibreur de charge à un groupe de sécurité réseau existant doté de règles de sécurité que vous gérez.

Vous spécifiez :

  • "NSG" en tant que valeur de l'annotation oci.oraclecloud.com/security-rule-management-mode.
  • OCID du groupe de sécurité réseau existant que vous voulez que le gestionnaire oci-cloud-controller-manager utilise en tant que valeur de l'annotation oci.oraclecloud.com/oci-backend-network-security-group.
  • OCID du groupe de sécurité réseau existant auquel vous voulez que le gestionnaire oci-cloud-controller-manager ajoute l'équilibreur de charge.

Le manifeste est le suivant :

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    oci.oraclecloud.com/oci-backend-network-security-group: <nsg_ocid>
    oci.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"
  spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Dans ce cas :

  • oci-cloud-controller-manager crée le groupe de sécurité réseau frontal pour l'équilibreur de charge et gère ses règles de sécurité.
  • oci-cloud-controller-manager gère les règles de sécurité du groupe de sécurité réseau back-end dont l'OCID est indiqué par l'annotation oci.oraclecloud.com/oci-backend-network-security-group.
  • oci-cloud-controller-manager ajoute l'équilibreur de charge au groupe de sécurité réseau indiqué par l'annotation oci.oraclecloud.com/oci-network-security-groups.

Spécification des paramètres de contrôle d'intégrité

Les équilibreurs de charge et les équilibreurs de charge réseau Oracle Cloud Infrastructure appliquent une stratégie de vérification de l'état pour surveiller en permanence les serveurs back-end. La vérification de l'état est un test permettant de confirmer la disponibilité du serveur back-end. Il peut s'agir d'une demande ou d'une tentative de connexion. Si un serveur échoue au test de vérification de l'état, l'équilibreur de charge ou l'équilibreur de charge réseau le met temporairement hors service. Si le serveur le réussit par la suite, l'équilibreur de charge ou l'équilibreur de charge réseau le remet en service.

Les stratégies de vérification de l'état incluent un certain nombre de paramètres, chacun ayant une valeur par défaut. Lorsque le moteur Kubernetes provisionne un équilibreur de charge OCI ou un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, vous pouvez remplacer les valeurs par défaut des paramètres de vérification de l'état en incluant des annotations dans la section des métadonnées du fichier manifeste. Vous pouvez ensuite ajouter, modifier et supprimer des annotations. Si vous supprimez une annotation indiquant une valeur pour un paramètre de vérification de l'état, l'équilibreur de charge ou l'équilibreur de charge réseau utilise à la place la valeur par défaut du paramètre.

Configurer les paramètres de vérification de l'état pour les équilibreurs de charge

Afin de configurer les paramètres de vérification de l'état lorsque Kubernetes Engine provisionne un équilibreur de charge pour un service Kubernetes de type LoadBalancer, ajoutez les annotations suivantes dans la section des métadonnées du fichier manifeste :

  • Pour indiquer le nombre de tentatives de demande de vérification de l'état infructueuses à effectuer avant qu'un serveur back-end ne soit considéré comme en mauvais état, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

    service.beta.kubernetes.io/oci-load-balancer-health-check-retries: "<value>"

    <value> correspond au nombre de demandes de vérification de l'état ayant échoué.

  • Pour indiquer l'intervalle entre les demandes de vérification de l'état, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

    service.beta.kubernetes.io/oci-load-balancer-health-check-interval: "<value>"

    <value> est une valeur numérique en millisecondes. La valeur minimale est 1 000.

  • Pour indiquer la durée maximale pendant laquelle attendre une réponse à une demande de vérification de l'état, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

    service.beta.kubernetes.io/oci-load-balancer-health-check-timeout: "<value>"

    <value> est une valeur numérique en millisecondes. Une vérification de l'état ne réussit que si l'équilibreur de charge reçoit une réponse avant expiration de la durée définie.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    service.beta.kubernetes.io/oci-load-balancer-health-check-retries: "5"
    service.beta.kubernetes.io/oci-load-balancer-health-check-interval: "15000"
    service.beta.kubernetes.io/oci-load-balancer-health-check-timeout: "4000"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
Configurer les paramètres de vérification de l'état pour les équilibreurs de charge réseau

Afin de configurer les paramètres de vérification de l'état lorsque Kubernetes Engine provisionne un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, ajoutez les annotations suivantes dans la section des métadonnées du fichier manifeste :

  • Pour indiquer le nombre de tentatives de demande de vérification de l'état infructueuses à effectuer avant qu'un serveur back-end ne soit considéré comme en mauvais état, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

    oci-network-load-balancer.oraclecloud.com/health-check-retries: "<value>"

    <value> correspond au nombre de demandes de vérification de l'état ayant échoué.

  • Pour indiquer l'intervalle entre les demandes de vérification de l'état, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

    oci-network-load-balancer.oraclecloud.com/health-check-interval: "<value>"

    <value> est une valeur numérique en millisecondes. La valeur minimale est 1 000.

  • Pour indiquer la durée maximale pendant laquelle attendre une réponse à une demande de vérification de l'état, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

    oci-network-load-balancer.oraclecloud.com/health-check-timeout: "<value>"

    <value> est une valeur numérique en millisecondes. Une vérification de l'état ne réussit que si l'équilibreur de charge réseau reçoit une réponse avant expiration du délai imparti.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/health-check-retries: "5"
    oci-network-load-balancer.oraclecloud.com/health-check-interval: "15000"
    oci-network-load-balancer.oraclecloud.com/health-check-timeout: "4000"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Si vous n'indiquez pas explicitement les valeurs de paramètre de vérification de l'état en incluant des annotations dans la section des métadonnées du fichier manifeste, les valeurs par défaut suivantes sont utilisées :

Annotation d'équilibreur de charge Annotation d'équilibreur de charge réseau

Valeur par défaut utilisée

service.beta.kubernetes.io/oci-load-balancer-health-check-retries oci-network-load-balancer.oraclecloud.com/health-check-retries "3"
service.beta.kubernetes.io/oci-load-balancer-health-check-interval oci-network-load-balancer.oraclecloud.com/health-check-interval "10 000"
service.beta.kubernetes.io/oci-load-balancer-health-check-timeout oci-network-load-balancer.oraclecloud.com/health-check-timeout "3 000"

Pour plus d'informations sur les stratégies de vérification de l'état de l'équilibreur de charge réseau et de l'équilibreur de charge Oracle Cloud Infrastructure, reportez-vous aux sections suivantes :

Sélection des noeuds de processus actif à inclure dans les ensembles de back-ends

Le trafic entrant vers un équilibreur de charge Oracle Cloud Infrastructure ou un équilibreur de charge réseau est distribué entre les serveurs back-end d'un ensemble de back-ends. Par défaut, lorsque Kubernetes Engine provisionne un équilibreur de charge Oracle Cloud Infrastructure ou un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, tous les noeuds de processus actif du cluster sont inclus dans l'ensemble de back-ends.

Cependant, vous pouvez sélectionner uniquement un sous-ensemble de noeuds de processus actif dans un cluster à inclure dans l'ensemble de back-ends d'un équilibreur de charge ou d'un équilibreur de charge réseau donné. L'inclusion de sous-ensembles de noeuds de processus actif d'un cluster dans les ensembles de back-ends de différents équilibreurs de charge et équilibreurs de charge réseau vous permet de présenter un seul cluster Kubernetes sous la forme de plusieurs clusters logiques (services).

Sélectionner les noeuds de processus actif à inclure dans l'ensemble de back-ends de l'équilibreur de charge

Afin de sélectionner les noeuds de processus actif à inclure dans l'ensemble de back-ends lorsque Kubernetes Engine provisionne un équilibreur de charge pour un service Kubernetes de type LoadBalancer, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci.oraclecloud.com/node-label-selector: <label>

<label> est une ou plusieurs clés et valeurs de libellé, identifiées à l'aide de la notation de sélecteur de libellé Kubernetes standard. Par exemple, lbset=set1

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    oci.oraclecloud.com/node-label-selector: lbset=set1
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Sélectionner les noeuds de processus actif à inclure dans l'ensemble de back-ends d'équilibreur de charge réseau

Afin de sélectionner les noeuds de processus actif à inclure dans l'ensemble de back-ends lorsque Kubernetes Engine provisionne un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/node-label-selector: <label>

<label> est une ou plusieurs clés et valeurs de libellé, identifiées à l'aide de la notation de sélecteur de libellé Kubernetes standard. Par exemple, lbset=set1

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset=set1
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Utilisez la notation de sélecteur de libellé Kubernetes standard pour spécifier les clés et valeurs de libellé dans les annotations de la section de métadonnées du fichier manifeste. Pour plus d'informations sur la notation de sélecteur de libellé Kubernetes standard, reportez-vous à Sélecteurs de libellé dans la documentation Kubernetes.

Le tableau donne quelques exemples de notation de sélecteur d'étiquette Kubernetes standard.

Annotation d'équilibreur de charge Annotation d'équilibreur de charge réseau

Inclure dans l'ensemble de back-ends :

oci.oraclecloud.com/node-label-selector: lbset=set1 oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset=set1

Tous les noeuds de processus actif avec la clé de libellé lbset ayant la valeur set1

oci.oraclecloud.com/node-label-selector: lbset in (set1, set3) oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset in (set1, set3)

Tous les noeuds de processus actif avec la clé de libellé lbset ayant la valeur set1 ou set3

oci.oraclecloud.com/node-label-selector: lbset oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset Tous les noeuds de processus actif avec la clé de libellé lbset, quelle que soit sa valeur.
oci.oraclecloud.com/node-label-selector: env=prod,lbset in (set1, set3) oci-network-load-balancer.oraclecloud.com/node-label-selector: env=prod,lbset in (set1, set3)

Tous les noeuds de processus actif avec la clé de libellé env ayant la valeur prod et la clé de libellé lbset ayant la valeur set1 ou la valeur set3

oci.oraclecloud.com/node-label-selector: env!=test oci-network-load-balancer.oraclecloud.com/node-label-selector: env!=test

Tous les noeuds de processus actif avec la clé de libellé env qui n'ont pas la valeur test

Spécification de stratégies d'ensemble de back-ends

Lorsque le moteur Kubernetes provisionne un équilibreur de charge ou un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, vous pouvez définir une stratégie pour l'ensemble de back-ends afin d'indiquer comment distribuer le trafic entrant vers les serveurs back-end.

Informations supplémentaires :

Spécification d'une stratégie d'ensemble de back-ends pour un équilibreur de charge

Afin d'indiquer une stratégie pour l'ensemble de back-ends lorsque Kubernetes Engine provisionne un équilibreur de charge pour un service Kubernetes de type LoadBalancer, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci.oraclecloud.com/loadbalancer-policy: <value>

<value> prend l'une des valeurs suivantes :

  • "ROUND_ROBIN" : achemine le trafic entrant de manière séquentielle vers chaque serveur dans la liste des ensembles de back-ends.
  • "LEAST_CONNECTIONS" : achemine le trafic de demande entrant non persistant vers le serveur back-end avec le moins de connexions actives possible.
  • "IP_HASH" : achemine le trafic de demande non persistante entrant du même client vers le même serveur back-end tant que ce serveur est disponible, en utilisant l'adresse IP source de la demande entrante en tant que clé de hachage.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    oci.oraclecloud.com/loadbalancer-policy: "LEAST_CONNECTIONS"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Si vous n'indiquez pas explicitement de stratégie pour l'ensemble de back-ends, "ROUND_ROBIN" est utilisé comme valeur par défaut.

Spécification d'une stratégie d'ensemble de back-ends pour un équilibreur de charge réseau

Afin d'indiquer une stratégie pour l'ensemble de back-ends lorsque Kubernetes Engine provisionne un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/backend-policy: <value>

<value> prend l'une des valeurs suivantes :

  • "TWO_TUPLE" : achemine le trafic entrant en fonction du hachage à 2 tuples (adresse IP source, adresse IP de destination).
  • "THREE_TUPLE" : achemine le trafic entrant en fonction d'un hachage à 3 tuples (adresse IP source, adresse IP de destination, protocole).
  • "FIVE_TUPLE" : achemine le trafic entrant en fonction d'un hachage à 5 tuples (port et adresse IP source, port et adresse IP de destination, protocole).

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/backend-policy: "THREE_TUPLE"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Si vous n'indiquez pas explicitement de stratégie pour l'ensemble de back-ends, "FIVE_TUPLE" est utilisé comme valeur par défaut.

Spécification des points de contrôle de préparation des pods

Remarque

Vous pouvez indiquer des points de contrôle de préparation des pods pour les clusters avec des noeuds virtuels, mais pas pour les clusters avec des noeuds gérés.

Lorsque le moteur Kubernetes provisionne un équilibreur de charge Oracle Cloud Infrastructure ou un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, vous pouvez utiliser un point de contrôle de préparation de pod pour vous assurer que le trafic est acheminé uniquement vers les pods qui ont été ajoutés à l'ensemble de back-ends et qui sont prêts à recevoir le trafic. Vous pouvez indiquer des portes de préparation de pod pour les pods exécutés sur des noeuds virtuels, mais pas pour les pods exécutés sur des noeuds gérés. Ne définissez pas de portes de préparation de pod pour les pods exécutés sur des noeuds gérés.

Les portes de préparation de pod sont des conditions supplémentaires pour indiquer qu'un pod est prêt à recevoir du trafic. Les jalons de préparation des pods vous permettent d'implémenter des contrôles de préparation personnalisés complexes et peuvent vous aider à éviter tout temps d'inactivité lors des déploiements non simultanés. Pour plus d'informations, reportez-vous aux détails relatifs à la préparation des pods dans la documentation Kubernetes.

Lors du provisionnement d'un équilibreur de charge ou d'un équilibreur de charge réseau, l'ensemble de back-ends comprend les adresses IP des répliques de pod d'un déploiement dont la condition est Ready. La mise à jour du déploiement (par exemple, pour utiliser une nouvelle image) déclenche le remplacement des répliques de pod existantes par de nouvelles répliques de pod. Toutefois, le remplacement de toutes les répliques de pod peut prendre un certain temps et entraîner l'indisponibilité du back-end pour les raisons suivantes :

  • Vous pouvez mettre fin aux répliques de pod existantes avant que l'ensemble de back-ends n'ait été mis à jour avec les adresses IP des nouvelles répliques de pod.
  • L'ensemble de back-ends peut être mis à jour avec les adresses IP des nouvelles répliques de pod avant que les nouvelles répliques de pod ne soient prêtes à recevoir le trafic.

La spécification de l'utilisation d'une porte de préparation de pod garantit que les back-ends sont toujours disponibles pour l'équilibreur de charge ou l'équilibreur de charge réseau. Les pods existants ne sont pas arrêtés tant que de nouveaux pods n'ont pas été ajoutés à l'ensemble de back-ends et que les nouveaux pods ne sont pas prêts à recevoir du trafic.

Pour indiquer que le moteur Kubernetes doit injecter un point de contrôle de préparation de pod dans la spécification de pod de chaque pod créé dans un espace de noms particulier, ajoutez le libellé loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled à l'espace de noms en saisissant ce qui suit :

kubectl label ns <namespace> loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled

L'exemple suivant montre comment créer un équilibreur de charge avec une porte de préparation de pod.

Commencez par étiqueter l'espace de noms pdr afin d'indiquer la porte de préparation du pod pour l'espace de noms, en saisissant ce qui suit :

kubectl label ns pdr loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled

La sortie de la commande confirme que l'espace de noms a été étiqueté :

namespace/pdr labeled

Ensuite, déployez Nginx dans l'espace de noms pdr en saisissant ce qui suit :

kubectl apply -f https://raw.githubusercontent.com/oracle-devrel/oci-oke-virtual-nodes/main/nginx-svc/nginx.yaml -n pdr

Répertoriez les pods dans l'espace de noms pdr en saisissant ce qui suit :

kubectl get pods -n pdr

Vous pouvez maintenant démontrer l'utilisation de la porte de préparation du pod en mettant à jour la version de l'image dans le manifeste Nginx et en réappliquant le manifeste, de sorte que les pods existants soient remplacés par de nouveaux pods.

Téléchargez le manifeste Nginx à partir de https://raw.githubusercontent.com/oracle-devrel/oci-oke-virtual-nodes/main/nginx-svc/nginx.yaml et remplacez la version de l'image par nginx:1.25.1, comme indiqué :
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.1
...

Appliquez à nouveau le manifeste en saisissant ce qui suit :

kubectl apply -f ./nginx.yaml -n pdr

Observez les nouveaux pods déployés en saisissant ce qui suit :

kubectl get pods -o wide -n pdr

Par exemple :

NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
nginx-678976847c-8bqs7   1/1     Running   0          44m   10.0.10.153   10.0.10.253   <none>           1/1
nginx-678976847c-ttqms   1/1     Running   0          47m   10.0.10.201   10.0.10.253   <none>           1/1

Observez le statut de l'un des nouveaux pods en saisissant ce qui suit :

kubectl describe pod <pod-name> -n pdr

Par exemple :

kubectl describe pod nginx-678976847c-ttqms  -n pdr

La sortie de la commande confirme le statut du point de contrôle de préparation podreadiness.loadbalancer.oraclecloud.com. Par exemple :

...
Readiness Gates:
  Type                                                             Status
  podreadiness.loadbalancer.oraclecloud.com/f913fe603a9be9b5d51f   True 
Conditions:
  Type                                                             Status
  podreadiness.loadbalancer.oraclecloud.com/f913fe603a9be9b5d51f   True 
  PodScheduled                                                     True 
  Initialized                                                      True 
  Ready                                                            True 
  ContainersReady                                                  True 

Spécification de IPMode pour ajuster le routage du trafic

Lorsque le moteur Kubernetes provisionne un équilibreur de charge Oracle Cloud Infrastructure ou un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, vous pouvez indiquer comment acheminer le trafic provenant d'un cluster vers l'adresse IP de l'équilibreur de charge ou de l'équilibreur de charge réseau.

Dans les clusters exécutant Kubernetes version 1.30 ou ultérieure, le point de contrôle de fonctionnalité Kubernetes LoadBalancerIPMode est activé et le champ ipMode d'un service de type LoadBalancer a la valeur par défaut "VIP". Lorsque ipMode a la valeur "VIP", le trafic envoyé à l'adresse IP d'un service de type LoadBalancer à partir d'un pod du cluster est acheminé directement vers les pods d'application pour optimiser les performances, en contournant le service LoadBalancer. Pour plus d'informations, reportez-vous à Spécification du statut IPMode de l'équilibreur de charge dans la documentation Kubernetes.

Toutefois, dans certains cas, vous pouvez décider que le routage du trafic vers les pods d'application n'est pas approprié. Par exemple, si le trafic provenant d'un cluster est acheminé directement vers les pods d'application, vous ne pouvez pas implémenter la terminaison SSL au niveau de l'équilibreur de charge.

Pour indiquer comment acheminer le trafic envoyé à l'adresse IP de l'équilibreur de charge ou de l'équilibreur de charge réseau à partir du cluster, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci.oraclecloud.com/ingress-ip-mode: <value>

<value> prend l'une des valeurs suivantes :

  • "VIP" : tout le trafic provenant du cluster et envoyé à l'adresse IP d'un service de type LoadBalancer est acheminé directement vers les pods d'application pour optimiser les performances, en contournant le service LoadBalancer.
  • "proxy" : tout le trafic provenant du cluster et envoyé à l'adresse IP d'un service de type LoadBalancer est acheminé vers l'équilibreur de charge Oracle Cloud Infrastructure ou l'équilibreur de charge réseau provisionné pour le service LoadBalancer. L'équilibreur de charge ou l'équilibreur de charge réseau transmet ensuite le trafic aux pods d'application.

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    oci.oraclecloud.com/ingress-ip-mode: "proxy"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Si vous n'indiquez pas l'annotation oci.oraclecloud.com/ingress-ip-mode ou que vous n'enlevez pas l'annotation, la propriété ipMode d'un service de type LoadBalancer a la valeur par défaut "VIP".

En outre, lorsque vous utilisez un équilibreur de charge réseau privé avec l'annotation oci-network-load-balancer.oraclecloud.com/is-preserve-source définie sur true, l'équilibreur de charge réseau présente une limitation connue qui n'autorise pas le trafic lorsque le noeud source et le noeud back-end de destination sont identiques. Cette limitation empêche la communication entre les pods sur le même noeud via l'équilibreur de charge réseau lorsque les conditions suivantes sont toutes remplies :

  • L'annotation oci.oraclecloud.com/ingress-ip-mode est définie sur proxy.
  • L'annotation oci-network-load-balancer.oraclecloud.com/is-preserve-source est définie sur true.
  • L'équilibreur de charge réseau est privé.

Spécification des familles d'adresses IP pour les équilibreurs de charge et les équilibreurs de charge réseau

Lorsque le moteur Kubernetes provisionne un équilibreur de charge Oracle Cloud Infrastructure ou un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, le sous-réseau de l'équilibreur de charge détermine le contrôle dont vous disposez sur la famille d'adresses IP de l'adresse IP sur laquelle l'équilibreur de charge ou l'équilibreur de charge réseau reçoit le trafic.

  • Si le sous-réseau est un sous-réseau à pile unique IPv4, le sous-réseau est configuré pour l'adressage IPv4 uniquement. Une adresse IPv4 est uniquement allouée à l'équilibreur de charge ou à l'équilibreur de charge réseau pour recevoir le trafic externe. Vous ne pouvez pas modifier la famille d'adresses IP de l'adresse IP sur laquelle l'équilibreur de charge ou l'équilibreur de charge réseau reçoit le trafic externe.
  • Si le sous-réseau est un sous-réseau à double pile IPv4/IPv6, le sous-réseau est configuré pour l'adressage IPv4 et IPv6. L'équilibreur de charge ou l'équilibreur de charge réseau peut être alloué à une adresse IPv4 ou à la fois à une adresse IPv6 sur laquelle recevoir le trafic externe. Dans ce cas, vous pouvez utiliser les champs spec.ipFamilyPolicy et spec.ipFamilies de Kubernetes dans le manifeste de service pour indiquer si l'équilibreur de charge ou l'équilibreur de charge réseau reçoit le trafic externe sur l'adresse IPv4 uniquement, ou sur l'adresse IPv6 uniquement, ou sur l'adresse IPv4 et l'adresse IPv6.

La famille d'adresses IP utilisée pour le trafic entre le processus d'écoute et l'ensemble de back-ends est déterminée différemment pour les équilibreurs de charge et les équilibreurs de charge réseau :

  • Equilibreurs de charge : le trafic entre un processus d'écoute d'équilibreur de charge et l'ensemble de back-ends utilise toujours des adresses IPv4.
  • Equilibreurs de charge réseau : le trafic entre un processus d'écoute d'équilibreur de charge réseau et l'ensemble de back-ends utilise la même famille d'adresses IP que l'adresse IP sur laquelle le processus d'écoute d'équilibreur de charge réseau reçoit le trafic externe.

Le tableau présente l'interaction entre la famille d'adresses IP du sous-réseau de l'équilibreur de charge, les paramètres de spec.ipFamilyPolicy et spec.ipFamilies, la famille d'adresses IP à partir de laquelle les adresses IP sont allouées à l'équilibreur de charge ou à l'équilibreur de charge réseau, ainsi que le protocole IP entre le processus d'écoute et l'ensemble de back-ends. Notez que seules les combinaisons valides sont affichées.

Famille d'adresses IP de sous-réseau ipFamilyPolicy est défini sur : ipFamilies est défini sur : Famille d'adresses IP de l'adresse d'équilibreur de charge réseau Famille d'adresses IP de l'équilibreur de charge Processus d'écoute d'équilibreur de charge réseau vers le trafic d'ensemble de back-ends Trafic du processus d'écoute d'équilibreur de charge vers l'ensemble de back-ends
IPv4 SingleStack IPv4 IPv4 IPv4 IPv4 IPv4
IPv4/IPv6 SingleStack IPv4 IPv4 IPv4 IPv4 IPv4
IPv4/IPv6 SingleStack IPv6 IPv6 non pris en charge IPv6 non pris en charge
IPv4 PreferDualStack IPv4 IPv4 IPv4 IPv4 IPv4
IPv4 PreferDualStack IPv6 IPv4 IPv4 IPv4 IPv4
IPv4 PreferDualStack IPv4,IPv6 IPv4 IPv4 IPv4 IPv4
IPv4 PreferDualStack IPv6,IPv4 IPv4 IPv4 IPv4 IPv4
IPv4/IPv6 PreferDualStack IPv4 IPv4(principal) et IPv6 IPv4(principal) et IPv6 IPv4(principal) et IPv6 IPv4
IPv4/IPv6 PreferDualStack IPv6 IPv6(principal) et IPv4 IPv6(principal) et IPv4 IPv6(principal) et IPv4 IPv4
IPv4/IPv6 PreferDualStack IPv4,IPv6 IPv4(principal) et IPv6 IPv4(principal) et IPv6 IPv4(principal) et IPv6 IPv4
IPv4/IPv6 PreferDualStack IPv6,IPv4 IPv6(principal) et IPv4 IPv6(principal) et IPv4 IPv6(principal) et IPv4 IPv4
IPv4/IPv6 RequireDualStack IPv4,IPv6 IPv4(principal) et IPv6 IPv4(principal) et IPv6 IPv4(principal) et IPv6 IPv4
IPv4/IPv6 RequireDualStack IPv6,IPv4 IPv6(principal) et IPv4 IPv6(principal) et IPv4 IPv6(principal) et IPv4 IPv4

Si vous utilisez l'annotation service.beta.kubernetes.io/oci-load-balancer-subnet1 pour indiquer un sous-réseau alternatif au sous-réseau indiqué pour les équilibreurs de charge lors de la création du cluster, assurez-vous que la famille d'adresses du sous-réseau alternatif est compatible avec les champs spec.ipFamilyPolicy et spec.ipFamilies dans le manifeste de service.

Pour plus d'informations sur la prise en charge de IPv4 et de IPv6 dans Kubernetes, reportez-vous à IPv4/IPv6 double pile dans la documentation Kubernetes.

Exemple 1 :

Dans cet exemple :

  • Vous voulez utiliser le sous-réseau indiqué pour les équilibreurs de charge lors de la création du cluster.
  • Vous ne voulez déployer le service de type LoadBalancer que s'il peut être affecté à la fois à une adresse IPv4 et à une adresse IPv6, de sorte que vous définissez ipFamilyPolicy: RequireDualStack.
  • L'adresse IP principale de l'équilibreur de charge doit être une adresse IPv6 (et son adresse secondaire doit être une adresse IPv4). Vous devez donc définir spec.ipFamilies: IPv6,IPv4.
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb" 
spec:
  type: LoadBalancer
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv6
  - IPv4
  ports:
  - name: http
    port: 80
    targetPort: 80
  selector:
    app: nginx

Dans cet exemple, le sous-réseau d'équilibreur de charge du cluster est un sous-réseau IPv4/IPv6 à double pile, de sorte que le déploiement réussit. Une adresse IPv6 est affectée à l'équilibreur de charge en tant qu'adresse principale et une adresse IPv4 en tant qu'adresse secondaire.

Exemple 2 :

Dans cet exemple :

  • Vous voulez héberger le service de type LoadBalancer sur un autre sous-réseau que celui indiqué pour les équilibreurs de charge lors de la création du cluster. Vous devez donc utiliser l'annotation service.beta.kubernetes.io/oci-load-balancer-subnet1 pour indiquer l'OCID de l'autre sous-réseau.
  • Vous voulez allouer les adresses IPv4 et IPv6 au service de type LoadBalancer si le service est hébergé sur un sous-réseau IPv4/IPv6 double pile. Sinon, si le service est hébergé sur un sous-réseau IPv4 de pile unique, vous voulez qu'une adresse IP soit allouée au service à partir de cette famille d'adresses IP. Vous définissez donc ipFamilyPolicy: PreferDualStack.
  • Vous voulez que l'adresse IP principale de l'équilibreur de charge soit une adresse IPv4 (et que son adresse secondaire soit une adresse IPv6, si elle est prise en charge par le sous-réseau), afin de définir spec.ipFamilies: IPv4,IPv6.
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"  
spec:
  type: LoadBalancer
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
  - IPv4
  - IPv6
  ports:
  - name: http
    port: 80
    targetPort: 80
  selector:
    app: nginx

Dans cet exemple, le sous-réseau alternatif est un sous-réseau IPv4/IPv6 double pile, de sorte que le déploiement réussit. Une adresse IPv4 est affectée à l'équilibreur de charge en tant qu'adresse principale et une adresse IPv6 en tant qu'adresse secondaire.

Affectation d'adresses IPv4 et IPv6 spécifiques aux équilibreurs de charge réseau

Lorsque Kubernetes Engine provisionne un équilibreur de charge réseau Oracle Cloud Infrastructure pour un service Kubernetes de type LoadBalancer, le service d'équilibreur de charge réseau affecte des adresses IP à l'équilibreur de charge réseau.

Le service d'équilibreur de charge réseau affecte une adresse IPv4 privée et, dans le cas d'un équilibreur de charge réseau externe, affecte également une adresse IPv4 publique supplémentaire. Si le sous-réseau de l'équilibreur de charge réseau est compatible, le service Network Load Balancer peut également affecter une adresse IPv6 (reportez-vous à Spécification de familles d'adresses IP pour les équilibreurs de charge et les équilibreurs de charge réseau).

Dans les clusters exécutant Kubernetes version 1.29 ou ultérieure, vous pouvez indiquer l'adresse IP à affecter à l'équilibreur de charge réseau, au lieu que le service d'équilibreur de charge réseau sélectionne l'adresse IP à affecter. L'adresse IP que vous pouvez affecter dépend de la famille d'adresses IP du sous-réseau de l'équilibreur de charge réseau, comme suit :

  • IPv4 : si le sous-réseau de l'équilibreur de charge réseau est un sous-réseau à pile unique IPv4 ou un sous-réseau à pile double IPv4/IPv6, vous pouvez affecter une adresse IPv4 privée à l'équilibreur de charge réseau.
  • IPv4 et IPv6 : si le sous-réseau de l'équilibreur de charge réseau est un sous-réseau à double pile IPv4/IPv6, vous pouvez affecter à l'équilibreur de charge réseau une adresse IPv4 privée et une adresse IPv6 ou les deux.

Pour indiquer une adresse IPv4 privée à affecter à un équilibreur de charge réseau, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/assigned-private-ipv4: "<ipv4-address>"

<ipv4-address> est une adresse IPv4 valide, à partir du bloc CIDRIPv4 CIDR IPv4 indiqué pour le sous-réseau de l'équilibreur de charge réseau. Par exemple :

oci-network-load-balancer.oraclecloud.com/assigned-private-ipv4: "10.0.0.1"

Pour indiquer une adresse IPv6 à affecter à un équilibreur de charge réseau, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "<ipv6-address>"

<ipv6-address> est une adresse ULA ou GUA IPv6 valide, à partir du bloc CIDR IPv6 indiqué pour le sous-réseau de l'équilibreur de charge réseau. Par exemple :

  • oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "fd8a:4b3c:7d91:abcd::1"
  • oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "2607:9b80:9a0a:9a7e:abcd:ef01:2345:6789"

Par exemple :

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/assigned-private-ipv4: "10.0.0.1"
    oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "fd8a:4b3c:7d91:abcd::1"
spec:
  type: LoadBalancer
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv6
  - IPv4
  ports:
  - port: 80
  selector:
    app: nginx

Il est de votre responsabilité de spécifier une adresse IP valide. Pour qu'une adresse IP soit valide, les conditions suivantes doivent être remplies :

  • L'adresse IP doit avoir le format correct pour l'annotation que vous utilisez (IPv4 ou IPv6).
  • L'adresse IP doit provenir du bloc CIDR approprié indiqué pour le sous-réseau de l'équilibreur de charge réseau.
  • L'adresse IP ne doit pas déjà être utilisée par une autre ressource.

Tenez compte des éléments suivants :

  • Si le format de l'adresse IP n'est pas correct ou ne provient pas du bloc CIDR approprié, la demande de création de l'équilibreur de charge réseau n'est pas acceptée.
  • Si le format de l'adresse IP est correct et qu'elle provient du bloc CIDR approprié, mais que l'adresse IP est déjà utilisée par une autre ressource, la demande de création de l'équilibreur de charge réseau est acceptée. Cependant, la demande de travail associée échouera et le compartiment contiendra un équilibreur de charge réseau à l'état Echec.
  • Si l'adresse IP est valide, l'équilibreur de charge réseau est créé avec l'adresse IP indiquée qui lui est affectée.

Masquage de l'adresse IP privée d'un équilibreur de charge réseau

Lorsque le moteur Kubernetes provisionne un équilibreur de charge réseau Oracle Cloud Infrastructure public pour un service Kubernetes de type LoadBalancer, le service d'équilibreur de charge réseau affecte à la fois une adresse IP publique et une adresse IP privée à l'équilibreur de charge réseau. L'adresse IP privée est utilisée pour les vérifications de l'état et la traduction d'adresse de port (PAT), mais ne peut pas recevoir de trafic externe en dehors du VCN (y compris à partir de l'Internet public).

Pour afficher les adresses IP publiques et privées affectées à l'équilibreur de charge réseau par le service d'équilibreur de charge réseau, entrez la commande kubectl get service (ou une commande similaire). Par exemple :

kubectl get service my-nginx-svc -o json | jq .status

{
  "loadBalancer": {
    "ingress": [
      {
        "ip": "203.0.113.2"
      },
      {
        "ip": "10.30.3.24"
      }
    ]
  }
}

Dans certains cas, vous pouvez uniquement afficher l'adresse IP publique de l'équilibreur de charge réseau et masquer l'adresse IP privée. Par exemple :

  • Vous pouvez indiquer un nom DNS convivial pour l'équilibreur de charge réseau lorsque vous utilisez l'extension ExternalDNS, en incluant l'annotation external-dns.alpha.kubernetes.io/hostname dans le manifeste du service Kubernetes de type LoadBalancer. ExternalDNS crée un enregistrement DNS pour l'équilibreur de charge réseau dans le fournisseur DNS externe configuré pour le cluster. L'enregistrement DNS met en correspondance le nom DNS avec l'adresse IP publique et l'adresse IP privée. Par conséquent, si le trafic externe utilise le nom DNS, il est possible que le trafic soit acheminé vers l'adresse IP privée de l'équilibreur de charge réseau, même si l'adresse IP privée ne peut pas recevoir le trafic externe.
  • Vous pouvez configurer une automatisation qui utilise la commande kubectl get service (ou une commande similaire) pour obtenir l'adresse IP de l'équilibreur de charge réseau. Si votre cas d'emploi inclut le routage du trafic externe, vous voulez uniquement l'adresse IP publique de l'équilibreur de charge réseau. Cependant, par défaut, la commande kubectl get service renvoie à la fois l'adresse IP publique de l'équilibreur de charge réseau et son adresse IP privée.

Pour indiquer que la commande kubectl get service (ou une commande similaire) renvoie uniquement l'adresse IP publique de l'équilibreur de charge réseau, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/external-ip-only: "true"

"false" est la valeur par défaut de l'annotation oci-network-load-balancer.oraclecloud.com/external-ip-only. Si vous n'incluez pas explicitement l'annotation dans la définition de service, la commande kubectl get service (ou une commande similaire) renvoie à la fois l'adresse IP publique et l'adresse IP privée de l'équilibreur de charge réseau

Par exemple :


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/external-ip-only: "true"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Si vous incluez l'annotation oci-network-load-balancer.oraclecloud.com/external-ip-only: "true" dans le manifeste, lorsque vous entrez la commande kubectl get service (ou une valeur similaire), seule l'adresse IP publique est renvoyée. Par exemple :

kubectl get service my-nginx-svc -o json | jq .status

{
  "loadBalancer": {
    "ingress": [
      {
        "ip": "203.0.113.2"
      }
    ]
  }
}

Empêcher les noeuds de gérer le trafic

Vous pouvez exclure des noeuds de processus actif spécifiques de la liste des serveurs back-end dans l'ensemble de serveurs d'un équilibreur de charge ou d'un équilibreur de charge réseau Oracle Cloud Infrastructure. Pour plus d'informations, reportez-vous à node.kubernetes.io/exclude-from-external-load-balancers.

Balisage des équilibreurs de charge et des équilibreurs de charge réseau

Vous pouvez ajouter des balises à un équilibreur de charge ou à un équilibreur de charge réseau que Kubernetes Engine provisionne pour un service Kubernetes de type LoadBalancer. Le balisage vous permet de regrouper des ressources disparates entre différents compartiments, ainsi que d'annoter des ressources avec vos propres métadonnées. Reportez-vous à Application de balises aux équilibreurs de charge.

Activation du protocole de proxy

Lorsque le moteur Kubernetes provisionne un équilibreur de charge Oracle Cloud Infrastructure ou un équilibreur de charge réseau pour un service Kubernetes de type LoadBalancer, vous pouvez indiquer si la fonctionnalité de protocole proxy doit être activée avec des processus d'écoute TCP. L'activation du protocole de proxy permet de transférer des informations de connexion de transport, telles que l'adresse IP d'un client, au serveur back-end via plusieurs couches de proxies. Les versions de protocole proxy suivantes sont disponibles :

  • La version 1, qui utilise un en-tête textuel pour transmettre des informations via les proxies, est préférable pour les implémentations de petite taille.
  • Version 2, qui utilise un en-tête textuel et binaire pour une plus grande efficacité de production et d'analyse, et est préférable pour les implémentations plus importantes.

Les équilibreurs de charge provisionnés par le moteur Kubernetes prennent en charge les versions 1 et 2 du protocole proxy. Les équilibreurs de charge réseau provisionnés par le moteur Kubernetes prennent en charge le protocole proxy version 2.

Informations supplémentaires :

Activation du protocole proxy pour les équilibreurs de charge

Afin d'activer le protocole proxy pour les équilibreurs de charge provisionnés par Kubernetes Engine, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

service.beta.kubernetes.io/oci-load-balancer-connection-proxy-protocol-version: "<value>"

"<value>" prend l'une des valeurs suivantes :

  • "1" permet d'indiquer que vous voulez activer le protocole proxy version 1 sur tous les processus d'écoute de l'équilibreur de charge.
  • "2" permet d'indiquer que vous voulez activer le protocole proxy version 2 sur tous les processus d'écoute de l'équilibreur de charge.

Après avoir activé la fonctionnalité de protocole proxy pour les équilibreurs de charge, tenez compte des points suivants :

  • Vous ne pouvez pas désactiver la fonctionnalité de protocole proxy sur les processus d'écoute d'équilibreur de charge.
  • Vous pouvez basculer entre la version 1 et la version 2 du protocole de proxy en mettant à jour l'annotation.
  • Si vous enlevez ensuite l'annotation du manifeste ou annulez sa définition (en définissant "<value>" sur ""), le dernier paramètre appliqué avec succès pour "<value>" est conservé sur tous les processus d'écoute.
Activation et désactivation du protocole proxy pour les équilibreurs de charge réseau

Afin d'activer le protocole proxy pour les équilibreurs de charge réseau provisionnés par Kubernetes Engine, ajoutez l'annotation suivante dans la section des métadonnées du fichier manifeste :

oci-network-load-balancer.oraclecloud.com/is-ppv2-enabled: "<value>"

"<value>" prend l'une des valeurs suivantes :

  • "true" indique que vous voulez activer le protocole proxy version 2 sur tous les processus d'écoute de l'équilibreur de charge réseau.
  • "false" indique que vous voulez désactiver le protocole proxy version 2 sur tous les processus d'écoute de l'équilibreur de charge réseau.

Après avoir activé la fonctionnalité de protocole proxy pour les équilibreurs de charge réseau, tenez compte des points suivants :

  • Vous pouvez désactiver la fonctionnalité de protocole proxy sur les processus d'écoute d'équilibreur de charge réseau en définissant "<value>" sur "false".
  • Si vous enlevez ensuite l'annotation du manifeste, que vous annulez sa définition (en définissant "<value>" sur "") ou que vous indiquez une valeur non valide (telle que "enable") pour l'annotation, le dernier paramètre appliqué avec succès pour "<value>" est conservé sur tous les processus d'écoute.