VÄra hÀnder Àr inte till för att vara sysslolösa: ÄterstÀllning av Rook-kluster i K8s

VÄra hÀnder Àr inte till för att vara sysslolösa: ÄterstÀllning av Rook-kluster i K8s

Vi redan har diskuterat, hur/varför vi gillar Rook: det förenklar avsevÀrt arbetet med lagringslösningar i Kubernetes-kluster. Men med denna enkelhet följer ocksÄ vissa svÄrigheter. Vi hoppas att det nya materialet hjÀlper till att bÀttre förstÄ dessa svÄrigheter innan de uppstÄr.

För att göra lÀsningen mer intressant, lÄt oss börja med konsekvenser av den hypotetiska problematiken i klustret.

„Allt Ă€r förlorat!"

TÀnk dig att du en dag har konfigurerat och startat Rook i ditt K8s-kluster, och den fungerar som den ska, men vid nÄgot "underbart" ögonblick hÀnder följande:

  • Nya poddar kan inte montera RBD-bilder frĂ„n Ceph.
  • Kommandon som lsblk och df fungerar inte pĂ„ Kubernetes-noder. Detta innebĂ€r automatiskt: "nĂ„got Ă€r fel" med de monterade RBD-bilderna. De kan inte lĂ€sas, vilket tyder pĂ„ att monitorerna Ă€r otillgĂ€ngliga...
  • Ja, det finns inga fungerande monitorer i klustret. Dessutom finns det inte ens nĂ„gra poddar med OSD eller en podd MGR.

NĂ€r podden startades : bland de betydande förĂ€ndringarna i Rook 1.0.0 relaterade till Ceph, kan man notera stödet för Ceph Nautilus och möjligheten att anvĂ€nda NFS för CephFS- eller RGW-behĂ„llare. Bland annat framhĂ€vs "mognaden" av stödet för EdgeFS till beta-nivĂ„.? ĐĐ” таĐș ЎаĐČĐœĐŸ, ĐșаĐș Đ”ĐłĐŸ ĐŽĐ”ĐżĐ»ĐŸĐžĐ»Đž. ĐŸĐŸŃ‡Đ”ĐŒŃƒ? Rook-operator Ń€Đ”ŃˆĐžĐ» ŃĐŽĐ”Đ»Đ°Ń‚ŃŒ ĐœĐŸĐČыĐč ĐșластДр  КаĐș жД ĐœĐ°ĐŒ Ń‚Đ”ĐżĐ”Ń€ŃŒ ĐČĐŸŃŃŃ‚Đ°ĐœĐŸĐČоть Ń€Đ°Đ±ĐŸŃ‚Ńƒ ĐșластДра Đž ĐŽĐ°ĐœĐœŃ‹Đ” ĐČ ĐœŃ‘ĐŒ?

Först ska vi ta en mer intressant och lÄng vÀg, och göra en noggrann utredning av Rooks "inuti" och steg-för-steg ÄterstÀllning av dess komponenter. SjÀlvklart finns det en kortare och mera korrekt vÀg: att anvÀnda sÀkerhetskopior. Som bekant delas administratörer in i tvÄ typer: de som inte gör sÀkerhetskopior och de som redan gör dem... Men mer om det efter utredningen.

Lite praktik, eller den lÄnga vÀgen

LÄt oss titta pÄ och ÄterstÀlla monitorerna

SÄ vi ser pÄ listan över ConfigMap:ar: dÀr finns de som behövs för sÀkerhetskopiering rook-ceph-config och rook-config-override. De visas vid en lyckad deployment av klustret.

NB: I nya versioner, efter antagandet av denna PR, har ConfigMap:ar slutat vara en indikator pÄ framgÄngsrik distribution av klustret.

För att fortsÀtta med vÄra ÄtgÀrder behöver vi en hÄrd omstart av alla servrar dÀr monterade RBD-bilder finns (ls /dev/rbd*). Det mÄste göras via sysrq (eller "till fots" i datacentret). Detta krav beror pÄ behovet av att avmontera de monterade RBD-bilderna, vilket en vanlig omstart inte gÄr att anvÀnda för (det skulle bli misslyckat att försöka avmontera dem pÄ ett normalt sÀtt).

Teatern börjar med klÀdhÀngaren och Ceph-klustret med monitorerna. LÄt oss titta pÄ dem.

Rook monterar sÄdana entiteter i monitorpodden:

Volymer:
 rook-ceph-config:
   Typ:      ConfigMap (ett volym som fylls med en ConfigMap)
   Namn:      rook-ceph-config
 rook-ceph-mons-keyring:
   Typ:        Secret (ett volym som fylls med en Secret)
   SecretName:  rook-ceph-mons-keyring
 rook-ceph-log:
   Typ:          HostPath (ren vÀrd katalog volym)
   SökvÀg:          /var/lib/rook/kube-rook/log
 ceph-daemon-data:
   Typ:          HostPath (ren vÀrd katalog volym)
   SökvÀg:          /var/lib/rook/mon-a/data
