ProHoster > Blogs > AdministrÄcija > Iet? Bash! IepazÄ«stieties ar Äaulas operatoru (pÄrskats un videoreportÄža no KubeCon EU'2020)
Iet? Bash! IepazÄ«stieties ar Äaulas operatoru (pÄrskats un videoreportÄža no KubeCon EU'2020)
Å ogad galvenÄ Eiropas Kubernetes konference - KubeCon + CloudNativeCon Europe 2020 - bija virtuÄla. TaÄu Å”Ädas formÄta izmaiÅas mums netraucÄja sniegt mÅ«su sen plÄnoto ziÅojumu āAiziet? Bash! IepazÄ«stieties ar Shell operatoruā, kas veltÄ«ts mÅ«su atvÄrtÄ koda projektam Äaulas operators.
Å ajÄ rakstÄ, kas ir iedvesmots no sarunas, ir sniegta pieeja Kubernetes operatoru izveides procesa vienkÄrÅ”oÅ”anai un parÄdÄ«ts, kÄ ar minimÄlu piepÅ«li varat izveidot savu operatoru, izmantojot Äaulas operatoru.
IepazÄ«stinÄm reportÄžas video (~23 minÅ«tes angļu valodÄ, manÄmi informatÄ«vÄks par rakstu) un galvenais izraksts no tÄ teksta formÄ. Aiziet!
UzÅÄmumÄ Flant mÄs pastÄvÄ«gi visu optimizÄjam un automatizÄjam. Å odien mÄs runÄsim par citu aizraujoÅ”u koncepciju. IepazÄ«stieties: mÄkoÅdatoÅ”anas Äaulas skriptÄÅ”ana!
TomÄr sÄksim ar kontekstu, kurÄ tas viss notiek: Kubernetes.
Kubernetes API un kontrolieri
Kubernetes API var attÄlot kÄ sava veida failu serveri ar direktorijiem katram objekta veidam. Objektus (resursus) Å”ajÄ serverÄ« attÄlo YAML faili. TurklÄt serverim ir pamata API, kas ļauj veikt trÄ«s darbÄ«bas:
saÅemt resurss pÄc tÄ veida un nosaukuma;
mainÄ«t resurss (Å”ajÄ gadÄ«jumÄ serveris glabÄ tikai āpareizosā objektus - visi nepareizi izveidotie vai paredzÄti citiem direktorijiem tiek izmesti);
trase resursam (Å”ajÄ gadÄ«jumÄ lietotÄjs uzreiz saÅem tÄ paÅ”reizÄjo/atjauninÄto versiju).
TÄdÄjÄdi Kubernetes darbojas kÄ sava veida failu serveris (YAML manifestiem) ar trim pamatmetodÄm (jÄ, patiesÄ«bÄ ir arÄ« citas, taÄu mÄs tÄs pagaidÄm izlaidÄ«sim).
ProblÄma ir tÄ, ka serveris var uzglabÄt tikai informÄciju. Lai tas darbotos, jums ir nepiecieÅ”ams kontrolieris - otra svarÄ«gÄkÄ un fundamentÄlÄkÄ koncepcija Kubernetes pasaulÄ.
Ir divi galvenie kontrolieru veidi. Pirmais Åem informÄciju no Kubernetes, apstrÄdÄ to saskaÅÄ ar ligzdoto loÄ£iku un atgriež K8s. Otrais Åem informÄciju no Kubernetes, bet atŔķirÄ«bÄ no pirmÄ veida maina dažu ÄrÄjo resursu stÄvokli.
SÄ«kÄk apskatÄ«sim izvietoÅ”anas izveides procesu Kubernetes:
IzvietoÅ”anas kontrolieris (iekļauts kube-controller-manager) saÅem informÄciju par izvietoÅ”anu un izveido ReplicaSet.
Pamatojoties uz Å”o informÄciju, ReplicaSet izveido divas kopijas (divus aplikumus), taÄu Å”ie aplikumi vÄl nav ieplÄnoti.
PlÄnotÄjs plÄno podi un pievieno mezglu informÄciju saviem YAML.
Kubelets veic izmaiÅas ÄrÄjÄ resursÄ (teiksim, Docker).
Tad visa Ŕī secÄ«ba tiek atkÄrtota apgrieztÄ secÄ«bÄ: kubelets pÄrbauda konteinerus, aprÄÄ·ina pÄksts statusu un nosÅ«ta to atpakaļ. ReplicaSet kontrolleris saÅem statusu un atjaunina reprodukcijas kopas stÄvokli. Tas pats notiek ar izvietoÅ”anas kontrolieri, un lietotÄjs beidzot iegÅ«st atjauninÄto (paÅ”reizÄjo) statusu.
Apvalka operators
IzrÄdÄs, ka Kubernetes pamatÄ ir dažÄdu kontrolieru kopÄ«gs darbs (arÄ« Kubernetes operatori ir kontrolieri). Rodas jautÄjums, kÄ ar minimÄlu piepÅ«li izveidot savu operatoru? Un Å”eit palÄ«gÄ nÄk mÅ«su izstrÄdÄtais Äaulas operators. Tas ļauj sistÄmas administratoriem izveidot savus paziÅojumus, izmantojot pazÄ«stamas metodes.
VienkÄrÅ”s piemÄrs: noslÄpumu kopÄÅ”ana
ApskatÄ«sim vienkÄrÅ”u piemÄru.
PieÅemsim, ka mums ir Kubernetes klasteris. Tam ir nosaukumvieta default ar kÄdu noslÄpumu mysecret. TurklÄt klasterÄ« ir arÄ« citas nosaukumvietas. Dažiem no tiem ir pievienota Ä«paÅ”a etiÄ·ete. MÅ«su mÄrÄ·is ir kopÄt Secret nosaukumu telpÄs ar etiÄ·eti.
Uzdevumu sarežģī fakts, ka klasterÄ« var parÄdÄ«ties jaunas nosaukumvietas, un dažÄm no tÄm var bÅ«t Ŕī etiÄ·ete. No otras puses, dzÄÅ”ot etiÄ·eti, ir jÄdzÄÅ” arÄ« Secret. Papildus tam var mainÄ«ties arÄ« pats noslÄpums: Å”ajÄ gadÄ«jumÄ jaunais Secret ir jÄkopÄ visÄs nosaukumvietÄs ar etiÄ·etÄm. Ja Secret tiek nejauÅ”i izdzÄsts kÄdÄ nosaukumvietÄ, mÅ«su operatoram tas nekavÄjoties jÄatjauno.
Tagad, kad uzdevums ir formulÄts, ir pienÄcis laiks sÄkt to Ä«stenot, izmantojot Äaulas operatoru. Bet vispirms ir vÄrts pateikt dažus vÄrdus par paÅ”u Äaulas operatoru.
KÄ darbojas Äaulas operators
TÄpat kÄ citas Kubernetes darba slodzes, Äaulas operators darbojas savÄ podÄ. Å ajÄ podÄ direktorijÄ /hooks izpildÄmie faili tiek saglabÄti. Tie var bÅ«t skripti valodÄs Bash, Python, Ruby utt. MÄs Å”Ädus izpildÄmos failus saucam par ÄÄ·iem (ÄÄ·i).
Shell-operator abonÄ Kubernetes notikumus un palaiž Å”os ÄÄ·us, reaÄ£Äjot uz tiem notikumiem, kas mums nepiecieÅ”ami.
KÄ Äaulas operators zina, kuru ÄÄ·i palaist un kad? Lieta tÄda, ka katram ÄÄ·im ir divi posmi. StartÄÅ”anas laikÄ Äaulas operators palaiž visus ÄÄ·us ar argumentu --config Å is ir konfigurÄcijas posms. Un pÄc tam ÄÄ·i tiek palaisti parastajÄ veidÄ - reaÄ£Äjot uz notikumiem, kuriem tie ir pievienoti. PÄdÄjÄ gadÄ«jumÄ ÄÄ·is saÅem saistoÅ”o kontekstu (saistoÅ”s konteksts) - dati JSON formÄtÄ, par kuriem mÄs sÄ«kÄk runÄsim tÄlÄk.
Operatora izveide BaÅ”Ä
Tagad esam gatavi ievieÅ”anai. Lai to izdarÄ«tu, mums ir jÄraksta divas funkcijas (starp citu, mÄs iesakÄm bibliotÄka shell_lib, kas ievÄrojami vienkÄrÅ”o ÄÄ·u rakstÄ«Å”anu Bash valodÄ):
pirmais ir nepiecieÅ”ams konfigurÄcijas posmam - tas parÄda saistoÅ”o kontekstu;
otrajÄ ir galvenÄ ÄÄ·a loÄ£ika.
#!/bin/bash
source /shell_lib.sh
function __config__() {
cat << EOF
configVersion: v1
# BINDING CONFIGURATION
EOF
}
function __main__() {
# THE LOGIC
}
hook::run "$@"
NÄkamais solis ir izlemt, kÄdi objekti mums ir nepiecieÅ”ami. MÅ«su gadÄ«jumÄ mums ir jÄizseko:
izmaiÅu avota noslÄpums;
visas klastera nosaukumvietas, lai jÅ«s zinÄtu, kurÄm no tÄm ir pievienota etiÄ·ete;
mÄrÄ·a noslÄpumus, lai nodroÅ”inÄtu, ka tie visi ir sinhronizÄti ar avota noslÄpumu.
AbonÄjiet slepeno avotu
IesieÅ”anas konfigurÄcija tam ir diezgan vienkÄrÅ”a. Ar nosaukumu norÄdÄm, ka interesÄjam Secret mysecret vÄrdu telpÄ default:
KÄ redzat, konfigurÄcijÄ ir parÄdÄ«jies jauns lauks ar nosaukumu jqFilter. KÄ norÄda nosaukums, jqFilter filtrÄ visu nevajadzÄ«go informÄciju un izveido jaunu JSON objektu ar laukiem, kas mÅ«s interesÄ. ÄÄ·is ar lÄ«dzÄ«gu konfigurÄciju saÅems Å”Ädu saistoÅ”o kontekstu:
Tas satur masÄ«vu filterResults katrai klastera nosaukumvietai. BÅ«la mainÄ«gais hasLabel norÄda, vai noteiktai nosaukumvietai ir pievienota etiÄ·ete. AtlasÄ«tÄjs keepFullObjectsInMemory: false norÄda, ka nav nepiecieÅ”ams saglabÄt pilnus objektus atmiÅÄ.
MÄrÄ·a noslÄpumu izsekoÅ”ana
MÄs parakstÄmies uz visiem NoslÄpumiem, kuriem ir norÄdÄ«ta anotÄcija managed-secret: "yes" (tie ir mÅ«su mÄrÄ·is dst_secrets):
Å ajÄ gadÄ«jumÄ jqFilter filtrÄ visu informÄciju, izÅemot nosaukumvietu un parametru resourceVersion. PÄdÄjais parametrs tika nodots anotÄcijai, veidojot noslÄpumu: tas ļauj salÄ«dzinÄt noslÄpumu versijas un atjauninÄt tÄs.
Å Ädi konfigurÄts ÄÄ·is, kad tas tiks izpildÄ«ts, saÅems trÄ«s iepriekÅ” aprakstÄ«tos saistoÅ”os kontekstus. Tos var uzskatÄ«t par sava veida momentuzÅÄmumu (momentuzÅÄmums) klasteris.
Pamatojoties uz visu Å”o informÄciju, var izstrÄdÄt pamata algoritmu. Tas atkÄrtojas visÄs nosaukumvietÄs un:
ja hasLabel jautÄjumiem true paÅ”reizÄjai nosaukumvietai:
salÄ«dzina globÄlo noslÄpumu ar vietÄjo:
ja tie ir vienÄdi, tas neko nedara;
ja tie atŔķiras - izpilda kubectl replace vai create;
ja hasLabel jautÄjumiem false paÅ”reizÄjai nosaukumvietai:
nodroÅ”ina, ka Secret neatrodas norÄdÄ«tajÄ nosaukumvietÄ:
ja vietÄjais noslÄpums ir pieejams, izdzÄsiet to, izmantojot kubectl delete;
ja vietÄjais noslÄpums netiek atklÄts, tas neko nedara.
TÄdÄ veidÄ mÄs varÄjÄm izveidot vienkÄrÅ”u Kubernetes kontrolieri, izmantojot 35 YAML konfigurÄcijas rindas un aptuveni tikpat daudz Bash koda! Apvalka operatora uzdevums ir tos saistÄ«t kopÄ.
TomÄr noslÄpumu kopÄÅ”ana nav vienÄ«gÄ lietderÄ«bas joma. Å eit ir vÄl daži piemÄri, lai parÄdÄ«tu, uz ko viÅÅ” ir spÄjÄ«gs.
ApskatÄ«sim izvietoÅ”anu, kas sastÄv no trim blokiem. Pods izmanto ConfigMap, lai saglabÄtu kÄdu konfigurÄciju. Kad podi tika palaisti, ConfigMap bija noteiktÄ stÄvoklÄ« (sauksim to par v.1). AttiecÄ«gi visi podi izmanto Å”o konkrÄto ConfigMap versiju.
Tagad pieÅemsim, ka ConfigMap ir mainÄ«jies (v.2). TomÄr aplikumos tiks izmantota iepriekÅ”ÄjÄ ConfigMap versija (v.1):
KÄ es varu panÄkt, lai viÅi pÄrslÄgtos uz jauno ConfigMap (v.2)? Atbilde ir vienkÄrÅ”a: izmantojiet veidni. Pievienosim sadaļai kontrolsummas anotÄciju template IzvietoÅ”anas konfigurÄcijas:
RezultÄtÄ Å”Ä« kontrolsumma tiks reÄ£istrÄta visos podiÅos, un tÄ bÅ«s tÄda pati kÄ izvietoÅ”anas kontrolsumma. Tagad jums vienkÄrÅ”i jÄatjaunina anotÄcija, kad mainÄs ConfigMap. Un Äaulas operators Å”ajÄ gadÄ«jumÄ noder. Viss, kas jums jÄdara, ir ieprogrammÄt ÄÄ·is, kas abonÄs ConfigMap un atjauninÄs kontrolsummu.
Ja lietotÄjs veic izmaiÅas ConfigMap, Äaulas operators tÄs pamanÄ«s un pÄrrÄÄ·inÄs kontrolsummu. PÄc tam stÄsies spÄkÄ Kubernetes burvÄ«ba: orÄ·estris nogalinÄs podiÅu, izveidos jaunu, gaidÄ«s, kad tas kļūs Ready, un pÄriet uz nÄkamo. TÄ rezultÄtÄ izvietoÅ”ana tiks sinhronizÄta un pÄrslÄgsies uz jauno ConfigMap versiju.
2. piemÄrs. Darbs ar pielÄgotÄm resursu definÄ«cijÄm
KÄ zinÄms, Kubernetes ļauj izveidot pielÄgotus objektu tipus. PiemÄram, jÅ«s varat izveidot laipnu MysqlDatabase. PieÅemsim, ka Å”im veidam ir divi metadatu parametri: name Šø namespace.
apiVersion: example.com/v1alpha1
kind: MysqlDatabase
metadata:
name: foo
namespace: bar
Mums ir Kubernetes klasteris ar dažÄdÄm nosaukumu telpÄm, kurÄs mÄs varam izveidot MySQL datu bÄzes. Å ajÄ gadÄ«jumÄ resursu izsekoÅ”anai var izmantot Äaulas operatoru MysqlDatabase, savienojot tos ar MySQL serveri un sinhronizÄjot vÄlamos un novÄrotos klastera stÄvokļus.
3. piemÄrs. Klasteru tÄ«kla pÄrraudzÄ«ba
KÄ jÅ«s zinÄt, ping ir vienkÄrÅ”Äkais veids, kÄ pÄrraudzÄ«t tÄ«klu. Å ajÄ piemÄrÄ mÄs parÄdÄ«sim, kÄ Ä«stenot Å”Ädu uzraudzÄ«bu, izmantojot Äaulas operatoru.
PirmkÄrt, jums bÅ«s jÄabonÄ mezgli. Apvalka operatoram ir nepiecieÅ”ams katra mezgla nosaukums un IP adrese. Ar viÅu palÄ«dzÄ«bu viÅÅ” ping Å”os mezglus.
Parametrs executeHookOnEvent: [] neļauj ÄÄ·im darboties, reaÄ£Äjot uz jebkuru notikumu (tas ir, reaÄ£Äjot uz mezglu maiÅu, pievienoÅ”anu, dzÄÅ”anu). TomÄr viÅÅ” skries (un atjauniniet mezglu sarakstu) PlÄnots - katru minÅ«ti, kÄ to nosaka laukums schedule.
Tagad rodas jautÄjums, kÄ tieÅ”i mÄs zinÄm par tÄdÄm problÄmÄm kÄ pakeÅ”u zudums? ApskatÄ«sim kodu:
function __main__() {
for i in $(seq 0 "$(context::jq -r '(.snapshots.nodes | length) - 1')"); do
node_name="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.name')"
node_ip="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.ip')"
packets_lost=0
if ! ping -c 1 "$node_ip" -t 1 ; then
packets_lost=1
fi
cat >> "$METRICS_PATH" <<END
{
"name": "node_packets_lost",
"add": $packets_lost,
"labels": {
"node": "$node_name"
}
}
END
done
}
MÄs atkÄrtojam mezglu sarakstu, iegÅ«stam to nosaukumus un IP adreses, ping tos un nosÅ«tÄm rezultÄtus Prometheus. Shell operators var eksportÄt metriku uz Prometheus, saglabÄjot tos failÄ, kas atrodas atbilstoÅ”i vides mainÄ«gajÄ norÄdÄ«tajam ceļam $METRICS_PATH.
KÄ Å”is JÅ«s varat izveidot operatoru vienkÄrÅ”ai tÄ«kla uzraudzÄ«bai klasterÄ«.
Rindas mehÄnisms
Å is raksts bÅ«tu nepilnÄ«gs, neaprakstot citu svarÄ«gu mehÄnismu, kas iebÅ«vÄts apvalka operatorÄ. IedomÄjieties, ka tas izpilda sava veida ÄÄ·i, reaÄ£Äjot uz notikumu klasterÄ«.
Kas notiek, ja tajÄ paÅ”Ä laikÄ kaut kas notiek klasterÄ«? vÄl vienu pasÄkums?
Vai Äaulas operators palaist citu ÄÄ·a gadÄ«jumu?
Ko darīt, ja klasterī vienlaikus notiek pieci notikumi?
Vai Äaulas operators tos apstrÄdÄs paralÄli?
KÄ ir ar patÄrÄtajiem resursiem, piemÄram, atmiÅu un centrÄlo procesoru?
Par laimi, Äaulas operatoram ir iebÅ«vÄts rindas mehÄnisms. Visi notikumi tiek ievietoti rindÄ un apstrÄdÄti secÄ«gi.
IlustrÄsim to ar piemÄriem. PieÅemsim, ka mums ir divi ÄÄ·i. Pirmais notikums iet uz pirmo ÄÄ·i. Kad tÄ apstrÄde ir pabeigta, rinda virzÄs uz priekÅ”u. NÄkamie trÄ«s notikumi tiek novirzÄ«ti uz otro ÄÄ·i - tie tiek noÅemti no rindas un ievadÄ«ti tajÄ āsaitÄā. Tas ir ÄÄ·is saÅem virkni notikumu ā vai, precÄ«zÄk, saistoÅ”u kontekstu masÄ«vs.
ArÄ« Ŕīs pasÄkumus var apvienot vienÄ lielÄ. Parametrs ir atbildÄ«gs par to group saistoÅ”ajÄ konfigurÄcijÄ.
Varat izveidot neierobežotu skaitu rindu/ÄÄ·u un to dažÄdÄs kombinÄcijas. PiemÄram, viena rinda var darboties ar diviem ÄÄ·iem vai otrÄdi.
Viss, kas jums jÄdara, ir attiecÄ«gi jÄkonfigurÄ lauks queue saistoÅ”ajÄ konfigurÄcijÄ. Ja rindas nosaukums nav norÄdÄ«ts, ÄÄ·is darbojas noklusÄjuma rindÄ (default). Å is rindas mehÄnisms ļauj pilnÄ«bÄ atrisinÄt visas resursu pÄrvaldÄ«bas problÄmas, strÄdÄjot ar ÄÄ·iem.
SecinÄjums
MÄs izskaidrojÄm, kas ir Äaulas operators, parÄdÄ«jÄm, kÄ ar to var Ätri un bez piepÅ«les izveidot Kubernetes operatorus, kÄ arÄ« sniedzÄm vairÄkus tÄ izmantoÅ”anas piemÄrus.
SÄ«kÄka informÄcija par Äaulas operatoru, kÄ arÄ« Ätra apmÄcÄ«ba par to, kÄ to izmantot, ir pieejama atbilstoÅ”ajÄ GitHub krÄtuves. Nevilcinieties sazinÄties ar mums, ja jums ir jautÄjumi: varat tos apspriest Ä«paÅ”Ä Telegram grupa (krievu valodÄ) vai in Å”is forums (angliski).
Un, ja jums patika, mÄs vienmÄr priecÄjamies redzÄt jaunus izdevumus/PR/zvaigznes vietnÄ GitHub, kur, starp citu, varat atrast citus interesanti projekti. Starp tiem ir vÄrts izcelt papildinÄjumu operators, kas ir Äaulas operatora lielais brÄlis. Å Ä« utilÄ«ta izmanto Helm diagrammas, lai instalÄtu papildinÄjumus, var piegÄdÄt atjauninÄjumus un pÄrraudzÄ«t dažÄdus diagrammu parametrus/vÄrtÄ«bas, kontrolÄ diagrammu instalÄÅ”anas procesu un var arÄ« modificÄt tÄs, reaÄ£Äjot uz notikumiem klasterÄ«.