Comment connecter des clusters Kubernetes dans différents centres de données

Comment connecter des clusters Kubernetes dans différents centres de données
Bienvenue dans la sĂ©rie de dĂ©marrage rapide Kubernetes. Il s'agit d'une chronique rĂ©guliĂšre contenant les questions les plus intĂ©ressantes que nous recevons en ligne et lors de nos formations. RĂ©ponses d’experts Kubernetes.

L'expert du jour est Daniel Polenchik (Daniele Polenčić). Daniel travaille comme instructeur et dĂ©veloppeur de logiciels dans Apprendrek8s.

Si vous souhaitez une rĂ©ponse Ă  votre question dans le prochain post, contactez-nous par email ou Twitter : @learnk8s.

Vous avez manqué des messages précédents ? Cherchez-les ici.

Comment connecter des clusters Kubernetes dans différents centres de données ?

BriÚvement: Kubefed v2 bientÎt disponible, et je vous conseille également de lire sur Expéditeur О projet de planification multi-cluster.

TrĂšs souvent, l’infrastructure est rĂ©pliquĂ©e et distribuĂ©e dans diffĂ©rentes rĂ©gions, en particulier dans des environnements contrĂŽlĂ©s.

Si une région est indisponible, 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 entre différentes régions.

Vous pouvez avoir un ou plusieurs clusters par équipe, région, environnement ou une combinaison de ceux-ci.

Vos clusters peuvent ĂȘtre hĂ©bergĂ©s sur plusieurs cloud et sur site.

Mais comment planifier les infrastructures pour une telle répartition géographique ?
Avez-vous besoin de crĂ©er un grand cluster pour plusieurs environnements cloud sur un seul rĂ©seau ?
Ou avoir de nombreux petits clusters et trouver un moyen de les contrĂŽler et de les synchroniser ?

Un pĂŽle de leadership

Créer un cluster sur un seul réseau n'est pas si simple.

Imaginez que vous ayez un accident, la connectivité entre les segments du cluster est perdue.

Si vous disposez d'un serveur maßtre, la moitié des ressources ne pourront pas recevoir de nouvelles commandes car elles ne pourront pas contacter le maßtre.

Et en mĂȘme temps vous avez d'anciennes tables de routage (kube-proxy ne peut pas en tĂ©lĂ©charger de nouveaux) et aucun pod supplĂ©mentaire (kubelet ne peut pas demander de mises Ă  jour).

Pire encore, si Kubernetes ne peut pas voir un nƓud, il le marque comme orphelin et distribue les pods manquants aux nƓuds existants.

En conséquence, vous disposez de deux fois plus de pods.

Si vous crĂ©ez un serveur maĂźtre par rĂ©gion, il y aura des problĂšmes avec l'algorithme de consensus dans la base de donnĂ©es etcd. (environ. Ă©d. - En effet, la base de donnĂ©es etcd n'a pas besoin d'ĂȘtre localisĂ©e sur les serveurs maĂźtres. Il peut ĂȘtre exĂ©cutĂ© sur un groupe distinct de serveurs dans la mĂȘme rĂ©gion. Cependant, ayant reçu en mĂȘme temps un point de dĂ©faillance d'un cluster. Mais rapidement.)

etcd utilise algorithme de radeaupour se mettre d'accord sur une valeur avant de l'écrire sur le disque.
Autrement dit, la plupart des instances doivent parvenir Ă  un consensus avant que l'Ă©tat puisse ĂȘtre Ă©crit dans etcd.

Si la latence entre les instances etcd monte en flÚche, comme c'est le cas avec trois instances etcd dans différentes régions, il faut beaucoup de temps pour se mettre d'accord sur une valeur et l'écrire sur le disque.
Cela se reflÚte également dans les contrÎleurs Kubernetes.

Le responsable du contrÎleur a besoin de plus de temps pour prendre connaissance du changement et écrire la réponse dans la base de données.

Et comme le contrÎleur n'est pas un, mais plusieurs, une réaction en chaßne est obtenue et l'ensemble du cluster commence à fonctionner trÚs lentement.