Monteringar:
  /etc/ceph frÄn rook-ceph-config (ro)
  /etc/ceph/keyring-store/ frÄn rook-ceph-mons-keyring (ro)
  /var/lib/ceph/mon/ceph-a frÄn ceph-daemon-data (rw)
  /var/log/ceph frÄn rook-ceph-log (rw)

LÄt oss se vad som finns i hemligheten rook-ceph-mons-keyring:

typ: Secret
data:
 keyring: LongBase64EncodedString=

Vi dekodar och fÄr en vanlig keyring med rÀttigheter för administratören och monitorerna:

[mon.]
       nyckel = AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==
       rÀttigheter mon = "allow *"
[client.admin]
       nyckel = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
       rÀttigheter mds = "allow *"
       rÀttigheter mon = "allow *"
       rÀttigheter osd = "allow *"
       rÀttigheter mgr = "allow *"

Kom ihÄg det. LÄt oss nu titta pÄ keyring i hemligheten rook-ceph-admin-keyring:

typ: Secret
data:
 keyring: anotherBase64EncodedString=

Vad finns i den?

[client.admin]
       nyckel = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
       rÀttigheter mds = "allow *"
       rÀttigheter mon = "allow *"
       rÀttigheter osd = "allow *"
       rÀttigheter mgr = "allow *"

Samma. LÄt oss titta vidare
 HÀr Àr till exempel en hemlighet rook-ceph-mgr-a-keyring:

[mgr.a]
       nyckel = AQBZR19dbVeaIhBBXFYyxGyusGf8x1bNQunuew==
       rÀttigheter mon = "allow *"
       rÀttigheter mds = "allow *"
       rÀttigheter osd = "allow *"

Till slut hittar vi ytterligare nÄgra hemligheter i ConfigMap: rook-ceph-mon:

typ: Secret
data:
 admin-secret: AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
 cluster-name: a3ViZS1yb29r
 fsid: ZmZiYjliZDMtODRkOS00ZDk1LTczNTItYWY4MzZhOGJkNDJhCg==
 mon-secret: AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==

Och detta Àr den ursprungliga listan med keyringar, dÀrifrÄn alla ovan nÀmnda hemligheter hÀmtas.

Som bekant (se dataDirHostPath pÄ dokumentationen), lagrar Rook sÄdana data pÄ tvÄ stÀllen. SÄ lÄt oss gÄ till noderna för att se keyringarna som ligger i katalogerna som Àr monterade i pods med monitorer och OSD. För detta ÀndamÄl finner vi pÄ noder /var/lib/rook/mon-a/data/keyring och ser:

# cat /var/lib/rook/mon-a/data/keyring
[mon.]
       key = AXAbS19d8NNUXOBB+XyYwXqXI1asIzGcGlzMGg==
       caps mon = "allow *"

Överraskande nog visade sig den hĂ€r hemligheten vara en annan — inte som i ConfigMap.

Men vad sÀgs om admin keyring? Den finns ocksÄ hos oss:

# cat /var/lib/rook/kube-rook/client.admin.keyring
[client.admin]
       key = AXAbR19d8GGSMUBN+FyYwEqGI1aZizGcJlHMLgx= 
       caps mds = "allow *"
       caps mon = "allow *"
       caps osd = "allow *"
       caps mgr = "allow *"

HÀr ligger problemet. Det intrÀffade ett slags fel: klustret Äterskapades
 men i sjÀlva verket finns det inte.

Det blir tydligt att hemligheterna lagrar nyligen genererade keyringar, och de inte Àr frÄn vÄrt gamla kluster. DÀrför:

  • tar vi keyringen frĂ„n monitorn frĂ„n filen /var/lib/rook/mon-a/data/keyring (eller frĂ„n en backup);
  • Ă€ndrar keyringen i hemligheten rook-ceph-mons-keyring;
  • angiver keyringen frĂ„n admin och monitor i ConfigMap rook-ceph-mon;
  • tar bort controllrarna för pods med monitorerna.

Ett mirakel lÄter inte vÀnta pÄ sig: monitorerna kommer att dyka upp och starta. Hurra, det Àr en början!

LÄt oss ÄterstÀlla OSD

