Cumu cunnetta i clusters Kubernetes in diversi centri di dati

Cumu cunnetta i clusters Kubernetes in diversi centri di dati
Benvenuti à a Serie Quick Start Kubernetes. Questa hè una colonna regulare cù e dumande più interessanti chì ricevemu in linea è in i nostri furmazioni. Risposte di l'esperti di Kubernetes.

L'espertu oghje hè Daniel Polenchik (Daniele Polencic). Daniel travaglia cum'è istruttore è sviluppatore di software in Learnk8s.

Se vulete una risposta à a vostra dumanda in u prossimu post, cuntattateci per email o Twitter: @learnk8s.

Avete mancatu i posti precedenti? Cercateli quì.

Cumu cunnette i cluster Kubernetes in diversi centri di dati?

Brevemente: Kubefed v2 prestu prestu, è vi cunsigliu ancu di leghje Speditore и prughjettu multi-cluster-scheduler.

Piuttostu spessu, l'infrastruttura hè replicata è distribuita in diverse regioni, in particulare in ambienti cuntrullati.

Se una regione ùn hè micca dispunibile, u trafficu hè ridirettu à l'altru per evità interruzioni.

Cù Kubernetes, pudete aduprà una strategia simile è distribuisce carichi di travagliu in diverse regioni.

Pudete avè unu o più clusters per squadra, regione, ambiente, o una cumminazione di questi.

I vostri clusters ponu esse ospitati in parechje nuvole è in situ.

Ma cumu pianificà l'infrastruttura per una tale diffusione geografica?
Avete bisognu di creà un grande cluster per parechji ambienti nuvola nantu à una sola reta?
O avete parechji picculi clusters è truvate un modu per cuntrullà è sincronizà?

Un cluster di dirigenza

Crià un cluster nantu à una sola reta ùn hè micca cusì faciule.

Immaginate chì avete un accidente, a cunnessione trà i segmenti di cluster hè persa.

Sì avete un servitore maestru, a mità di e risorse ùn puderanu micca riceve novi cumandamenti perchè ùn puderanu micca cuntattà u maestru.

