Apvalka operatora ideja ir pavisam vienkārša: abonējiet notikumus no Kubernetes objektiem un, kad šie notikumi ir saņemti, palaidiet ārēju programmu, nodrošinot tai informāciju par notikumu:
Nepieciešamība pēc tā radās, kad klasteru darbības laikā sāka parādīties nelieli uzdevumi, kurus mēs patiešām vēlējāmies automatizēt pareizi. Visi šie mazie uzdevumi tika atrisināti, izmantojot vienkāršus bash skriptus, lai gan, kā jūs zināt, labāk ir rakstīt operatorus Golangā. Acīmredzot investēt pilna mēroga operatora attīstībā katram tik mazam uzdevumam būtu neefektīvi.
Operators 15 minūtēs
Apskatīsim piemēru, ko var automatizēt Kubernetes klasterī un kā var palīdzēt čaulas operators. Piemērs varētu būt šāds: noslēpuma replicēšana, lai piekļūtu docker reģistram.
Aplikācijas, kurās tiek izmantoti attēli no privāta reģistra, manifestā ir jāietver saite uz noslēpumu ar datiem, lai piekļūtu reģistram. Šis noslēpums ir jāizveido katrā nosaukumvietā pirms aplikumu izveides. To var izdarīt manuāli, bet, ja mēs iestatīsim dinamiskas vides, tad vienas lietojumprogrammas nosaukumvietas būs daudz. Un ja arī nav 2-3 pieteikumu... noslēpumu skaits kļūst ļoti liels. Un vēl viena lieta par noslēpumiem: es vēlētos laiku pa laikam mainīt atslēgu, lai piekļūtu reģistram. Galu galā, manuālās darbības kā risinājums pilnīgi neefektīva — mums ir jāautomatizē noslēpumu izveide un atjaunināšana.
Vienkārša automatizācija
Uzrakstīsim čaulas skriptu, kas palaižas reizi N sekundēs un pārbauda, vai nosaukumvietās nav noslēpuma, un, ja noslēpuma nav, tad tas tiek izveidots. Šī risinājuma priekšrocība ir tāda, ka tas izskatās pēc čaulas skripta cron valodā - klasiska un visiem saprotama pieeja. Negatīvā puse ir tāda, ka intervālā starp tā palaišanu var izveidot jaunu nosaukumvietu un kādu laiku tā paliks bez noslēpuma, kas novedīs pie kļūdām podiņu palaišanā.
Automatizācija ar čaulas operatoru
Lai mūsu skripts darbotos pareizi, klasiskā cron palaišana ir jāaizstāj ar palaišanu, kad tiek pievienota nosaukumvieta: šajā gadījumā pirms tā izmantošanas varat izveidot noslēpumu. Apskatīsim, kā to ieviest, izmantojot čaulas operatoru.
Vispirms apskatīsim skriptu. Skriptus čaulas operatora terminos sauc par āķiem. Katrs āķis, kad skrien ar karogu --config informē čaulas operatoru par saviem iesējumiem, t.i. par kādiem pasākumiem tas būtu jāuzsāk. Mūsu gadījumā mēs izmantosim onKubernetesEvent:
#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
fi
Šeit ir aprakstīts, ka mēs esam ieinteresēti pievienot notikumus (add) tipa objekti namespace.
Tagad jums jāpievieno kods, kas tiks izpildīts, kad notiks notikums:
#!/bin/bash
if [[ $1 == "--config" ]] ; then
# конфигурация
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
else
# реакция:
# узнать, какой namespace появился
createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
# создать в нём нужный секрет
kubectl create -n ${createdNamespace} -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
...
data:
...
EOF
fi
Lieliski! Rezultāts bija mazs, skaists scenārijs. Lai to “atdzīvinātu”, ir atlikušas divas darbības: sagatavojiet attēlu un palaidiet to klasterī.
Attēla sagatavošana ar āķi
Ja paskatās uz skriptu, jūs varat redzēt, ka komandas tiek izmantotas kubectl и jq. Tas nozīmē, ka attēlā ir jābūt šādām lietām: mūsu āķis, apvalka operators, kas pārraudzīs notikumus un palaidīs āķi, un āķa izmantotās komandas (kubectl un jq). Vietnē Hub.docker.com jau ir gatavs attēls, kurā ir iepakoti čaulas operators, kubectl un jq. Atliek tikai pievienot vienkāršu āķi Dockerfile:
Apskatīsim āķi vēlreiz un šoreiz pierakstīsim, kādas darbības un ar kādiem objektiem tas klasterī veic:
abonē nosaukumvietas izveides pasākumus;
izveido noslēpumu citās nosaukumvietās, nevis tajā, kur tas tiek palaists.
Izrādās, ka podam, kurā tiks palaists mūsu attēls, ir jābūt atļaujām veikt šīs darbības. To var izdarīt, izveidojot savu ServiceAccount. Atļauja ir jāveic ClusterRole un ClusterRoleBinding formātā, jo mūs interesē objekti no visa klastera.
Tas arī viss: čaulas operators sāks darbu, abonēs nosaukumvietas izveides pasākumus un palaidīs āķi, kad nepieciešams.
Tātad, vienkāršs čaulas skripts kļuva par īstu Kubernetes operatoru un darbojas kā klastera daļa. Un tas viss bez sarežģīta operatoru izstrādes procesa Golangā:
Šim jautājumam ir vēl viena ilustrācija...
Sīkāk tā nozīmi atklāsim kādā no turpmākajām publikācijām.
filtrēšana
Objektu izsekošana ir laba, taču bieži vien ir jāreaģē mainot dažas objekta īpašības, piemēram, lai mainītu izvietošanas reprodukciju skaitu vai mainītu objektu etiķetes.
Kad pienāk notikums, čaulas operators saņem objekta JSON manifestu. Mēs varam atlasīt rekvizītus, kas mūs interesē šajā JSON, un palaist āķi tikai kad tie mainās. Tam ir lauks jqFilter, kur jānorāda jq izteiksme, kas tiks lietota JSON manifestā.
Piemēram, lai reaģētu uz izmaiņām izvietošanas objektu etiķetēs, jums ir jāfiltrē lauks labels ārpus lauka metadata. Konfigurācija būs šāda:
Neliela atkāpe: jā, čaulas operatoru atbalsta darbojas crontab stila skripti. Sīkāku informāciju var atrast dokumentācija.
Lai atšķirtu, kāpēc āķis tika palaists, čaulas operators izveido pagaidu failu un nodod ceļu uz to mainīgajā āķim BINDING_CONTEXT_TYPE. Failā ir JSON apraksts par āķa palaišanas iemeslu. Piemēram, ik pēc 10 minūtēm āķis darbosies ar šādu saturu:
Lauku saturu var saprast pēc to nosaukumiem, un sīkāku informāciju var izlasīt dokumentācija. Piemērs resursa nosaukuma iegūšanai no lauka resourceName jq izmantošana jau ir parādīta āķī, kas atkārto noslēpumus:
jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH
Līdzīgā veidā varat iegūt citus laukus.
Ko tālāk?
Projektu krātuvē, in /examples direktoriji, ir piemēri āķiem, kas ir gatavi darbam klasterī. Rakstot savus āķus, varat tos izmantot par pamatu.
Ir atbalsts metrikas apkopošanai, izmantojot Prometheus – pieejamie rādītāji ir aprakstīti sadaļā METRIKA.
Kā jūs varētu nojaust, čaulas operators ir rakstīts programmā Go un izplatīts saskaņā ar atvērtā pirmkoda licenci (Apache 2.0). Būsim pateicīgi par jebkādu palīdzību attīstībai projekts vietnē GitHub: un zvaigznes, un problēmas, un izvilkšanas pieprasījumi.
Paceļot noslēpuma plīvuru, informēsim arī, ka čaulas operators ir mazs daļa no mūsu sistēmas, kas var atjaunināt Kubernetes klasterī instalētos papildinājumus un veikt dažādas automātiskas darbības. Lasiet vairāk par šo sistēmu stāstīja burtiski pirmdien HighLoad++ 2019 Sanktpēterburgā - drīzumā publicēsim šī ziņojuma video un atšifrējumu.
Mums ir plāns atvērt pārējo sistēmu: papildinājumu operatoru un mūsu āķu un moduļu kolekciju. Starp citu, addon-operators jau ir pieejams vietnē github, taču tā dokumentācija vēl ir ceļā. Moduļu kolekcijas iznākšana plānota vasarā.