Vi gĂ„r in i podden rook-operator: anropar ceph mon dump visar att alla monitorer Ă€r pĂ„ plats, och ceph -s — pĂ„ att de Ă€r i quorum. Men om vi ser pĂ„ OSD-trĂ€det (root@ceph01-q:~# ceph osd tree), kommer vi att se nĂ„got konstigt: OSD:erna började dyka upp, men de Ă€r tomma. Det verkar som att vi ocksĂ„ mĂ„ste Ă„terstĂ€lla dem pĂ„ nĂ„got sĂ€tt. Men hur?

Under tiden har det dykt upp de ConfigMap:ar som vi verkligen behöver rook-ceph-config och rook-config-override, samt mÄnga andra ConfigMap:ar med namn som rook-ceph-osd-$nodename-config. LÄt oss ta en titt pÄ dem:

kind: ConfigMap
data:
 osd-dirs: '{"/mnt/osd1":16,"/mnt/osd2":18}'

Det Àr inte rÀtt, allt Àr blandat!

Vi ska skala ner operatörens pod till noll, ta bort de genererade Deployment:erna av OSD-poddarna och fixa dessa ConfigMap:ar. Men var ska vi fÄ den korrekta OSD-kartan per noder?

  • LĂ„t oss försöka grĂ€va igenom mapparna /mnt/osd[1-2] pĂ„ noderna — i hopp om att vi kan fĂ„ nĂ„got dĂ€r.
  • I kataloget /mnt/osd1 det finns 2 underkataloger: osd0 och osd16. Sista — det Ă€r ju precis den ID som anges i ConfigMap (16)?
  • Vi kontrollerar storlekarna och ser att osd0 mycket större osd16.

Vi kommer fram till att osd0 — det Ă€r den OSD som angavs som /mnt/osd1 i ConfigMap (eftersom vi anvĂ€nder directory based osd.)

Steg för steg kontrollerar vi alla noder och rÀttar till ConfigMap:arna. Efter alla ÄtgÀrder kan vi starta Rook-operatorens pod och lÀsa dess loggar. Och i dem Àr allt fantastiskt:

  • jag Ă€r klusteroperator;
  • jag har hittat diskar pĂ„ noderna;
  • jag har hittat monitorer;
  • monitorerna har kommit överens, det vill sĂ€ga bildat quorum;
  • jag startar OSD-deployment:er


LĂ„t oss gĂ„ tillbaka till Rook-operatörens pod och kontrollera klustrets hĂ€lsa
 ja, vi gjorde nĂ„gra smĂ„ misstag med namnen pĂ„ OSD pĂ„ vissa noder! Ingen fara: vi har rĂ€ttat till ConfigMap:arna, tagit bort onödiga mappar frĂ„n nya OSD och kommit till det efterlĂ€ngtade tillstĂ„ndet HEALTH_OK!

Vi kontrollerar bilderna i poolen:

# rbd ls -p kube
pvc-9cfa2a98-b878-437e-8d57-acb26c7118fb
pvc-9fcc4308-0343-434c-a65f-9fd181ab103e
pvc-a6466fea-bded-4ac7-8935-7c347cff0d43
pvc-b284d098-f0fc-420c-8ef1-7d60e330af67
pvc-b6d02124-143d-4ce3-810f-3326cfa180ae
pvc-c0800871-0749-40ab-8545-b900b83eeee9
pvc-c274dbe9-1566-4a33-bada-aabeb4c76c32



Allt Ă€r pĂ„ plats — klustret Ă€r rĂ€ddat!

Jag Àr lat med att göra sÀkerhetskopior, eller Snabb vÀg

Om sÀkerhetskopior för Rook gjordes, blir ÄterstÀllningsproceduren betydligt enklare och handlar om följande:

  1. Skala ner Rook-operatorens deployment till noll;
  2. Ta bort alla deployment:er förutom Rook-operatorn;
  3. ÅterstĂ€ll alla secret:er och ConfigMap:ar frĂ„n sĂ€kerhetskopian;
  4. ÅterstĂ€ll innehĂ„llet i mapparna /var/lib/rook/mon-* pĂ„ noderna;
  5. ÅterstĂ€ll (om vi av misstag har tappat bort dem) CRD CephCluster, CephFilesystem, CephBlockPool, CephNFS, CephObjectStore;
  6. Skala upp Rook-operatorns deployment till 1 igen.

Nyttiga tips

Gör sÀkerhetskopior!

Och för att undvika situationer dÀr ÄterstÀllning kan behövas:

  1. Innan stora arbeten med klustret, som innebÀr omstart av servrar, skala ner Rook-operatorn till noll sÄ att den inte gör nÄgot överflödigt.
  2. Till monitorerna i förvÀg lÀgg till nodeAffinity.
  3. Ge uppmÀrksamhet Ät den preliminÀra konfigurera tidsgrÀnser ROOK_MON_HEALTHCHECK_INTERVAL och ROOK_MON_OUT_TIMEOUT.

Avslutande

Det Àr meningslöst att diskutera att Rook, som en extra "skikt" (i den övergripande strukturen för lagringsorganisation i Kubernetes), bÄde förenklar mycket men ocksÄ tillför nya komplexiteter och potentiella problem i infrastrukturen. FrÄgan kvarstÄr att göra ett vÀl avvÀgt och motiverat val mellan dessa risker Ä ena sidan och den nytta som lösningen ger i just ditt fall Ä andra sidan.

För övrigt, nyligen i Rook-dokumentationen lades till avsnittet "Adopt an existing Rook Ceph cluster into a new Kubernetes cluster". HÀr beskrivs mer i detalj vad som behöver göras för att flytta befintlig data till en ny Kubernetes-kluster eller ÄterstÀlla funktionaliteten i ett kluster som kollapsat av en eller annan anledning.

P.S.

LÀs Àven i vÄr blogg:

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