È à u stessu tempu avete vechji tabelle di routing (kube-proxy ùn pò micca scaricà novi) è senza pods supplementari (kubelet ùn pò micca dumandà l'aghjurnamenti).

Ancu peggiu, se Kubernetes ùn pò micca vede un node, u marca cum'è orfanu è distribuisce pods mancanti à i nodi esistenti.

In u risultatu, avete duie volte più pods.

Se fate un servitore maestru per regione, ci saranu prublemi cù l'algoritmu di cunsensu in a basa di dati etcd. (ca. ed. - In fatti, a basa di dati etcd ùn deve esse situatu nantu à i servitori maestri. Pò esse eseguitu nantu à un gruppu separatu di servitori in a listessa regione. Tuttavia, avè ricevutu à u listessu tempu un puntu di fallimentu di un cluster. Ma prestu.)

eccd usa algoritmu di raftd'accordu nantu à un valore prima di scrivellu à u discu.
Questu hè, a maiò parte di i casi deve ghjunghje à un cunsensu prima chì u statu pò esse scrittu à etcd.

Se a latenza trà l'istanze di etcd cresce, cum'è u casu cù trè istanze di etcd in diverse regioni, ci vole assai tempu per accunsentà un valore è scrive à u discu.
Questu hè riflessu ancu in i cuntrolli Kubernetes.

U gestore di u controller hà bisognu di più tempu per amparà u cambiamentu è scrive a risposta à a basa di dati.

È postu chì u controller ùn hè micca unu, ma parechji, una reazione in catena hè ottenuta, è tuttu u cluster cumencia à travaglià assai pianu.

etcd hè cusì sensibile à a latenza chì a documentazione ufficiale ricumanda di utilizà un SSD invece di i discu duru regulare.

Attualmente ùn ci sò micca boni esempi di una grande reta per un cluster unicu.

In fondu, a cumunità di sviluppatori è u gruppu SIG-cluster cercanu di capisce cumu orchestrate clusters in u listessu modu chì Kubernetes orchestra i cuntenituri.

Opzione 1: federate clusters cù kubefed

Risposta ufficiale da SIG-cluster - kubefed2, una nova versione di u cliente è operatore di federazione kube originale.

Per a prima volta, avemu pruvatu à gestisce una cullizzioni di clusters cum'è un oggettu unicu utilizendu l'uttellu di federazione kube.

U principiu era bonu, ma à a fine, a federazione kube ùn hè micca diventata populari, perchè ùn sustene micca tutte e risorse.

Supportava forniture è servizii federati, ma micca StatefulSets, per esempiu.
Inoltre, a cunfigurazione di a federazione hè stata passata in forma di annotazioni è ùn era micca flexible.

Imagine cumu pudete descriverà a divisione di repliche per ogni cluster in una federazione utilizendu una sola annotazione.

Risultava esse un disordine cumpletu.

SIG-cluster hà fattu un bellu travagliu dopu à kubefed v1 è hà decisu di avvicinà u prublema da un altru angulu.

Invece di annotazioni, anu decisu di liberà un controller chì hè stallatu in clusters. Pò esse cunfiguratu utilizendu definizioni di risorse persunalizate (Definizione di Risorse Personalizzate, CRD).

Per ogni risorsa chì serà federata, avete una definizione CRD persunalizata in trè sezioni:

  • una definizione standard di una risorsa, cum'è implementazione;
  • rùbbrica placement, induve definisce cumu a risorsa serà distribuita in a federazione;
  • rùbbrica override, induve per una risorsa specifica pudete annullà u pesu è i paràmetri da a piazza.

Eccu un esempiu di una spedizione in bundle cù e sezioni di piazzamentu è di 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: 5

Comu pudete vede, l'offerta hè divisa in dui gruppi: cluster1 и cluster2.

U primu cluster furnisce trè repliche, è u sicondu hà un valore di 5.

Se avete bisognu di più cuntrollu di u numeru di rèpliche, kubefed2 furnisce un novu oggettu ReplicaSchedulingPreference induve e rèpliche ponu esse ponderate:

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

A struttura CRD è l'API ùn sò micca pronti ancu, è u travagliu attivu hè in corso in u repositoriu ufficiale di u prugettu.

Mantene un ochju per kubefed2, ma tenite in mente chì ùn hè ancu abbastanza bè per un ambiente di produzzione.

Sapete più nantu à kubefed2 da articulu ufficiale nantu à kubefed2 nant'à u blog Kubernetes è repository ufficiale di u prughjettu kubefed.

Opzione 2: Clustering Booking.com Style

I sviluppatori di Booking.com ùn anu micca trattatu di kubefed v2, ma sò ghjunti cù Shipper, un operatore per a spedizione in parechje clusters, multiple regioni è parechje nuvole.

Speditore un pocu simile à kubefed2.

I dui strumenti permettenu di persunalizà a vostra strategia di implementazione multi-cluster (chì clusters sò utilizati è quante repliche anu).

ma U travagliu di u speditore hè di riduce u risicu di errore di consegna.

In Shipper, pudete definisce una seria di passi chì descrizanu a divisione di repliche trà e implementazioni precedenti è attuali è a quantità di trafficu entrante.

Quandu spinghjate una risorsa à un cluster, u controller di speditore implementa in modu incrementale quellu cambiamentu in tutti i cluster federati.

Inoltre, u trasportatore hè assai limitatu.

Per esempiu, pigghia i charts Helm cum'è input è ùn sustene micca e risorse di vaniglia.
In termini ginirali, u speditore travaglia cum'è seguitu.

Invece di una distribuzione standard, avete bisognu di creà una risorsa di l'applicazione chì include un graficu 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

U trasportatore hè una bona opzione per a gestione di più clusters, ma a so stretta relazione cù Helm si mette solu in u modu.

E si passassi tutti da Helm à persunalizà o capitanu?

Sapete più nantu à Shipper è a so filosofia à stu comunicatu di stampa ufficiale.

Se vulete scavà in u codice, andate à u repositoriu ufficiale di u prugettu.

Opzione 3: fusione di cluster "magic".

Kubefed v2 è Shipper travaglianu cù a federazione di clusters fornendu novi risorse à i clusters attraversu una definizione di risorse persunalizata.

Ma chì s'è vo ùn vulete riscrive tutti i pruvisti, StatefulSets, DaemonSets, etc.

Cumu include un cluster esistente in a federazione senza cambià YAML?

multi-cluster-scheduler hè un prughjettu Admirality, chì tratta di scheduling workloads in clusters.

Ma invece di inventà un novu modu d'interagisce cù u cluster è di imballà e risorse in definizioni persunalizate, u multi-cluster-scheduler hè injectatu in u ciclu di vita standard di Kubernetes è intercepta tutte e chjama chì creanu pods.

Ogni poda creata hè immediatamente rimpiazzata cù un manichinu.

usi multi-cluster-scheduler ganci web per mudificà l'accessuper interceptà a chjama è creà un pod dummy inattivu.

U pod originale passa per un altru ciclu di scheduling induve, dopu a votazione di l'intera federazione, una decisione di hosting hè presa.

Infine, u pod hè furnitu à u cluster di destinazione.

In u risultatu, avete un pod extra chì ùn faci nunda, solu occupa u spaziu.

U vantaghju hè chì ùn avete micca bisognu di scrive novi risorse per cumminà pruvisti.

Ogni risorsa chì crea un pod hè automaticamente pronta per esse federata.

Questu hè interessante, perchè di colpu avete pruvisti distribuiti in parechje regioni, è ùn avete micca avvistatu. Tuttavia, questu hè abbastanza risicatu, perchè quì tuttu si basa nantu à a magia.

Ma mentre u Speditore prova principalmente di mitigà l'effetti di e spedizioni, u multi-cluster-scheduler hè più generale è forse più adattatu per i travaglii in batch.

Ùn hà micca un mecanismu avanzatu di consegna graduale.

Più nantu à u multi-cluster-scheduler pò esse truvatu à pagina ufficiale di repository.

Se vulete leghje nantu à u multi-cluster-scheduler in azzione, Admiralty hà interessante casu d'usu cù Argo - flussi di travagliu, eventi, CI è CD Kubernetes.

Altri arnesi è suluzione

A cunnessione è a gestione di più clusters hè un compitu cumplessu, è ùn ci hè una soluzione unica per tutti.

Se vulete sapè più nantu à questu tema, eccu alcune risorse:

Hè tuttu per oghje

Grazie per leghje finu à a fine!

Se sapete cumu cunnetta in modu più efficiente parechji clusters, dicci.

Avemu aghjunghje u vostru metudu à i ligami.

Un ringraziu speciale à Chris Nesbitt-Smith (Chris Nesbitt-Smith) e Vincent de Sme (Vincent De Smet) (à l'ingegnere di affidabilità in swatmobile.io) per leghje l'articulu è sparte infurmazioni utili nantu à cumu funziona a federazione.

Source: www.habr.com

Add a comment