Velkommen til en rekke korte guider om Kubernetes. Dette er en regelmessig spalte med de mest interessante spÞrsmÄlene vi fÄr online og pÄ vÄre kurs. Svar fra Kubernetes-ekspert.
Dagens ekspert er Daniele Polencic (). Daniele jobber som instruktĂžr og programvareutvikler hos .
Hvis du vil ha svar pÄ spÞrsmÄlet ditt i neste innlegg, eller inn i .
Gikk du glipp av de forrige innleggene? .
Hvordan koble Kubernetes-klynger i forskjellige datasentre?
Kort sagt: , og jeg anbefaler Ă„ lese om og .
Det er ganske vanlig at infrastrukturen replikeres og distribueres over forskjellige regioner, spesielt i kontrollerte miljĂžer.
Hvis én region gÄr ned, blir trafikken omdirigert til en annen for Ä unngÄ avbrudd.
Med Kubernetes kan vi bruke en lignende strategi og fordele arbeidsbelastninger over forskjellige regioner.
Du kan ha én eller flere klynger per team, region, miljÞ, eller en kombinasjon av disse elementene.
Klyngene dine kan vĂŠre plassert i forskjellige skyer og i lokale miljĂžer.
Men hvordan planlegger du infrastrukturen for sÄ stort geografisk spredning?
Burde du opprette én stor klynge over flere skymiljÞer med ett felles nettverk?
Eller opprette mange smÄ klynger og finne en mÄte Ä administrere og synkronisere dem pÄ?
Ăn styrende klynge
à opprette én klynge med ett felles nettverk er ikke sÄ enkelt.
Tenk deg at du har en feil, og tilkoblingen mellom segmentene av klyngen er tapt.
Hvis du har én master-server, vil halve ressursene ikke kunne motta nye kommandoer fordi de ikke kan kontakte masteren.
Og da har du gamle rutetabeller (kube-proxy kan ikke laste inn nye) og ingen ekstra pod-er (kubelet kan ikke be om oppdateringer).
Hva verre er, hvis Kubernetes ikke ser noden, merker den den som tapt og fordeler manglende pod-er til eksisterende noder.
Resultatet er at du ender opp med dobbelt sÄ mange pod-er.
Hvis du lager Ă©n master-server i hver region, vil det oppstĂ„ problemer med algoritmen for Ă„ oppnĂ„ konsensus i etcd-databasen.red. â Faktisk trenger ikke etcd-databasen Ă„ vĂŠre pĂ„ master-serverne. Den kan kjĂžres pĂ„ en egen gruppe servere i Ă©n region. Men dette fĂžrer til et punktsvikt i klyngen. PĂ„ den positive siden gĂ„r det raskt.)
etcd bruker , for Ä oppnÄ konsensus fÞr verdien skrives til disk.
Det vil si at flertallet av instansene mÄ bli enige fÞr tilstanden kan skrives til etcd.
Hvis forsinkelsen mellom etcd-instansene Þker betydelig, slik som med tre etcd-instanser i forskjellige regioner, tar det lang tid Ä oppnÄ konsensus og skrive verdien til disk.
Dette gjenspeiles ogsÄ i Kubernetes-kontrollere.
Kontrollereren trenger mer tid for Ă„ registrere endringen og skrive svaret til databasen.
Og siden det ikke bare er én, men flere controllere, blir det en kjedereaksjon, og hele klyngen begynner Ä fungere veldig sakte..
etcd er sÄ sensitivt for forsinkelse at .
Det finnes for Þyeblikket ikke gode eksempler pÄ store nettverk for én klynge.
Hovedsakelig prÞver fellesskapet av utviklere og SIG-cluster-gruppen Ä finne ut hvordan man skal orkestrere klynger pÄ samme mÄte som Kubernetes orkestrerer containere.
Alternativ 1: klyngefederasjon med kubefed
Det offisielle svaret fra SIG-cluster er .
For fĂžrste gang prĂžvde man Ă„ administrere en samling klynger som ett objekt med hjelp av verktĂžyet kube federation.
Starten var god, men til slutt ble kube federation ikke populĂŠrt fordi det ikke stĂžttet alle ressurser.
Det stĂžttet sammenflettede forsyninger og tjenester, men for eksempel ikke StatefulSets.
I tillegg ble konfigurasjonen av fedreasjonen levert som annotasjoner og var ikke spesielt fleksibel.
Tenk deg hvordan man kan beskrive replikeringsdeling for hver klynge i fedreasjonen med bare annotasjoner.
Det ble et fullstendig kaos.
SIG-cluster har gjort et stort arbeid etter kubefed v1 og besluttet Ă„ nĂŠrme seg problemet fra en annen vinkel.
I stedet for annotasjoner besluttet de Ä utgi en kontroller som installeres pÄ klyngene. Den kan konfigureres ved hjelp av Custom Resource Definition (CRD).
For each resource that will be part of the federation, you have a custom CRD definition consisting of three sections:
- the standard resource definition, such as a deployment;
- med bryteren for pseudoklassen
placement, where you define how the resource will be distributed within the federation; - med bryteren for pseudoklassen
override, where the weight and parameters from placement can be overridden for a specific resource.
Here's an example of a federated deployment with placement and override sections.
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: 5As you can see, the deployment is distributed across two clusters: cluster1 og cluster2.
The first cluster provides three replicas, while the second has a value of 5.
If you need more control over the number of replicas, kubefed2 offers a new object called ReplicaSchedulingPreference, where replicas can be distributed by weight:
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: 2The CRD structure and API are not quite ready, and active work is ongoing in the official project repository.
Keep an eye on kubefed2, but remember that it is not suitable for production environments yet.
Learn more about kubefed2 from in the Kubernetes blog and in .
Option 2: merging clusters in the style of Booking.com
Developers at Booking.com did not work on kubefed v2, but they created Shipper â an operator for deployment across multiple clusters, across various regions and clouds.
similar to kubefed2.
Both tools allow you to configure a deployment strategy across multiple clusters (which clusters are used and how many replicas they have).
Men The task of Shipper is to minimize the risk of errors during deployment.
In Shipper, you can define a series of steps that describe the distribution of replicas between the previous and current deployment and the volume of incoming traffic.
When you send a resource to a cluster, the Shipper controller gradually rolls out this change across all federated clusters.
Moreover, Shipper is very limited.
For eksempel, it accepts Helm charts as input. og ikkje stĂžttar vanilla ressursar.
Generelt fungerer Shipper slik:
I staden for standard levering, mÄ du opprette ei applikasjonsressurs som inkluderer ein 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 er ein god lĂžysing for Ă„ administrere fleire klynger, men den tette forbindelsen til Helm kan vere ein hindring.
Kva om vi alle gÄr frÄ Helm til eller ?
LĂŠr meir om Shipper og filosofien bak i .
Om du vil dykke ned i koden, .
Alternative 3: «magisk» samanslÄing av klynger
Kubefed v2 og Shipper fungerer med fĂžderasjonen av klynger og gir klyngene nye ressursar gjennom brukardefinerte ressursar.
Men kva om du ikkje vil skrive om alle leveransar, StatefulSets, DaemonSets, osv. for Ä slÄ saman?
Korleis inkludere ein eksisterande klynge i fĂžderasjonen utan Ă„ endre YAML?
, som handterer planlegging av arbeidslastar i klynger.
Men i staden for Ä finne opp ein ny mÄte Ä interagere med klyngen pÄ og pakke ressursar inn i brukardefinerte definisjonar, integrerer multi-cluster-scheduler seg i den vanlege livssyklus-prosedyrane til Kubernetes og fanger alle kall som opprettar poddar.
Kvar pod som blir oppretta, blir straks erstatta med ein plassholder.
multi-cluster-scheduler bruker , for Ă„ fange opp kallet og lage ein inaktiv pod-plassholder.
Den originale podden gÄr gjennom eit nytt planleggingssyklus, der det blir fatta ei avgjerd om plassering etter Ä ha spurt heile fÞderasjonen.
Til slutt blir podden levert til den mÄlretta klynga.
Resultatet er at du har ei overflĂždig podd, som ikkje gjer noko, berre tar opp plass.
Fordelen er at du slepp Ä skrive nye ressursar for Ä slÄ saman leveransane.
Kvar ressurs som opprettar ein podd, er automatisk klar til samanslÄing.
Det er interessant, for plutselig har du leveranser fordelt over flere regioner, men du har ikke lagt merke til det. Men, dette er ganske risikabelt, for her holder alt pÄ magi.
Men hvis Shipper prĂžver Ă„ dempe konsekvensene av leveransene, utfĂžrer multi-cluster-scheduler mer generelle oppgaver og kan kanskje vĂŠre bedre egnet for batch-jobber.
Den har ikke en avansert mekanisme for gradvise leveranser.
Mer om multi-cluster-scheduler kan du lese pÄ .
Hvis du vil lese om multi-cluster-scheduler i aksjon, har Admiralty et â arbeidsflyter, hendelser, CI og CD i Kubernetes.
Andre verktĂžy og lĂžsninger
Ă koble sammen flere klynger og administrere dem er en kompleks oppgave; det finnes ingen universell lĂžsning.
Hvis du vil utforske dette emnet nĂŠrmere, her er noen ressurser:
- â et verktĂžy som forbinder overlay-nettverk fra forskjellige Kubernetes-klynger.
- Detaljhandelskjeden Target bruker .
- PrĂžv Ă„ bruke IPV6 og .
- Du kan bruke service mesh, for eksempel .
- Cilium, en nettverksplugin for containere, tilbyr , som gjĂžr det mulig Ă„ kombinere flere klynger
Det er alt for i dag
Takk for at du leste helt til slutt!
Hvis du har tips om hvordan man bedre kan koble sammen flere klynger, .
Vi vil legge til metoden din til lenkene.
Spesiell takk til Chris Nesbitt-Smith () og Vincent De Smet () (reliability engineer at ) for Ă„ ha lest artikkelen og delt nyttig informasjon om hvordan federasjonen fungerer.
Kilde: habr.com
