Hur man kopplar samman Kubernetes-kluster i olika datacenter

Hur man kopplar samman Kubernetes-kluster i olika datacenter
VÀlkommen till en serie korta vÀgledningar om Kubernetes. Detta Àr en regelbunden kolumn med de mest intressanta frÄgorna som vi fÄr online och under vÄra utbildningar. Svaren ges av en expert pÄ Kubernetes.

Dagens expert Àr Daniele Polencic (Daniele Polencic). Daniele arbetar som instruktör och mjukvaruutvecklare pÄ Learnk8s.

Om du vill fÄ svar pÄ din frÄga i nÀsta inlÀgg, kontakta oss via e-post eller i Twitter: @learnk8s.

Missade du tidigare inlÀgg? Sök efter dem hÀr.

Hur kopplar man samman Kubernetes-kluster i olika datacenter?

Kortfattat: snart lanseras Kubefed v2, och jag rekommenderar ocksÄ att lÀsa om Shipper och -projektet multi-cluster-scheduler..

Ofta replikeras och distribueras infrastrukturen över olika regioner, sÀrskilt i kontrollerade miljöer.

Om en region inte Àr tillgÀnglig, omdirigeras trafiken till en annan för att undvika avbrott.

Med Kubernetes kan du anvÀnda en liknande strategi och fördela arbetsbelastningar över olika regioner.

Du kan ha ett eller flera kluster per team, region, miljö eller en kombination av dessa.

Dina kluster kan vara vÀrd i olika moln och i lokala miljöer.

Men hur planerar man infrastrukturen för sÄ stor geografisk spridning?
Ska man skapa ett stort kluster över flera moln i ett enhetligt nÀtverk?
Eller skapa mÄnga smÄ kluster och hitta sÀtt att kontrollera och synkronisera dem?

Ett ledande kluster

Att skapa ett kluster i ett enhetligt nÀtverk Àr inte sÄ enkelt.

TÀnk dig att du har en krasch, förbindelsen mellan klustersegmenten har förlorats.

Om du har en enda master-server kan hÀlften av resurserna inte ta emot nya kommandon eftersom de inte kan nÄ master-servern.

Och med gamla routingtavlor (kube-proxy kan inte ladda nya) och inga extra poddar (kubelet kan inte begÀra uppdateringar).

Ännu vĂ€rre, om Kubernetes inte ser en nod, markerar den den som förlorad och distribuerar de saknade poddarna till befintliga noder.

Resultatet blir att du har dubbelt sÄ mÄnga poddar.

Om du har en master-server för varje region kan det uppstĂ„ problem med algoritmen för att nĂ„ konsensus i databasen etcd.Obs. red. — Faktum Ă€r att etcd-databasen inte nödvĂ€ndigtvis behöver befinna sig pĂ„ master-servrarna. Den kan köras pĂ„ en separat grupp servrar i samma region. Men dĂ„ fĂ„r man en sĂ„rbar punkt i klustret. Å andra sidan gĂ„r det snabbt.)

etcd anvÀnder raft-algoritmen, för att enas om ett vÀrde innan det skrivs till disk.
Det vill sÀga, de flesta instanser mÄste nÄ enighet innan tillstÄndet kan skrivas till etcd.

Om fördröjningen mellan etcd-instanser ökar kraftigt, som i fallet med tre etcd-instanser i olika regioner, tar det lÄng tid att enas om vÀrdet och skriva det till disk.
Det Äterspeglas ocksÄ pÄ Kubernetes-kontrollerna.

Kontrollernas manager behöver mer tid för att fÄ reda pÄ en Àndring och skriva svaret till databasen.

Och eftersom det inte bara finns en kontrollant utan flera, blir det en kedjereaktion, och hela klustret börjar arbeta mycket lÄngsamt..

etcd Àr sÄ kÀnslig för fördröjning att den officiella dokumentationen rekommenderar att anvÀnda SSD istÀllet för vanliga hÄrddiskar..

