Cette page vous explique comment configurer un équilibreur de charge d'application externe en créant un objet Ingress Kubernetes.
Avant de lire ce document, assurez-vous de connaître les concepts de la mise en réseau GKE.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande
gcloud components update
.
Activez le module complémentaire HttpLoadBalancing
.
Le module complémentaire HttpLoadBalancing
doit être activé sur votre cluster. Ce module complémentaire est activé par défaut. Dans les clusters Autopilot, vous ne pouvez pas désactiver ce module complémentaire.
Vous pouvez activer le module complémentaire HttpLoadBalancing
à l'aide de la console Google Cloud ou de Google Cloud CLI.
Console
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Cliquez sur le nom du cluster que vous souhaitez modifier.
Sous Mise en réseau, dans le champ Équilibrage de charge HTTP, cliquez sur edit Modifier l'équilibrage de charge HTTP.
Cochez la case Activer l'équilibrage de charge HTTP.
Cliquez sur Save Changes (Enregistrer les modifications).
gcloud
gcloud container clusters update CLUSTER_NAME --update-addons=HttpLoadBalancing=ENABLED
Remplacez CLUSTER_NAME
par le nom de votre cluster.
Créer une adresse IP statique
Un équilibreur de charge d'application externe fournit une adresse IP stable pour l'acheminement des requêtes vers un ou plusieurs services. Si vous souhaitez obtenir une adresse IP permanente, vous devez réserver une adresse IP externe statique globale avant de créer un objet Ingress.
Si vous modifiez un objet Ingress existant pour utiliser une adresse IP statique au lieu d'une adresse IP éphémère, GKE peut modifier l'adresse IP de l'équilibreur de charge lorsque GKE recrée la règle de transfert de l'équilibreur de charge.
Créer un équilibreur de charge d'application externe
Dans cet exercice, vous allez configurer un équilibreur de charge d'application externe afin d'acheminer les requêtes vers différents services en fonction du chemin de l'URL.
Pour obtenir des instructions détaillées sur cette tâche directement dans la console Google Cloud, cliquez sur Visite guidée :
Créer des déploiements et des services
Créez deux déploiements avec des services nommés hello-world-1
et hello-world-2
:
Enregistrez le manifeste suivant sous le nom
hello-world-deployment-1.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: hello-world-deployment-1 spec: selector: matchLabels: greeting: hello version: one replicas: 3 template: metadata: labels: greeting: hello version: one spec: containers: - name: hello-app-1 image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0" env: - name: "PORT" value: "50000"
Ce fichier manifeste décrit un exemple de déploiement comportant trois instances répliquées.
Appliquez le fichier manifeste au cluster :
kubectl apply -f hello-world-deployment-1.yaml
Enregistrez le manifeste suivant sous le nom
hello-world-service-1.yaml
:apiVersion: v1 kind: Service metadata: name: hello-world-1 spec: type: NodePort selector: greeting: hello version: one ports: - protocol: TCP port: 60000 targetPort: 50000
Ce fichier manifeste décrit un service avec les propriétés suivantes :
- Tous les pods comportant les étiquettes
greeting: hello
etversion: one
sont membres du service. - GKE transfère les requêtes envoyées au service sur le port TCP 60000 à l'un des pods membres sur le port TCP 50000.
- Le type du service doit obligatoirement être
NodePort
, sauf si vous utilisez l'équilibrage de charge natif en conteneurs, auquel cas aucune restriction n'est imposée sur le type de service. Nous vous recommandons de définir le type comme suit :type: ClusterIP
.
- Tous les pods comportant les étiquettes
Appliquez le fichier manifeste au cluster :
kubectl apply -f hello-world-service-1.yaml
Enregistrez le manifeste suivant sous le nom
hello-world-deployment-2.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: hello-world-deployment-2 spec: selector: matchLabels: greeting: hello version: two replicas: 3 template: metadata: labels: greeting: hello version: two spec: containers: - name: hello-app-2 image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0" env: - name: "PORT" value: "8080"
Ce fichier manifeste décrit un exemple de déploiement comportant trois instances répliquées.
Appliquez le fichier manifeste au cluster :
kubectl apply -f hello-world-deployment-2.yaml
Enregistrez le manifeste suivant sous le nom
hello-world-service-2.yaml
:apiVersion: v1 kind: Service metadata: name: hello-world-2 spec: type: NodePort selector: greeting: hello version: two ports: - protocol: TCP port: 80 targetPort: 8080
Ce fichier manifeste décrit un service avec les propriétés suivantes :
- Tous les pods comportant les étiquettes
greeting: hello
etversion: two
sont membres du service. - GKE transfère les requêtes envoyées au service sur le port TCP 80 à l'un des pods membres sur le port TCP 8080.
- Tous les pods comportant les étiquettes
Appliquez le fichier manifeste au cluster :
kubectl apply -f hello-world-service-2.yaml
Créer un objet Ingress
Créez un objet Ingress qui spécifie les règles de routage des requêtes en fonction du chemin de l'URL spécifié dans la requête. Lorsque vous créez l'objet Ingress, le contrôleur GKE Ingress crée et configure un équilibreur de charge d'application externe.
Enregistrez le manifeste suivant sous le nom
my-ingress.yaml
:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: # If the class annotation is not specified it defaults to "gce". kubernetes.io/ingress.class: "gce" spec: rules: - http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: hello-world-1 port: number: 60000 - path: /v2 pathType: ImplementationSpecific backend: service: name: hello-world-2 port: number: 80
Ce fichier manifeste décrit un objet Ingress avec les propriétés suivantes :
Il existe deux classes GKE Ingress. Pour spécifier une classe Ingress, vous devez utiliser l'annotation
kubernetes.io/ingress.class
. Vous ne pouvez pas spécifier le contrôleur GKE Ingress en utilisantspec.ingressClassName
.La classe
gce
déploie un équilibreur de charge d'application externe.La classe
gce-internal
déploie un équilibreur de charge d'application interne.Lorsque vous déployez une ressource Ingress sans les annotations
spec.ingressClassName
etkubernetes.io/ingress.class
, GKE crée un équilibreur de charge d'application externe. Il s'agit du même comportement que si l'annotationkubernetes.io/ingress.class: gce
était spécifiée. Pour en savoir plus, consultez la page Comportement du contrôleur GKE Ingress.GKE crée un service de backend Google Cloud pour chaque
backend.service
.Lorsqu'un client envoie une requête à l'équilibreur de charge avec le chemin d'URL
/
, GKE transfère la requête au servicehello-world-1
sur le port 60000. Lorsqu'un client envoie une requête à l'équilibreur de charge avec le chemin d'URL/v2
, GKE transfère la requête au servicehello-world-2
sur le port 80. Pour en savoir plus sur les propriétéspath
etpathType
, consultez la section Chemins d'URL.
Appliquez le fichier manifeste au cluster :
kubectl apply -f my-ingress.yaml
Tester l'équilibreur de charge d'application externe
Attendez environ cinq minutes que l'équilibreur de charge soit configuré, puis testez l'équilibreur de charge d'application externe :
Affichez l'objet Entrée :
kubectl get ingress my-ingress --output yaml
Le résultat affiche l'adresse IP de l'équilibreur de charge d'application externe :
status: loadBalancer: ingress: - ip: 203.0.113.1
Testez le chemin
/
:curl LOAD_BALANCER_IP_ADDRESS/
Remplacez
LOAD_BALANCER_IP_ADDRESS
par l'adresse IP externe de l'équilibreur de charge.Le résultat ressemble à ce qui suit :
Hello, world! Version: 1.0.0 Hostname: ...
Si le résultat inclut une erreur 404, attendez quelques minutes.
Testez le chemin
/v2
:curl load-balancer-ip/v2
Le résultat ressemble à ce qui suit :
Hello, world! Version: 2.0.0 Hostname: ...
Fonctionnement d'Ingress pour l'équilibrage de charge externe
Un équilibreur de charge d'application externe agit comme un proxy entre vos clients et votre application. Si vous souhaitez accepter les requêtes HTTPS de vos clients, l'équilibreur de charge doit disposer d'un certificat pour justifier son identité auprès de vos clients. L'équilibreur de charge doit également disposer d'une clé privée pour effectuer la négociation HTTPS. Pour en savoir plus, consultez les pages suivantes :
- Configurer HTTPS (TLS) entre le client et l’équilibreur de charge
- Utiliser plusieurs certificats SSL dans l'équilibrage de charge HTTPS avec un objet Ingress
Chemins d'URL
Le seul caractère générique accepté pour le champ path
d'une entrée est l'astérisque (*
). Le caractère *
doit être placé immédiatement après une barre oblique (/
) et doit être le dernier caractère du modèle. Par exemple, /*
, /foo/*
et /foo/bar/*
sont des modèles valides, mais ce n'est pas le cas de *
, /foo/bar*
et /foo/*/bar
.
Un modèle plus restrictif a priorité sur un modèle moins restrictif. Si vous avez à la fois /foo/*
et /foo/bar/*
, alors /foo/bar/bat
est considéré comme correspondant à /foo/bar/*
. Pour plus d'informations sur les restrictions en matière de chemin d'accès et la correspondance de modèle, consultez la documentation relative aux mappages d'URL.
Pour les clusters GKE exécutant des versions antérieures à la version 1.21.3-gke.1600, la seule valeur acceptée pour le champ pathType
est ImplementationSpecific
.
Pour les clusters exécutant la version 1.21.3-gke.1600 ou ultérieure, les valeurs Prefix
et Exact
sont également acceptées pour pathType
.
Désactiver HTTP
Si vous souhaitez que tout le trafic entre le client et l'équilibreur de charge utilise HTTPS, désactivez HTTP. Pour plus d'informations, consultez la page Désactiver HTTP.
HTTPS entre l'équilibreur de charge et l'application
Si votre application, qui s'exécute dans un pod GKE, est capable de recevoir des requêtes HTTPS, configurez l'équilibreur de charge pour qu'il utilise HTTPS lorsqu'il transfère des requêtes à votre application. Pour plus d'informations, consultez la section HTTPS (TLS) entre l'équilibreur de charge et votre application.
HTTP/2 entre le client et l'équilibreur de charge
Les clients peuvent utiliser HTTP/2 pour envoyer des requêtes à l'équilibreur de charge. Aucune configuration n'est requise.
HTTP/2 entre l'équilibreur de charge et l'application
Configurez l'équilibreur de charge pour qu'il utilise HTTP/2 lorsqu'il transfère des requêtes à votre application si cette dernière, exécutée dans un pod GKE, est capable de recevoir des requêtes HTTP/2. Pour plus d'informations, consultez la section HTTP/2 pour l'équilibrage de charge avec l'objet Entrée.
Groupes de points de terminaison du réseau
Si votre cluster est compatible avec l'équilibrage de charge natif en conteneurs, il est recommandé d'utiliser des groupes de points de terminaison du réseau (NEG). Pour les clusters GKE 1.17 et les versions ultérieures, et sous certaines conditions, l'équilibrage de charge natif en conteneurs est défini par défaut. Aucune annotation de service cloud.google.com/neg: '{"ingress": true}'
explicite n'est requise.
VPC partagé
Si le cluster GKE dans lequel vous déployez les ressources d'entrée se trouve dans un projet de service et que vous souhaitez que le plan de contrôle GKE gère les ressources de pare-feu dans votre projet hôte, le compte de service GKE du projet de service doit disposer des autorisations IAM appropriées sur le projet hôte, conformément à la section Gérer les ressources de pare-feu pour les clusters avec VPC partagé. Cela permet au contrôleur d'entrée de créer des règles de pare-feu afin d'autoriser le trafic entrant et le trafic pour les vérifications d'état Google Cloud.
Voici un exemple d'événement qui peut exister dans les journaux de ressources d'entrée. Cette erreur se produit lorsque le contrôleur d'entrée ne parvient pas à créer une règle de pare-feu pour autoriser le trafic entrant pour les vérifications d'état Google Cloud si les autorisations ne sont pas configurées correctement.
Firewall change required by security admin: `gcloud compute firewall-rules update <RULE_NAME> --description "GCE L7 firewall rule" --allow tcp:<PORT> --source-ranges 130.211.0.0/22,35.191.0.0/16 --target-tags <TARGET_TAG> --project <HOST_PROJECT>
Si vous préférez provisionner manuellement les règles de pare-feu à partir du projet hôte, vous pouvez mettre en sourdine les événements firewallXPNError
en ajoutant l'annotation networking.gke.io/suppress-firewall-xpn-error: "true"
à la ressource Ingress.
Récapitulatif des annotations de l'entrée externe
Annotations Ingress
Annotation | Description |
---|---|
kubernetes.io/ingress.allow-http | Spécifie s'il faut autoriser le trafic HTTP entre le client et l'équilibreur de charge HTTP(S). Les valeurs possibles sont "true" et "false". La valeur par défaut est "true". Voir Désactiver HTTP. |
ingress.gcp.kubernetes.io/pre-shared-cert | Utilisez cette annotation pour associer des ressources de certificats à des ressources Ingress de GKE. Pour en savoir plus, consultez la page Utiliser plusieurs certificats SSL avec des équilibreurs de charge d'application externes. |
kubernetes.io/ingress.global-static-ip-name | Utilisez cette annotation pour indiquer que l'équilibreur de charge doit utiliser une adresse IP externe statique que vous avez créée précédemment. Voir Adresses IP statiques pour les équilibreurs de charge HTTP(S). |
networking.gke.io/v1beta1.FrontendConfig | Utilisez cette annotation pour personnaliser la configuration côté client de l'équilibreur de charge. Pour en savoir plus, consultez la page Configuration d'entrée. |
networking.gke.io/suppress-firewall-xpn-error | Pour les équilibreurs de charge d'entrée, si Kubernetes ne peut pas modifier les règles du pare-feu en raison d'autorisations insuffisantes, un événement firewallXPNError est créé régulièrement (avec un délai de quelques minutes entre les diffusions). Dans GLBC 1.4 et ses versions ultérieures, vous pouvez désactiver l'événement firewallXPNError en ajoutant l'annotation networking.gke.io/suppress-firewall-xpn-error: "true" à la ressource d'entrée. Vous pouvez supprimer cette annotation pour réactiver l'événement. Les valeurs possibles sont true et false .
La valeur par défaut est false .
|
Annotations des services associées à Ingress
Annotation | Description |
---|---|
cloud.google.com/app-protocols | Utilisez cette annotation pour définir le protocole de communication entre l'équilibreur de charge et l'application. Les protocoles possibles sont HTTP, HTTPS et HTTP2. Consultez les sections HTTPS entre l'équilibreur de charge et votre application et HTTP/2 pour l'équilibrage de charge avec l'objet Ingress. |
cloud.google.com/backend-config | Utilisez cette annotation pour configurer le service de backend associé à un service. Pour en savoir plus, consultez la page Configuration d'entrée. |
cloud.google.com/neg | Utilisez cette annotation pour indiquer que l'équilibreur de charge doit utiliser des groupes de points de terminaison du réseau. Voir Utiliser l'équilibrage de charge natif en conteneurs. |
Étapes suivantes
- Consultez la présentation du concept d'Ingress pour les équilibreurs de charge d'application externes dans GKE.
- Suivez le tutoriel Configurer un équilibreur de charge d'application externe avec Ingress.
Accédez à une présentation du concept d'objet Service dans GKE.
Mettez en œuvre un objet Ingress externe de base.