etcd est si sensible Ă  la latence que la documentation officielle recommande d'utiliser un SSD au lieu de disques durs classiques.

Il n’existe actuellement aucun bon exemple de grand rĂ©seau pour un seul cluster.

Fondamentalement, la communautĂ© des dĂ©veloppeurs et le groupe SIG-cluster tentent de comprendre comment orchestrer les clusters de la mĂȘme maniĂšre que Kubernetes orchestre les conteneurs.

Option 1 : fĂ©dĂ©rer les clusters avec kubefed

Réponse officielle du cluster SIG - kubefed2, une nouvelle version du client et opérateur original de Kube Federation.

Pour la premiÚre fois, nous avons essayé de gérer une collection de clusters comme un seul objet à l'aide de l'outil de fédération Kube.

Le début était bon, mais à la fin, la fédération Kube n'est pas devenue populaire, car elle ne prenait pas en charge toutes les ressources.

Il prenait en charge les fournitures et services fédérés, mais pas les StatefulSets, par exemple.
De plus, la configuration de la fédération a été transmise sous forme d'annotations et n'était pas flexible.

Imaginez comment vous pouvez décrire la division des réplicas pour chaque cluster dans une fédération à l'aide d'une seule annotation.

Cela s’est avĂ©rĂ© ĂȘtre un dĂ©sastre total.

Le cluster SIG a fait un excellent travail aprÚs Kubefed v1 et a décidé d'aborder le problÚme sous un angle différent.

Au lieu d'annotations, ils ont dĂ©cidĂ© de publier un contrĂŽleur installĂ© sur des clusters. Il peut ĂȘtre configurĂ© Ă  l'aide de dĂ©finitions de ressources personnalisĂ©es (Custom Resource Definition, CRD).

Pour chaque ressource qui sera fĂ©dĂ©rĂ©e, vous disposez d'une dĂ©finition CRD personnalisĂ©e en trois sections :

  • une dĂ©finition standard d'une ressource, telle que dĂ©ployer ;
  • section placement, oĂč vous dĂ©finissez comment la ressource sera distribuĂ©e dans la fĂ©dĂ©ration ;
  • section override, oĂč pour une ressource spĂ©cifique, vous pouvez remplacer le poids et les paramĂštres du placement.

Voici un exemple de livraison combinée avec des sections de placement et de remplacement.

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: 5

Comme vous pouvez le constater, l’offre est divisĂ©e en deux clusters : cluster1 Đž cluster2.

Le premier cluster fournit trois réplicas et le second a une valeur de 5.

Si vous avez besoin de plus de contrĂŽle sur le nombre de rĂ©plicas, kubefed2 fournit un nouvel objet ReplicaSchedulingPreference dans lequel les rĂ©plicas peuvent ĂȘtre pondĂ©rĂ©s :

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: 2

La structure du CRD et l'API ne sont pas encore tout Ă  fait prĂȘtes et un travail actif est en cours dans le rĂ©fĂ©rentiel officiel du projet.

Gardez un Ɠil sur kubefed2, mais gardez à l'esprit qu'il n'est pas encore assez performant pour un environnement de production.

En savoir plus sur kubefed2 à partir de article officiel sur kubefed2 sur le blog Kubernetes et dépÎt officiel du projet kubefed.

Option 2 : regroupement du style Booking.com

Les développeurs de Booking.com n'ont pas traité de Kubefed v2, mais ils ont proposé Shipper, un opérateur de livraison sur plusieurs clusters, plusieurs régions et plusieurs cloud.

Expéditeur un peu similaire à kubefed2.

Les deux outils vous permettent de personnaliser votre stratégie de déploiement multicluster (quels clusters sont utilisés et combien de réplicas ils possÚdent).

Mais L'objectif de l'expéditeur est de réduire les risques d'erreurs lors de la livraison.

Dans Shipper, vous pouvez définir une série d'étapes qui décrivent la répartition des réplicas entre les déploiements précédent et actuel ainsi que la quantité de trafic entrant.