Det finns för nÀrvarande inga bra exempel pÄ ett stort nÀtverk för ett enda kluster.

I huvudsak försöker utvecklarsamhÀllet och SIG-cluster-gruppen förstÄ hur man orkestrerar kluster pÄ samma sÀtt som Kubernetes orkestrerar containrar.

Alternativ 1: klusterfederation med kubefed

Det officiella svaret frÄn SIG-cluster Àr: kubefed2, den nya versionen av den ursprungliga klienten och operatören för kube federation..

Att för första gÄngen försöka hantera en samling kluster som ett enda objekt skedde med hjÀlp av verktyget kube federation.

Det började bra, men i slutÀndan blev kube federation aldrig populÀrt eftersom det inte stödde alla resurser.

Det stödde sammanslagna distributioner och tjÀnster, men till exempel inte StatefulSets.
Och dessutom överfördes konfigurationen för federation som anteckningar och saknade flexibilitet.

TÀnk dig hur man skulle kunna beskriva uppdelningen av repliker för varje kluster i federationen med hjÀlp av enbart anteckningar.

Det blev en total röra.

SIG-cluster gjorde ett stort arbete efter kubefed v1 och beslutade att ta itu med problemet frÄn ett annat hÄll.

IstÀllet för anteckningar bestÀmde de sig för att slÀppa en kontroller som installeras pÄ klustren. Den kan konfigureras med hjÀlp av anpassade resursdefinitioner (Custom Resource Definition, CRD).

För varje resurs som kommer att ingÄ i federation har du en anpassad CRD-definition med tre sektioner:

  • standardresursdefinition, till exempel en deployment;
  • med pseudoklassomkopplare placement, dĂ€r du definierar hur resursen ska distribueras i federation;
  • med pseudoklassomkopplare override, dĂ€r du kan Ă„sidosĂ€tta vikt och parametrar frĂ„n placement för en specifik resurs.

HÀr Àr ett exempel pÄ en samlad distribution med platser och överskrivningar.

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

Som du ser, Àr distributionen fördelad över tvÄ kluster: cluster1 och cluster2.

Det första klustret tillhandahÄller tre repliker, medan det andra Àr angivet med vÀrdet 5.

Om du behöver mer kontroll över antalet repliker, erbjuder kubefed2 ett nytt objekt ReplicaSchedulingPreference, dÀr repliker kan fördelas efter vikt:

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

Strukturen för CRD och API Àr fortfarande inte helt fÀrdiga, och det pÄgÄr aktivt arbete i projektets officiella repository.

HÄll koll pÄ kubefed2, men kom ihÄg att det fortfarande inte Àr lÀmpligt för produktionsmiljöer.

LÀs mer om kubefed2 i den officiella artikeln om kubefed2 i bloggen om Kubernetes och i den officiella repository för projektet kubefed.

Alternativ 2: Sammanfogning av kluster i Booking.com-stil

Utvecklarna av Booking.com har inte arbetat med kubefed v2, men de har utvecklat Shipper – en operatör för distribution över flera kluster, i flera regioner och i flera moln.

Shipper som liknar kubefed2.

BÄda verktygen möjliggör konfiguration av distributionsstrategi över flera kluster (vilka kluster som anvÀnds och hur mÄnga repliker de har).

Men MÄlet med Shipper Àr att minska risken för fel vid distribution.

I Shipper kan du definiera en serie steg som beskriver fördelningen av repliker mellan den tidigare och aktuella deployment samt mÀngden inkommande trafik.

NÀr du skickar en resurs till ett kluster, distribuerar Shipper stegvis denna Àndring över alla sammanfogade kluster.

Och dessutom Àr Shipper mycket begrÀnsad.

Till exempel, den tar emot Helm-diagram som ingÄngsdata. och stöder inte vanilla-resurser.
I allmÀnhet fungerar Shipper pÄ följande sÀtt.

