
Il y a quelques mois, j'ai écrit un article sur le contrôleur Kubernetes Nginx Ingress , qui se classe deuxième en popularité sur ce blog. Son thème principal est l'utilisation de Kubernetes Ingress pour les déploiements sur site. Cependant, la plupart des utilisateurs utilisent Kubernetes dans le cloud AWS et les services de cloud public d'autres fournisseurs. Cependant, le problème est qu'AWS crée un nouvel ELB (Elastic Load Balancer) pour chaque service de type LoadBalancer. Cela peut être un régal trop cher. Si vous utilisez l'entrée Kubernetes, vous n'aurez besoin que d'un seul ELB.
Comment ça marche?
Pour une meilleure compréhension, je vais vous donner quelques schémas. Sans contrôleur Ingress, un équilibreur ELB classique distinct sera créé pour chaque service fourni:

Lorsque vous utilisez Ingress, vous n'aurez besoin que d'un tel équilibreur ELB, dirigeant toutes les demandes vers les proxys Ingress exécutés dans le cluster:

Considérez le coût de l'équilibreur de charge classique:
Vous devez payer pour chaque heure complète ou incomplète de l'équilibreur de charge Classic Load Balancer et pour chaque gigaoctet de données transférées avec lui.
Cela signifie que lorsque vous utilisez un cluster dans la région Est des États-Unis, vous devrez payer environ 18,25 $ pour chaque service fourni. Vous devez également payer pour chaque gigaoctet de données traitées. Ingress vous permet de réduire les coûts AWS avec un grand nombre de services. Bien sûr, pour garantir une haute disponibilité, vous pouvez utiliser plusieurs répliques du module proxy Ingress.
Déployer Nginx Ingress
Il existe un grand nombre d'options disponibles pour le contrôleur Ingress, par exemple Traefik , Voyager (pour HAProxy), Contour (pour Envoy ), ou même le contrôleur Ingress AWS ALB (version alpha), qui est légèrement différent du reste. Dans cet article, je regarde le contrôleur Ingress Nginx , maintenant le plus courant. Contrairement à l'article précédent sur le contrôleur Ingress Nginx , cette fois j'utilise Helm pour le déploiement:
cat > values.yaml <<EOF controller: replicaCount: 2 config: use-proxy-protocol: "true" service: annotations: service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*' EOF helm install --name ingress \ --namespace ingress \ -f values.yaml \ stable/nginx-ingress
Remarque Il y a un problème avec Helm que les booléens ne sont pas analysés en tant que chaînes lors de l'utilisation de l'argument set. Par conséquent, j'ai créé un fichier avec des valeurs et je n'ai pas mis à --set
valeurs par défaut via --set
et --set-string
.
La vérification du foyer Ingress affiche deux services, le contrôleur et le côté serveur par défaut:
kubectl get pod -n ingress --selector=app=nginx-ingress NAME READY STATUS RESTARTS AGE ingress-nginx-ingress-controller-8689c87db7-jlwxv 1/1 Running 0 5m ingress-nginx-ingress-controller-8689c87db7-kv859 1/1 Running 0 5m ingress-nginx-ingress-default-backend-5f5888cc9b-jdjrp 1/1 Running 0 5m
Certains points doivent être expliqués ici. Étant donné que toutes les demandes seront traitées sous le contrôleur Ingress, il est souhaitable d'avoir au moins deux de ses répliques. Il s'agit essentiellement d'un serveur proxy interne. Le contrôleur utilise le backend par défaut pour acheminer les ressources Ingress inexistantes. Le côté serveur est assez simple par défaut. Pour obtenir les adresses IP source dans le journal du proxy Ingress, j'ai activé le protocole proxy pour Nginx et ELB en utilisant les deux paramètres suivants:
--set controller.service.annotations."service\\.beta\\.kubernetes\\.io/aws-load-balancer-proxy-protocol"='*' \ --set-string controller.config.use-proxy-protocol=true \
Le protocole de connexion proxy est conçu pour communiquer des serveurs proxy sans perdre de données client.
Et en prime, vous pouvez désormais obtenir facilement un DNS automatique. Créez d'abord un enregistrement DNS A à l'aide de métacaractères, tels que *.test.example.com
, qui pointera vers le contrôleur Ingress ELB. L'adresse ELB peut être obtenue à l'aide de cette commande:
kubectl get svc ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' -n ingress a00950ebcfd0411e740ee0207cf10ce8-1089949860.eu-west-1.elb.amazonaws.com
Ensuite, lorsque vous créez le point d'entrée Ingress avec l'hôte site1.test.example.com
, site1.test.example.com
pouvez immédiatement saisir cette ligne dans le navigateur. DNS résoudra le nom sans configuration supplémentaire. L'utilisation d'un enregistrement DNS avec des métacaractères n'est pas une bonne idée, mais cela fonctionne. Pour configurer DNS en détail, vous pouvez utiliser un DNS externe pour Kubernetes.
Conclusion
L'utilisation du contrôleur Ingress aide vraiment à atteindre un niveau d'automatisation plus élevé. Mais n'oubliez pas qu'en cas d'échec, tous vos points de terminaison externes échoueront également! Dans le prochain article, je montrerai comment configurer la mise à jour et l'installation automatiques des certificats SSL à l'aide de Let's Encrypt. Après cela, vous pouvez utiliser le DNS automatique avec les points de terminaison SSL par défaut. Suivez l'actualité.