Bienvenue dans cette série de guides rapides sur Kubernetes. C'est une chronique réguliÚre avec les questions les plus intéressantes que nous recevons en ligne et lors de nos formations. Répond à l'expert Kubernetes.
L'expert d'aujourd'hui est Daniele Polencic (). Daniele travaille comme instructeur et développeur logiciel chez .
Si vous souhaitez obtenir une réponse à votre question dans le prochain post, ou sur .
Vous avez manqué les posts précédents ? .
Comment connecter des clusters Kubernetes dans différents centres de données ?
En résumé: , et je vous recommande également de lire sur le et .
Il est assez courant que l'infrastructure soit répliquée et distribuée sur différentes régions, surtout dans des environnements contrÎlés.
Si une région est inaccessible, le trafic est redirigé vers une autre pour éviter les interruptions.
Avec Kubernetes, vous pouvez utiliser une stratégie similaire et répartir les charges de travail sur différentes régions.
Vous pouvez avoir un ou plusieurs clusters par équipe, région, environnement ou une combinaison de ces éléments.
Vos clusters peuvent ĂȘtre hĂ©bergĂ©s dans diffĂ©rents clouds et dans un environnement local.
Mais comment planifier l'infrastructure pour un tel étalement géographique ?
Faut-il créer un grand cluster sur plusieurs clouds via un réseau unique ?
Ou créer de nombreux petits clusters et trouver un moyen de les contrÎler et de les synchroniser ?
Un cluster centralisé
Créer un seul cluster sur un réseau unique n'est pas si simple.
Imaginez, vous avez un incident, la connectivité entre les segments du cluster est perdue.
Si vous avez un serveur maßtre, la moitié des ressources ne pourra pas recevoir de nouvelles commandes, car elles ne parviennent pas à se connecter au maßtre.
Et à cela, vous avez des anciennes tables de routage (kube-proxy ne peut pas charger de nouvelles) et aucun pod supplémentaire (kubelet ne peut pas demander de mises à jour).
Ce qui est encore pire, c'est que si Kubernetes ne voit pas un nĆud, il le marque comme perdu et rĂ©partit les pods manquants sur les nĆuds existants.
En fin de compte, vous avez deux fois plus de pods.
Si vous faites un serveur maĂźtre pour chaque rĂ©gion, il y aura des problĂšmes avec l'algorithme d'atteinte du consensus dans la base de donnĂ©es etcd. (note de l'Ă©diteur â En rĂ©alitĂ©, la base de donnĂ©es etcd n'a pas besoin d'ĂȘtre sur les serveurs maĂźtres. Elle peut ĂȘtre lancĂ©e sur un groupe sĂ©parĂ© de serveurs dans une mĂȘme rĂ©gion. Cela dit, cela crĂ©e un point de dĂ©faillance pour le cluster. Mais c'est rapide.)
etcd utilise , pour parvenir à un consensus sur la valeur avant de l'écrire sur le disque.
En d'autres termes, la majoritĂ© des instances doivent parvenir Ă un consensus avant que l'Ă©tat puisse ĂȘtre Ă©crit dans etcd.
Si le temps de latence entre les instances etcd augmente rapidement, comme dans le cas de trois instances etcd dans différentes régions, il faut beaucoup de temps pour parvenir à un consensus et écrire la valeur sur le disque.
Cela se reflÚte également sur les contrÎleurs Kubernetes.
Le gestionnaire de contrÎleurs a besoin de plus de temps pour détecter le changement et écrire la réponse dans la base de données.
Et comme il n'y a pas un seul contrÎleur, mais plusieurs, cela entraßne une réaction en chaßne et tout le cluster commence à fonctionner trÚs lentement..
etcd est si sensible Ă la latence que .
Il n'existe actuellement pas de bons exemples de grands réseaux pour un seul cluster.
Principalement, la communauté des développeurs et le groupe SIG-cluster essaient de comprendre comment orchestrer des clusters comme Kubernetes orchestre des conteneurs.
Option 1 : fédération de clusters avec kubefed
La rĂ©ponse officielle du SIG-cluster est â .
La premiÚre tentative de gestion d'une collection de clusters comme un objet unique a été réalisée à l'aide de l'outil kube federation.
Le début était prometteur, mais finalement, kube federation n'est pas devenu populaire car il ne prenait pas en charge toutes les ressources.
Il prenait en charge les déploiements combinés et les services, mais, par exemple, pas les StatefulSets.
De plus, la configuration de la fédération était transmise sous forme d'annotations et manquait de flexibilité.
Imaginez comment décrire le partage des réplicas pour chaque cluster dans la fédération à l'aide d'annotations uniques.
Cela a donné un véritable fouillis.
Le SIG-cluster a accompli un grand travail aprÚs kubefed v1 et a décidé d'aborder le problÚme sous un autre angle.
Au lieu d'annotations, ils ont choisi de publier un contrĂŽleur qui s'installe sur les clusters. Celui-ci peut ĂȘtre configurĂ© Ă l'aide de dĂ©finitions de ressources personnalisĂ©es (Custom Resource Definition, CRD).
Pour chaque ressource qui fera partie de la fédération, vous avez une définition CRD personnalisée en trois sections :
- la définition de ressource standard, par exemple un déploiement ;
- avec un commutateur de pseudo-classe
placement, oĂč vous dĂ©finissez comment la ressource sera distribuĂ©e dans la fĂ©dĂ©ration ; - avec un commutateur de pseudo-classe
override, oĂč pour une ressource spĂ©cifique, vous pouvez redĂ©finir le poids et les paramĂštres du placement.
Voici un exemple de déploiement fédéré avec les sections placement et override.
apiVersion: types.federation.k8s.io/v1alpha1
kind: FederatedDeployment
metadata:
name: test-deployment
namespace: test-namespace
spec:
template:
metadata:
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
placement:
clusterNames:
- cluster2
- cluster1
overrides:
- clusterName: cluster2
clusterOverrides:
- path: spec.replicas
value: 5Comme vous pouvez le voir, le déploiement est réparti sur deux clusters : cluster1 et cluster2.
Le premier cluster fournit trois répliques, tandis que le deuxiÚme en a spécifié cinq.
Si vous avez besoin de plus de contrĂŽle sur le nombre de rĂ©pliques, kubefed2 fournit un nouvel objet ReplicaSchedulingPreference oĂč les rĂ©pliques peuvent ĂȘtre rĂ©parties en fonction du poids :
apiVersion: scheduling.federation.k8s.io/v1alpha1
kind: ReplicaSchedulingPreference
metadata:
name: test-deployment
namespace: test-ns
spec:
targetKind: FederatedDeployment
totalReplicas: 9
clusters:
A:
weight: 1
B:
weight: 2La structure CRD et l'API ne sont pas encore tout Ă fait prĂȘtes, et un travail actif est en cours dans le dĂ©pĂŽt officiel du projet.
Suivez kubefed2, mais gardez Ă l'esprit qu'il n'est pas encore prĂȘt pour un environnement de production.
Découvrez-en plus sur kubefed2 dans dans le blog Kubernetes et dans .
Option 2 : fusion des clusters à la façon de Booking.com
Les dĂ©veloppeurs de Booking.com ne se sont pas occupĂ©s de kubefed v2, mais ont créé Shipper â un opĂ©rateur pour la livraison sur plusieurs clusters, dans plusieurs rĂ©gions et sur plusieurs clouds.
qui ressemble Ă kubefed2.
Les deux outils permettent de configurer la stratégie de déploiement sur plusieurs clusters (quels clusters sont utilisés et combien de répliques ils ont).
Mais la tùche de Shipper est de réduire le risque d'erreurs lors du déploiement.
Avec Shipper, vous pouvez définir plusieurs étapes décrivant la répartition des répliques entre le déploiement précédent et actuel ainsi que le volume de trafic entrant.
Lorsque vous envoyez une ressource dans un cluster, le contrÎleur Shipper déploie progressivement ce changement sur tous les clusters fédérés.
Et Shipper est aussi trÚs limité.
Par exemple, il accepte les charts Helm comme entrées et ne prend pas en charge les ressources vanilla.
En gros, Shipper fonctionne de la maniĂšre suivante.
Au lieu de la livraison standard, vous devez créer une ressource d'application, comprenant un Helm chart :
apiVersion: shipper.booking.com/v1alpha1
kind: Application
metadata:
name: super-server
spec:
revisionHistoryLimit: 3
template:
chart:
name: nginx
repoUrl: https://storage.googleapis.com/shipper-demo
version: 0.0.1
clusterRequirements:
regions:
- name: local
strategy:
steps:
- capacity:
contender: 1
incumbent: 100
name: staging
traffic:
contender: 0
incumbent: 100
- capacity:
contender: 100
incumbent: 0
name: full on
traffic:
contender: 100
incumbent: 0
values:
replicaCount: 3Shipper est une bonne option pour gérer plusieurs clusters, mais son lien étroit avec Helm ne fait que compliquer les choses.
Et si nous passions tous de Helm Ă ou ?
Découvrez-en plus sur Shipper et sa philosophie dans .
Si vous souhaitez fouiller dans le code, .
Option 3 : la "magie" de la fédération de clusters
Kubefed v2 et Shipper fonctionnent avec la fédération de clusters, fournissant aux clusters de nouvelles ressources via une définition de ressources personnalisée.
Mais que faire si vous ne souhaitez pas réécrire toutes les livraisons, StatefulSets, DaemonSets, etc. pour la fédération ?
Comment inclure un cluster existant dans la fédération sans toucher au YAML ?
, qui s'occupe des charges de travail en matiĂšre de planification dans les clusters.
Mais au lieu de trouver un nouveau moyen d'interagir avec le cluster et d'envelopper les ressources dans des définitions personnalisées, multi-cluster-scheduler s'intÚgre au cycle de vie standard de Kubernetes et intercepte tous les appels qui créent des pods.
Chaque pod créé est immédiatement remplacé par un espace réservé.
multi-cluster-scheduler utilise , afin d'intercepter l'appel et de créer un pod vide inactif.
Le pod original passe par un autre cycle de planification, oĂč aprĂšs sondage de toute la fĂ©dĂ©ration, une dĂ©cision est prise quant au placement.
Enfin, le pod est livré au cluster cible.
Au final, vous vous retrouvez avec un pod supplémentaire qui ne fait rien, juste un peu de place.
L'avantage est que vous n'avez pas eu besoin d'écrire de nouvelles ressources pour fédérer les livraisons.
Chaque ressource qui crĂ©e un pod est automatiquement prĂȘte pour la fĂ©dĂ©ration.
C'est intĂ©ressant, car vous avez soudainement des livraisons rĂ©parties sur plusieurs rĂ©gions, et vous ne l'avez mĂȘme pas remarquĂ©. Toutefois, c'est assez risquĂ©, car tout repose ici sur de la magie.
Mais si Shipper essaie principalement d'attĂ©nuer les consĂ©quences des livraisons, le multi-cluster-scheduler s'occupe de tĂąches plus gĂ©nĂ©rales et peut-ĂȘtre est-il mieux adaptĂ© aux travaux par lots.
Il n'a pas de mécanisme avancé de livraisons progressives.
Pour en savoir plus sur le multi-cluster-scheduler, vous pouvez consulter .
Si vous souhaitez lire sur le multi-cluster-scheduler en action, Admiralty a un â des workflows, des Ă©vĂ©nements, CI et CD Kubernetes.
D'autres outils et solutions
Connecter et gérer plusieurs clusters est une tùche complexe, il n'existe pas de solution universelle.
Si vous voulez explorer ce sujet plus en détail, voici quelques ressources :
- â un outil qui connecte les rĂ©seaux overlay de diffĂ©rents clusters Kubernetes.
- La chaĂźne de magasins Target utilise .
- Essayez d'utiliser IPV6 et .
- Vous pouvez utiliser un service mesh, par exemple .
- Cilium, un plugin pour l'interface réseau des conteneurs, propose , qui permet de combiner plusieurs clusters.
C'est tout pour aujourd'hui.
Merci d'avoir lu jusqu'Ă la fin !
Si vous connaissez une méthode plus efficace pour connecter plusieurs clusters, .
Nous ajouterons votre méthode aux liens.
Remerciements spéciaux à Chris Nesbitt-Smith () et Vincent De Smet () (ingénieur de fiabilité chez ) pour avoir lu l'article et partagé des informations utiles sur le fonctionnement de la fédération.
Source : habr.com
