L-idea ta 'operatur tal-qoxra hija pjuttost sempliċi: abbona għal avvenimenti minn oġġetti Kubernetes, u meta dawn l-avvenimenti jiġu riċevuti, iniedi programm estern, billi tipprovdih b'informazzjoni dwar l-avveniment:
Il-ħtieġa għaliha qamet meta, waqt it-tħaddim tar-raggruppamenti, bdew jidhru ħidmiet żgħar li verament ridna awtomatizzaw bil-mod it-tajjeb. Dawn il-kompiti żgħar kollha ġew solvuti bl-użu ta 'skripts bash sempliċi, għalkemm, kif tafu, huwa aħjar li tikteb operaturi f'Golang. Ovvjament, l-investiment fl-iżvilupp fuq skala sħiħa ta' operatur għal kull kompitu żgħir bħal dan ikun ineffettiv.
Operatur fi 15-il minuta
Ejja nħarsu lejn eżempju ta 'x'jista' jiġi awtomatizzat fi cluster Kubernetes u kif l-operatur tal-qoxra jista 'jgħin. Eżempju jkun dan li ġej: replika ta' sigriet biex taċċessa r-reġistru tad-docker.
Il-miżwed li jużaw immaġini minn reġistru privat għandu jkun fihom fil-manifest tagħhom link għal sigriet b'dejta għall-aċċess tar-reġistru. Dan is-sigriet għandu jinħoloq f'kull namespace qabel ma jinħolqu l-imżiewed. Dan jista 'jsir manwalment, iżda jekk inwaqqfu ambjenti dinamiċi, allura l-ispazju tal-isem għal applikazzjoni waħda se jsir ħafna. U jekk ma jkunx hemm ukoll 2-3 applikazzjonijiet... in-numru ta 'sigrieti jsir kbir ħafna. U ħaġa oħra dwar is-sigrieti: nixtieq nibdel iċ-ċavetta biex taċċessa r-reġistru minn żmien għal żmien. Eventwalment, operazzjonijiet manwali bħala soluzzjoni kompletament ineffettiv — jeħtieġ li nawtomatizzaw il-ħolqien u l-aġġornament tas-sigrieti.
Awtomazzjoni sempliċi
Ejja nikteb script shell li jibda darba kull N sekondi u jiċċekkja namespaces għall-preżenza ta 'sigriet, u jekk ma jkunx hemm sigriet, allura jinħoloq. Il-vantaġġ ta 'din is-soluzzjoni huwa li tidher qisha script shell f'cron - approċċ klassiku u li jinftiehem għal kulħadd. L-iżvantaġġ huwa li fl-intervall bejn it-tnedija tiegħu jista 'jinħoloq namespace ġdid u għal xi żmien jibqa' mingħajr sigriet, li jwassal għal żbalji fit-tnedija tal-miżwed.
Awtomazzjoni ma 'shell-operatur
Biex l-iskrittura tagħna taħdem b'mod korrett, it-tnedija klassika tal-cron jeħtieġ li tiġi sostitwita b'tnedija meta jiżdied namespace: f'dan il-każ, tista 'toħloq sigriet qabel ma tużah. Ejja naraw kif timplimenta dan billi tuża shell-operator.
L-ewwel, ejja nħarsu lejn l-iskrittura. Skripts f'termini ta 'shell-operator jissejħu ganċijiet. Kull ganċ meta jitmexxa bil-bandiera --config jinforma lill-operatur tal-qoxra dwar l-irbit tiegħu, i.e. fuq liema avvenimenti għandha titnieda. Fil-każ tagħna se nużaw onKubernetesEvent:
#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
fi
Hawnhekk huwa deskritt li aħna interessati li nżidu avvenimenti (add) oġġetti tat-tip namespace.
Issa trid iżżid il-kodiċi li se jiġi esegwit meta jseħħ l-avveniment:
#!/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
Kbir! Ir-riżultat kien skript żgħir u sabiħ. Biex "tqajjem" dan, fadal żewġ passi: ipprepara l-immaġni u tniediha fil-cluster.
Tħejjija ta 'immaġni b'ganċ
Jekk tħares lejn l-iskrittura, tista 'tara li l-kmandi huma użati kubectl и jq. Dan ifisser li l-immaġni għandu jkollha l-affarijiet li ġejjin: il-ganċ tagħna, operatur tal-qoxra li se jimmonitorja l-avvenimenti u jmexxi l-ganċ, u l-kmandi użati mill-ganċ (kubectl u jq). Hub.docker.com diġà għandu immaġni lesta li fiha shell-operator, kubectl u jq huma ppakkjati. Li jibqa 'huwa li żżid ganċ sempliċi Dockerfile:
Ejja nerġgħu nħarsu lejn il-ganċ u din id-darba ikteb liema azzjonijiet u b'liema oġġetti twettaq fil-cluster:
jissottoskrivi għal avvenimenti ta' ħolqien ta' spazju tal-isem;
joħloq sigriet fl-ispazji tal-isem minbarra dak fejn jiġi mniedi.
Jirriżulta li l-pod li fih se tkun imnedija l-immaġni tagħna jrid ikollu permessi biex jagħmel dawn l-azzjonijiet. Dan jista' jsir billi toħloq ServiceAccount tiegħek stess. Il-permess għandu jsir fil-forma ta 'ClusterRole u ClusterRoleBinding, għaliex aħna interessati fl-oġġetti mill-cluster kollu.
Id-deskrizzjoni finali f'YAML tidher xi ħaġa bħal din:
Dak kollu: l-operatur tal-qoxra se jibda, jissottoskrivi għall-avvenimenti tal-ħolqien tal-ispazji tal-isem u jmexxi l-ganċ meta jkun meħtieġ.
Għalhekk, il- script shell sempliċi inbidel f'operatur reali għal Kubernetes u jaħdem bħala parti minn raggruppament. U dan kollu mingħajr il-proċess kumpless ta 'żvilupp ta' operaturi f'Golang:
Hemm illustrazzjoni oħra dwar din il-kwistjoni...
Se niżvelaw it-tifsira tiegħu f’aktar dettall f’waħda mill-pubblikazzjonijiet li ġejjin.
filtrazzjoni
It-traċċar tal-oġġetti huwa tajjeb, iżda ħafna drabi jkun hemm bżonn li tirreaġixxi għalihom jibdlu xi proprjetajiet ta 'oġġett, pereżempju, biex tbiddel in-numru ta 'repliki fl-Iskjerament jew biex tbiddel it-tikketti tal-oġġetti.
Meta jasal avveniment, l-operatur tal-qoxra jirċievi l-manifest JSON tal-oġġett. Nistgħu nagħżlu l-proprjetajiet li jinteressawna f'dan il-JSON u nħaddmu l-ganċ biss meta jinbidlu. Hemm qasam għal dan jqFilter, fejn għandek bżonn tispeċifika l-espressjoni jq li se tiġi applikata għall-manifest JSON.
Pereżempju, biex twieġeb għal bidliet fit-tikketti għall-oġġetti ta' Deployment, għandek bżonn tiffiltra l-qasam labels barra mill-għalqa metadata. Il-konfigurazzjoni se tkun bħal din:
Din l-espressjoni jqFilter tibdel il-manifest JSON twil ta' Deployment f'JSON qasir b'tikketti:
shell-operator se jmexxi l-ganċ biss meta dan il-JSON qasir jinbidel, u l-bidliet fi proprjetajiet oħra jiġu injorati.
Il-kuntest tat-tnedija tal-ganċ
Il-konfigurazzjoni tal-ganċ tippermettilek li tispeċifika diversi għażliet għal avvenimenti - pereżempju, 2 għażliet għal avvenimenti minn Kubernetes u 2 skedi:
Digressjoni żgħira: iva, jappoġġja l-operatur tal-qoxra tmexxija ta 'skripts ta' stil crontab. Aktar dettalji jistgħu jinstabu fi dokumentazzjoni.
Biex tiddistingwi għaliex tnieda l-ganċ, l-operatur tal-qoxra joħloq fajl temporanju u jgħaddi l-mogħdija lejh f'varjabbli għall-ganċ BINDING_CONTEXT_TYPE. Il-fajl fih deskrizzjoni JSON tar-raġuni għat-tħaddim tal-ganċ. Pereżempju, kull 10 minuti l-ganċ se jaħdem bil-kontenut li ġej:
Il-kontenut tal-oqsma jistgħu jinftiehmu mill-ismijiet tagħhom, u aktar dettalji jistgħu jinqraw fihom dokumentazzjoni. Eżempju ta' kif tikseb isem ta' riżorsa minn qasam resourceName l-użu ta' jq diġà ġie muri f'ganċ li jirreplika s-sigrieti:
jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH
Tista 'tikseb oqsma oħra b'mod simili.
Xi jmiss?
Fir-repożitorju tal-proġett, fi /eżempji direttorji, hemm eżempji ta 'ganċijiet li huma lesti biex jaħdmu fuq cluster. Meta tikteb il-ganċijiet tiegħek, tista 'tużahom bħala bażi.
Hemm appoġġ għall-ġbir ta 'metriċi bl-użu ta' Prometheus - il-metriċi disponibbli huma deskritti fit-taqsima METRIKA.
Kif tista' taħsbu, l-operatur tal-qoxra huwa miktub f'Go u mqassam taħt liċenzja Open Source (Apache 2.0). Inkunu grati għal kwalunkwe għajnuna għall-iżvilupp proġett fuq GitHub: u stilel, u kwistjonijiet, u pull talbiet.
Tneħħi l-velu tas-segretezza, aħna se ninfurmak ukoll li shell-operatur huwa żgħir parti mis-sistema tagħna li tista’ żżomm aġġornati l-add-ons installati fil-cluster Kubernetes u twettaq diversi azzjonijiet awtomatiċi. Aqra aktar dwar din is-sistema qal litteralment nhar it-Tnejn f'HighLoad++ 2019 f'San Pietruburgu - dalwaqt se nippubblikaw il-vidjo u t-traskrizzjoni ta' dan ir-rapport.
Għandna pjan biex niftħu l-bqija ta 'din is-sistema: l-addon-operator u l-kollezzjoni tagħna ta' ganċijiet u moduli. Mill-mod, addon-operatur huwa diġà disponibbli fuq github, iżda d-dokumentazzjoni għaliha għadha fit-triq. Ir-rilaxx tal-ġbir ta 'moduli huwa ppjanat għas-sajf.