IstÀllet för standardleverans mÄste du skapa en applikationsresurs som inkluderar en Helm-diagram:

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 Àr ett bra alternativ för att hantera flera kluster, men dess nÀra koppling till Helm gör bara saken svÄrare.

Men vad hÀnder om vi alla gÄr över frÄn Helm till kustomize eller kapitan?

LĂ€s mer om Shipper och dess filosofi i detta officiella pressmeddelande.

Om du vill grÀva i koden, gÄ till det officiella projektförrÄdet.

Alternativ 3: "magisk" sammanslagning av kluster

Kubefed v2 och Shipper fungerar med federering av kluster, vilket tillhandahÄller nya resurser till kluster genom anvÀndardefinierade resurser.

Men tÀnk om du inte vill skriva om alla leveranser, StatefulSets, DaemonSets osv. för sammanslagning?

Hur man inkluderar ett befintligt kluster i federeringen utan att Àndra YAML?

multi-cluster-scheduler Àr ett projekt frÄn Admirality, som arbetar med arbetsbelastningar för schemalÀggning i kluster.

Men istÀllet för att hitta pÄ ett nytt sÀtt att interagera med klustret och bevara resurser i anvÀndardefinitioner, integreras multi-cluster-scheduler i den standardiserade livscykeln för Kubernetes och fÄngar alla anrop som skapar pods.

Varje skapad pod ersÀtts omedelbart med en dummy.

multi-cluster-scheduler anvÀnder webhooks för att modifiera Ätkomsten, för att fÄnga anropet och skapa en inaktiv pod-dummy.

Den ursprungliga podden gÄr genom ytterligare en schemalÀggningscykel, dÀr beslut om placering fattas efter att hela federationen har förfrÄgats.

Till slut levereras podden till det mÄlinriktade klustret.

Som ett resultat har du en extra podd som inte gör nÄgot, bara tar upp plats.

Fördelen Àr att du inte behövde skriva nya resurser för att slÄ samman leveranser.

Varje resurs som skapar en pod Àr automatiskt redo för sammanslagning.

Det Àr intressant, eftersom du plötsligt fÄr leveranser spridda över flera regioner, utan att du ens mÀrker det. Men det Àr ganska riskabelt, eftersom allt hÀr vilar pÄ magi.

Men om Shipper försöker i huvudsak mildra konsekvenserna av leveranser, utför multi-cluster-scheduler mer övergripande uppgifter och kan vara bÀttre lÀmpad för paketuppdrag.

Det har ingen avancerad mekanism för gradvisa leveranser.

Mer om multi-cluster-scheduler kan du lÀsa pÄ den officiella repositoriets sida.

Om du vill lĂ€sa om multi-cluster-scheduler i praktiken, har Admiralty en intressant anvĂ€ndningsfall med Argo — arbetsflöden, hĂ€ndelser, CI och CD i Kubernetes.

Andra verktyg och lösningar

Att koppla samman flera kluster och hantera dem Àr en svÄr uppgift, det finns ingen universell lösning.

Om du vill fördjupa dig i detta Àmne, hÀr Àr nÄgra resurser:

Det Àr allt för idag.

Jag försökte att inte skriva för mycket, men ÀndÄ blev artikeln enligt min Äsikt ganska lÄng. De andra funktionerna i unRAID Àr enligt min Äsikt ganska enkla att konfigurera, sÀrskilt eftersom allt stÀlls in med mus.

Om du vet ett effektivare sÀtt att koppla samman flera kluster, berÀtta för oss..

Vi lÀgger till ditt sÀtt bland lÀnkarna.

Ett sÀrskilt tack till Chris Nesbitt-Smith (Chris Nesbitt-Smith) och Vincent De Smet (Vincent De Smet) (reliability engineer pÄ swatmobile.io) för att de lÀste artikeln och delade anvÀndbar information om hur federation fungerar.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster