Migrer NGINX à partir du dépôt « stable » charts Helm avec ChartCenter
MISE À JOUR : depuis le 1er mai 2021, le dépôt central ChartCenter a été mis hors service et toutes les fonctionnalités sont obsolètes. Pour en savoir plus sur la mise hors service des centres, lisez l’article de blog sur la dépréciation des centres
Au cours des quatre dernières années, quiconque souhaitait déployer le contrôleur Ingress NGINX pour Kubernetes trouvait son chart Helm officiel. nginx-ingress
dans le dépôt stable
géré par le projet Helm.
Cette époque est révolue. Et pas seulement pour NGINX, le contrôleur Ingress le plus populaire utilisé comme proxy inverse et équilibreur de charge, mais pour toutes les applications K8s open source.
Avec l’avènement de Helm 3, le projet Helm déprécie les dépôts stable
À partir de novembre 2019, aucun nouveau chart ne devait être accepté dans stable
car les propriétaires de charts effectuent une transition vers des dépôts individuels. Cette période de transition est maintenant terminée, les dépôts — stable
ont été retirés de la liste de Helm Hub, et seront officiellement obsolètes en novembre prochain.
Qu’est-ce que cela signifie pour les installateurs et les responsables des déploiements NGINX ? Pour commencer, le projet NGINX maintient désormais un nouveau chart ingress-nginx
Helm dans les dépôts GitHub pour Kubernetes. Toute personne qui installe ou met à jour un déploiement de NGINX Ingress Controller doit désormais utiliser le chart de ce dépôt.
Même si le nouveau chart déploie actuellement la même version de l’application NGINX, il n’est pas identique au chart dans stable.
. Cela nécessite quelques ajustements lors de la mise à jour d’une installation NGINX en place avec l nouveau chart.
Voyons ce que cela implique, et comment JFrog ChartCenter peut vous aider à la transition.
Un dépôt central Helm
L’ensemble stable
de charts Helm signifiait que les charts officiels de nombreuses applications Kubernetes populaires pouvaient toujours être trouvés dans un dépôt central. Il suffisait d’ajouter le dépôt stable
au client Helm :
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
À partir de ce dépôt stable
unique, vous pouviez déployer en toute confiance nginx-ingress
en utilisant le dernier chart Helm approuvé par l’auteur.
Comme le dépôt stable
est pratiquement obsolète, il n’est plus disponible en tant que source unique pour les charts Helm connus. NGINX vous demande maintenant d’ajouter ingress-nginx
individuellement au client Helm :
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
Sans un dépôt central, vous devez exécuter un helm repo add
distinct chaque fois que vous devez mettre à jour une application K8s différente.
Existe-t-il un meilleur moyen ?
Ingress NGINX Controller dans ChartCenter
JFrog ChartCenter est un dépôt central gratuit de charts Helm qui a été conçu pour aider la communauté Helm à trouver des charts immuables, sécurisés et fiables, et à disposer d’une même analyse pour proxyer tous les charts à partir d’un seul emplacement. Il peut être utilisé comme un dépôt Helm central à partir du client Helm, ce qui vous évite d’ajouter de nombreux dépôts Helm publics, mais vous permet d’en utiliser un seul.
Grâce à ChartCenter, plus de 30 000 charts Helm versionnés sont disponibles, et de nombreux charts d’applications populaires – y compris pour le contrôleur NGINX Ingress – sont présentés sur sa page d’accueil afin que vous puissiez les localiser facilement.
Grâce à la recherche de ChartCenter, nous pouvons trouver le chart stable
nginx-ingress
:
Nous pouvons également localiser le chart actuelingress-nginx
dans ChartCenter :
Utilisation de ChartCenter
Une fois que nous avons ajouté ChartCenter à notre client Helm, nous pouvons l’utiliser comme dépôt central pour tous nos charts Helm, y compris les deux dépôts NGINX que nous utiliserons dans notre démonstration.
Étape 1 : Ajouter ChartCenter en tant que dépôt Helm
Configurez votre client Helm pour qu’il utilise le dépôt ChartCenter comme emplacement central unique pour consommer les charts à partir de :
$ helm repo add center https://repo.chartcenter.io
$ helm repo update
Étape 2 : Utilisation de ChartCenter en tant que dépôt
Maintenant, vérifions les charts nginx-ingress
et ingress-nginx
à partir du client helm :
$ helm search repo center/stable/nginx-ingress
NOM VERSION DU CHART VERSION DE L’APP DESCRIPTION
center/stable/nginx-ingress 1.41.2 v0.34.1 Un nginx Ingress controller qui utilise ConfigMap...
$ helm search repo center/kubernetes-ingress-nginx/ingress-nginx
NOM VERSION DU CHART VERSION DE L’APP DESCRIPTION
center/kubernetes-ingress-nginx/ingress-nginx 2.11.2 0.34.1 Ingress controller pour Kubernetes à l’aide de NGINX a...
Bien, nous voyons la même version de charts que dans ChartCenter UI.
Et ici, vous pouvez voir à quel point il est plus facile d’utiliser un dépôt Helm central pour des charts provenant de différents dépôts Helm.
Installation du chart nginx-ingress Helm
Pour tester d’abord la mise à niveau, nous devons installer un dépôt nginx-ingress
. Je vais utiliser un petit script shell nginx-ingress.sh
qui crée un fichier de valeurs de remplacement, et installe ensuite nginx-ingress
.
nginx-ingress.sh
a un nom et une version de chart, et une IP statique pour l’équilibreur de charge :
#!/bin/bash
NOM_CHART = "center/stable/nginx-ingress"
VERSION_CHART = "1.41.2"
VERSION = nginx-ingress
ESPACE DE NOMS = nginx-ingress
FICHER_VALEURS = nginx-ingress.yaml
IP_STATIQUE_LB = 35.197.192.35
generateValues() {
cat << EOF > "${VALUES_FILE}"
# Valeurs de remplacement pour nginx-ingress
contrôleur :
## Utiliser les ports hôtes 80 et 443
daemonset :
utiliser le port de l’hôte : vrai
type : DaemonSet
service :
## Définir l’adresse IP statique pour LoadBalancer
IP équilibreur de charge : ${LB_STATIC_IP}
Politique de trafic externe : locale
stats :
activées : vrai
mesures :
activées : vrai
Fin de fichier
}
génère des valeurs
kubectl create ns nginx-ingress || true
écho
helm upgrade --install ${RELEASE} -n ${NAMESPACE} ${CHART_NAME} --version ${CHART_VERSION} -f ${VALUES_FILE}
écho
kubectl -n ${NAMESPACE} get all
Exécutons nginx-ingress.sh
pour installer nginx-ingress
:
$ ./nginx-ingress.sh
namespace/nginx-ingress created
La version « nginx-ingress » n’existe pas. Installez-la maintenant.
NOM : nginx-ingress
DERNIER DÉPLOIEMENT : Lun 10 août 17:27:13 2020
ESPACE DE NOMS : nginx-ingress
ÉTAT : déployé
RÉVISION : 1
SUITE DE TESTS : aucune
REMARQUES :
Le contrôleur nginx-ingress a été installé.
La disponibilité de l’adresse IP LoadBalancer peut prendre quelques minutes.
Vous pouvez vérifier l’état en exécutant « kubectl --namespace nginx-ingress get services -o wide -w nginx-ingress-controller »
Un exemple d’Ingress qui utilise le contrôleur :
Version d’API : extensions/v1beta1
type : Ingress
métadonnées :
annotations :
kubernetes.io/ingress.class : nginx
nom : exemple
espace de noms : foo
spéc :
règle :
- hôte : www.example.com
http :
chemins :
- backend :
nom de service : exampleService
port de service : 80
chemin : /
# Cette section n’est requise que si TLS doit être activé pour Ingress
tls :
- hôtes :
- www.example.com
nom secret : exemple-tls
Si TLS est activé pour Ingress, un secret contenant le certificat et la clé doit également être fourni :
Version d’API : v1
type : secret
métadonnées :
nom : exemple-tls
espace de noms : foo
données :
cert tls :
clé tls :
type : kubernetes.io/tls
NOM PRÊT ÉTAT REDÉMARRAGES ANTÉRIORITÉ
pod/nginx-ingress-controller-rrsl9 0/1 ContainerCreating 0 1 s
pod/nginx-ingress-default-backend-5b967cf596-wrrfl 0/1 ContainerCreating 0 1 s
NOM TYPE IP-CLUSTER IP-EXTERNE PORT(S) ANTÉRIORITÉ
service/nginx-ingress-controller LoadBalancer 10.242.2.213 80:30643/TCP,443:31622/TCP 2 s
service/nginx-ingress-controller-metrics IP Cluster 10.242.10.112 9913/TCP 2 s
service/nginx-ingress-default-backend IP Cluster 10.242.11.172 80/TCP 2 s
NOM SOUHAITÉ ACTUEL PRÊT À JOUR DISPONIBLE SÉLECTEUR DE NŒUDS ANTÉRIORITÉ
daemonset.apps/nginx-ingress-controller 1 1 0 1 0 3 s
NOM PRÊT À JOUR DISPONIBLE ANTÉRIORITÉ
deployment.apps/nginx-ingress-default-backend 0/1 1 0 2 s
NOM SOUHAITÉ ACTUEL PRÊT ANTÉRIORITÉ
replicaset.apps/nginx-ingress-default-backend-5b967cf596 1 1 0 2 s
Et vérifions les pods et le service :
$ kubectl -n nginx-ingress get pods
NOM PRÊT ÉTAT REDÉMARRAGES ANTÉRIORITÉ
nginx-ingress-controller-rrsl9 1/1 Exécution 0 78 s
nginx-ingress-default-backend-5b967cf596-wrrfl 1/1 Exécution 0 78 s
$ kubectl -n nginx-ingress get svc
NOM TYPE IP-CLUSTER IP-EXTERNE PORT(S) ANTÉRIORITÉ
nginx-ingress-controller LoadBalancer 10.242.2.213 35.197.192.35 80:30643/TCP,443:31622/TCP 89 s
nginx-ingress-controller-metrics IP Cluster 10.242.10.112 9913/TCP 89 s
nginx-ingress-default-backend IP Cluster 10.242.11.172 80/TCP 89 s
Bien, le pod NGINX Ingress Controller est en place, et son service s’est vu attribuer une IP externe par l’équilibreur de charge.
Ok, nous avons réussi à installer le chart nginx-ingress
passons à sa mise à jour.
Mise à niveau vers le chart ingress-nginx Helm
Essayons de mettre à niveau NGINX Ingress Controller en utilisant le chart le plus actuel.
Encore une fois, nous allons utiliser un script shell cette fois avec le nom différent ingress-nginx.sh
.
ingress-nginx.sh
a un nom et une version de chart différents, ainsi que le même nom de version Helm et la même adresse IP statique pour l’équilibreur de charge.
#!/bin/bash
NOM_CHART = "center/kubernetes-ingress-nginx/ingress-nginx"
VERSION_CHART = "2.11.1"
VERSION = nginx-ingress
ESPACE DE NOMS = nginx-ingress
FICHER_VALEURS = ingress-nginx.yaml
IP_STATIQUE_LB = 35.197.192.35
generateValues() {
cat << EOF > "${VALUES_FILE}"
# Valeurs de remplacement pour ingress-nginx
contrôleur :
## Utiliser les ports hôtes 80 et 443
port de l’hôte :
activées : vrai
type : DaemonSet
service :
## Définir l’adresse IP statique pour LoadBalancer
IP équilibreur de charge : ${LB_STATIC_IP}
Politique de trafic externe : locale
stats :
activées : vrai
mesures :
activées : vrai
admissionWebhooks :
activée : faux
defaultBackend :
activé : vrai
Fin de fichier
}
génère des valeurs
écho
helm upgrade --install ${RELEASE} -n ${NAMESPACE} ${CHART_NAME} --version ${CHART_VERSION} -f ${VALUES_FILE}
écho
kubectl -n ${NAMESPACE} get all
ingress-nginx.sh
présente quelques différences par rapport à nginx-ingress.sh
:
contrôleur :
## Utiliser les ports hôtes 80 et 443
daemonset :
utiliser le port de l’hôte : vrai
comme certaines valeurs ont été modifiées à :
contrôleur :
## Utiliser les ports hôtes 80 et 443
port de l’hôte :
activé : vrai
type : DaemonSet
et d’autres ont été ajoutées :
admissionWebhooks :
activé : faux
defaultBackend :
activé : vrai
Dans ce scénario de mise à niveau, nous n’utilisons pas admissionWebhooks
donc nous le désactivons, et nous activons defaultBackend
comme dans le chart nginx-ingress
il est activé par défaut. Et bien sûr, vous pouvez modifier les valeurs en fonction de vos besoins.
Exécutons ingress-nginx.sh
pour mettre à niveau nginx-ingress
:
La version « nginx-ingress » a été mise à niveau. Bonne chance !
NOM : nginx-ingress
DERNIER DÉPLOIEMENT : Lun 10 août 18:00:31 2020
ESPACE DE NOMS : nginx-ingress
ÉTAT : déployé
RÉVISION : 2
SUITE DE TESTS : aucune
REMARQUES :
Le contrôleur ingress-nginx a été installé.
La disponibilité de l’adresse IP LoadBalancer peut prendre quelques minutes.
Vous pouvez vérifier l’état en exécutant « kubectl --namespace nginx-ingress get services -o wide -w nginx-ingress-ingress-nginx-controller »
Un exemple d’Ingress qui utilise le contrôleur :
Version d’API : networking.k8s.io/v1beta1
type : Ingress
métadonnées :
annotations :
kubernetes.io/ingress.class : nginx
nom : exemple
espace de noms : foo
spéc :
règle :
- hôte : www.example.com
http :
chemins :
- backend :
nom de service : exampleService
port de service : 80
chemin : /
# Cette section n’est requise que si TLS doit être activé pour Ingress
tls :
- hôtes :
- www.example.com
nom secret : exemple-tls
Si TLS est activé pour Ingress, un secret contenant le certificat et la clé doit également être fourni :
Version d’API : v1
type : secret
métadonnées :
nom : exemple-tls
espace de noms : foo
données :
cert tls :
clé tls :
type : kubernetes.io/tls
NOM PRÊT ÉTAT REDÉMARRAGES ANTÉRIORITÉ
pod/nginx-ingress-controller-rrsl9 1/1 Fin d’exécution 0 33 m
pod/nginx-ingress-default-backend-5b967cf596-wrrfl 0/1 Fin d’exécution 0 33 m
pod/nginx-ingress-ingress-nginx-controller-f9ztr 0/1 En attente 0 5 s
pod/nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46-56grw 1/1 Exécution 0 5 s
NOM TYPE IP-CLUSTER IP-EXTERNE PORT(S) ANTÉRIORITÉ
service/nginx-ingress-controller LoadBalancer 10.242.2.213 35.197.192.35 80:30643/TCP,443:31622/TCP 33m
service/nginx-ingress-ingress-nginx-controller LoadBalancer 10.242.13.184 80:30601/TCP,443:30644/TCP 6 s
service/nginx-ingress-ingress-nginx-controller-metrics IP Cluster 10.242.12.190 9913/TCP 6 s
service/nginx-ingress-ingress-nginx-defaultbackend IP Cluster 10.242.11.112 80/TCP 5 s
NOM SOUHAITÉ ACTUEL PRÊT À JOUR DISPONIBLE SÉLECTEUR DE NŒUDS ANTÉRIORITÉ
daemonset.apps/nginx-ingress-ingress-nginx-controller 1 1 0 1 0 6 s
NOM PRÊT À JOUR DISPONIBLE ANTÉRIORITÉ
deployment.apps/nginx-ingress-ingress-nginx-defaultbackend 1/1 1 1 6 s
NOM SOUHAITÉ ACTUEL PRÊT ANTÉRIORITÉ
replicaset.apps/nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46 1 1 1 6 s
Maintenant, vérifions les pods et le service :
$ kubectl -n nginx-ingress get pods
NOM PRÊT ÉTAT REDÉMARRAGES ANTÉRIORITÉ
nginx-ingress-ingress-nginx-controller-f9ztr 0/1 Exécution 0 34 s
nginx-ingress-ingress-nginx-defaultbackend-845f7cfd46-56grw 1/1 Exécution 0 34 s
$ kubectl -n nginx-ingress get svc
NOM TYPE IP-CLUSTER IP-EXTERNE PORT(S) ANTÉRIORITÉ
nginx-ingress-controller LoadBalancer 10.242.2.213 35.197.192.35 80:30643/TCP,443:31622/TCP 34m
nginx-ingress-ingress-nginx-controller LoadBalancer 10.242.13.184 80:30601/TCP,443:30644/TCP 40 s
nginx-ingress-ingress-nginx-controller-metrics IP Cluster 10.242.12.190 9913/TCP 40 s
nginx-ingress-ingress-nginx-defaultbackend IP Cluster 10.242.11.112 80/TCP 39 s
Vous voyez ici que les pods sont mis à jour et nous voyons deux services, un ancien et un nouveau.
Exécutons kubectl -n nginx-ingress get svc
encore :
$ kubectl -n nginx-ingress get svc
NOM TYPE IP-CLUSTER IP-EXTERNE PORT(S) ANTÉRIORITÉ
nginx-ingress-ingress-nginx-controller LoadBalancer 10.242.13.184 35.197.192.35 80:30601/TCP,443:30644/TCP 3m26 s
nginx-ingress-ingress-nginx-controller-metrics IP Cluster 10.242.12.190 9913/TCP 3 m 26 s
nginx-ingress-ingress-nginx-defaultbackend IP Cluster 10.242.11.112 80/TCP 3 m 25 s
Voila, l’ancien service a été supprimé et le nouveau créé juste en exécutant helm upgrade
et sans utiliser d’autre magie avec kubectl. Bien entendu, le remplacement du service entraîne une certaine indisponibilité, car le nouvel équilibreur de charge doit être créé pour le nouveau service.
Merci, et bonne chance
Assez facile, non ? Un grand merci aux responsables du chart NGINX Ingress Controller pour une mise à jour aussi transparente entre deux charts différents !
Avec un peu de chance, la transition vers des dépôts de cartes individuels pour vos autres applications K8s se fera également en douceur. L’utilisation de ChartCenter en tant que dépôt central de charts Helm peut vous aider à effectuer ces mises à jour.
Joyeux Ingressing