Lorsque vous transférez une ressource vers un cluster, le contrÎleur Shipper déploie progressivement cette modification sur tous les clusters fédérés.

L'expéditeur est également trÚs limité.

Par exemple, il prend les cartes Helm en entrée et ne prend pas en charge les ressources Vanilla.
De maniÚre générale, Shipper fonctionne comme suit.

Au lieu d'une distribution standard, vous devez crĂ©er une ressource d'application qui inclut un graphique Helm :

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: 3

Shipper est une bonne option pour gĂ©rer plusieurs clusters, mais sa relation Ă©troite avec Helm ne fait que gĂȘner.

Et si nous passions tous de Helm Ă  personnaliser ou kapitan?

Apprenez-en davantage sur Shipper et sa philosophie sur ce communiqué de presse officiel.

Si vous voulez fouiller dans le code, aller au dépÎt officiel du projet.

Option 3 : fusion de clusters « magique Â»

Kubefed v2 et Shipper fonctionnent avec la fédération de clusters, fournissant de nouvelles ressources aux clusters via une définition de ressources personnalisée.

Mais que se passe-t-il si vous ne souhaitez pas réécrire toutes les diffusions, StatefulSets, DaemonSets, etc. pour les fusionner ?

Comment inclure un cluster existant dans une fédération sans changer YAML ?

multi-cluster-scheduler est un projet Admirality, qui traite de la planification des charges de travail sur les clusters.

Mais au lieu d'inventer une nouvelle façon d'interagir avec le cluster et d'encapsuler les ressources dans des définitions personnalisées, le planificateur multi-cluster est injecté dans le 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 factice.

utilisations du planificateur multi-cluster webhooks pour modifier l'accÚspour intercepter l'appel et créer un pod factice inactif.

Le module d'origine passe par un autre cycle de planification au cours duquel, aprÚs avoir interrogé l'ensemble de la fédération, une décision d'hébergement est prise.

Enfin, le pod est livré au cluster cible.

En consĂ©quence, vous disposez d’un pod supplĂ©mentaire qui ne fait rien, prend juste de la place.

L'avantage est que vous n'avez pas besoin d'écrire de nouvelles ressources pour combiner les fournitures.

Chaque ressource qui crĂ©e un pod est automatiquement prĂȘte Ă  ĂȘtre fĂ©dĂ©rĂ©e.

C’est intĂ©ressant, car vous avez soudain des approvisionnements rĂ©partis dans plusieurs rĂ©gions, et vous ne vous en ĂȘtes pas rendu compte. C’est cependant assez risquĂ©, car ici tout repose sur la magie.

Mais alors que Shipper tente principalement d’attĂ©nuer les effets des expĂ©ditions, le planificateur multi-cluster est plus gĂ©nĂ©ral et peut-ĂȘtre mieux adaptĂ© aux tĂąches par lots.

Il ne dispose pas d’un mĂ©canisme avancĂ© de livraison progressive.

Pour en savoir plus sur le planificateur multi-cluster, consultez page du référentiel officiel.

Si vous souhaitez en savoir plus sur le planificateur multi-cluster en action, Admiralty a cas d'utilisation intéressant avec Argo - workflows, événements, CI et CD Kubernetes.

Autres outils et solutions

La connexion et la gestion de plusieurs clusters sont une tĂąche complexe et il n'existe pas de solution universelle.

Si vous souhaitez approfondir ce sujet, voici quelques ressources :

C'est tout pour aujourd'hui

Merci d'avoir lu jusqu'au bout !

Si vous savez comment connecter plus efficacement plusieurs clusters, dites-nous.

Nous ajouterons votre méthode aux liens.

Un merci spécial à Chris Nesbitt-Smith (Chris Nesbitt Smith) et Vincent de PME (Vincent De Smet) (à l'ingénieur fiabilité de swatmobile.io) pour avoir lu l'article et partagé des informations utiles sur le fonctionnement de la fédération.

Source: habr.com

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster