Ku Flant timakulitsa ndikusinthira zonse. Lero tikambirana za lingaliro lina losangalatsa. Kukumana: cloud-native shell scripting!
Komabe, tiyeni tiyambe ndi nkhani yomwe zonsezi zimachitika: Kubernetes.
Kubernetes API ndi olamulira
API ku Kubernetes ikhoza kuyimiridwa ngati mtundu wa seva yamafayilo yokhala ndi zolemba zamtundu uliwonse wa chinthu. Zinthu (zothandizira) pa seva iyi zimayimiriridwa ndi mafayilo a YAML. Kuphatikiza apo, seva ili ndi API yoyambira yomwe imakulolani kuchita zinthu zitatu:
njira kwa gwero (pankhaniyi, wogwiritsa ntchito nthawi yomweyo amalandira mtundu wake wamakono / wosinthidwa).
Chifukwa chake, Kubernetes imakhala ngati mtundu wa seva yamafayilo (ya mawonekedwe a YAML) ndi njira zitatu zoyambira (inde, pali zina, koma tizisiya pakadali pano).
Zikuoneka kuti Kubernetes imachokera ku ntchito yogwirizana ya olamulira osiyanasiyana (oyendetsa Kubernetes ndi olamulira). Funso limadzuka, momwe mungapangire opareshoni yanu molimbika pang'ono? Ndipo apa amene tinapanga abwera kudzatipulumutsa chipolopolo-woyendetsa. Zimalola oyang'anira machitidwe kupanga mawu awoawo pogwiritsa ntchito njira zodziwika bwino.
Chitsanzo chosavuta: kukopera zinsinsi
Tiyeni tione chitsanzo chosavuta.
Tinene kuti tili ndi gulu la Kubernetes. Ili ndi malo a mayina default ndi Chinsinsi mysecret. Kuphatikiza apo, palinso malo ena am'magulu. Ena mwa iwo ali ndi chizindikiro chokhazikika. Cholinga chathu ndikutengera Chinsinsi m'malo omwe ali ndi zilembo.
Ntchitoyi ndi yovuta chifukwa chakuti malo atsopano amatha kuwonekera m'gululi, ndipo ena a iwo akhoza kukhala ndi chizindikiro ichi. Kumbali ina, chizindikirocho chikachotsedwa, Chinsinsi chiyeneranso kuchotsedwa. Kuphatikiza pa izi, Chinsinsi chokhacho chikhoza kusinthanso: pamenepa, Chinsinsi chatsopano chiyenera kukopera ku malo onse a mayina omwe ali ndi malemba. Ngati Chinsinsi chafufutidwa mwangozi m'malo aliwonse a mayina, wogwiritsa ntchitoyo ayenera kubwezeretsanso nthawi yomweyo.
Tsopano popeza ntchitoyi yapangidwa, ndi nthawi yoti muyambe kuyigwiritsa ntchito pogwiritsa ntchito chipolopolo. Koma choyamba ndi bwino kunena mawu ochepa ponena za chipolopolo-woyendetsa mwiniwake.
Momwe shell-operator imagwirira ntchito
Monga zolemetsa zina ku Kubernetes, oyendetsa zipolopolo amayenda mu pod yake. M'nkhani ino mu bukhuli /hooks mafayilo omwe amatha kusungidwa amasungidwa. Izi zitha kukhala zolemba mu Bash, Python, Ruby, etc. Timatcha mafayilo omwe amatha kuchitidwa ngati zingwe (ngowe).
Monga mukuonera, gawo latsopano lawonekera mu kasinthidwe ndi dzina jqFilter. Monga dzina lake likunenera, jqFilter imasefa zidziwitso zonse zosafunika ndikupanga chinthu chatsopano cha JSON chokhala ndi minda yomwe ili ndi chidwi kwa ife. Hook yokhala ndi kasinthidwe kofanana ilandila mawu omangiriza awa:
Lili ndi gulu filterResults pa malo aliwonse amgulu. Kusintha kwa boolean hasLabel zikuwonetsa ngati chizindikirocho chalumikizidwa kumalo operekedwa. Wosankha keepFullObjectsInMemory: false zimasonyeza kuti palibe chifukwa chosunga zinthu zonse mβmaganizo.
Kutsata zinsinsi zomwe mukufuna
Timalembetsa ku Zinsinsi zonse zomwe zili ndi mawu ofotokozera managed-secret: "yes" (awa ndi cholinga chathu dst_secrets):
Pankhaniyi jqFilter imasefa zidziwitso zonse kupatula malo a mayina ndi parameter resourceVersion. Chotsatira chomaliza chinaperekedwa ku chidziwitso popanga chinsinsi: chimakulolani kufananitsa mitundu ya zinsinsi ndikuzisungabe.
Umu ndi momwe tinatha kupanga chowongolera cha Kubernetes chosavuta kugwiritsa ntchito mizere 35 ya YAML config komanso kuchuluka komweko kwa Bash code! Ntchito ya shell-operator ndiyo kuwalumikiza pamodzi.
Komabe, kukopera zinsinsi si gawo lokhalo logwiritsira ntchito. Nazi zitsanzo zina zosonyeza zomwe angathe kuchita.
Chitsanzo 1: Kusintha kwa ConfigMap
Tiyeni tiwone Kutumiza komwe kumakhala ndi ma pod atatu. Ma Pods amagwiritsa ntchito ConfigMap kusunga zosintha zina. Pamene ma pod adayambitsidwa, ConfigMap inali mumkhalidwe wina wake (tiyeni tiyitcha v.1). Chifukwa chake, ma pod onse amagwiritsa ntchito mtundu uwu wa ConfigMap.
Tsopano tiyeni tiyerekeze kuti ConfigMap yasintha (v.2). Komabe, ma pod adzagwiritsa ntchito mtundu wakale wa ConfigMap (v.1):
Kodi ndingawathandize bwanji kuti asinthe kupita ku ConfigMap yatsopano (v.2)? Yankho ndi losavuta: gwiritsani ntchito template. Tiyeni tiwonjezere ndemanga ya cheki kugawolo template Zokonda zotumizidwa:
Zotsatira zake, chekeni iyi idzalembetsedwa mu ma pod onse, ndipo idzakhala yofanana ndi ya Deployment. Tsopano mukungofunika kusintha mawu ake ConfigMap ikasintha. Ndipo chipolopolo-operator amabwera bwino mu nkhani iyi. Zomwe muyenera kuchita ndi pulogalamu mbeza yomwe idzalembetse ku ConfigMap ndikusintha cheke.
Ngati wogwiritsa ntchito asintha pa ConfigMap, wogwiritsa ntchito zipolopolo amaziwona ndikuwerengeranso cheke. Pambuyo pake matsenga a Kubernetes adzayamba kusewera: woyimbayo adzapha pod, kupanga yatsopano, kuyembekezera kuti ikhale. Ready, ndikupita ku yotsatira. Zotsatira zake, Deployment ilumikizana ndikusintha ku mtundu watsopano wa ConfigMap.
Chitsanzo 2: Kugwira ntchito ndi Tanthauzo la Custom Resource
Monga mukudziwa, Kubernetes amakulolani kuti mupange mitundu yazinthu. Mwachitsanzo, mukhoza kupanga wokoma mtima MysqlDatabase. Tiyerekeze kuti mtundu uwu uli ndi magawo awiri a metadata: name ΠΈ namespace.
apiVersion: example.com/v1alpha1
kind: MysqlDatabase
metadata:
name: foo
namespace: bar
Tili ndi gulu la Kubernetes lomwe lili ndi mayina osiyanasiyana momwe tingapangire ma database a MySQL. Pankhaniyi, chipolopolo-operator angagwiritsidwe ntchito kufufuza zinthu MysqlDatabase, kuwalumikiza ku seva ya MySQL ndikugwirizanitsa zomwe mukufuna ndikuwona za gululo.
Choyamba, muyenera kulembetsa ku node. Woyendetsa chipolopolo amafunikira dzina ndi adilesi ya IP ya node iliyonse. Ndi thandizo lawo, iye adzakhala ping mfundo izi.
Tsopano funso likubwera, kodi timadziwa bwanji za mavuto monga kutayika kwa paketi? Tiyeni tiwone code:
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
}
Timabwereza mndandanda wa node, kupeza mayina awo ndi ma adilesi a IP, kuwalemba ndikutumiza zotsatira ku Prometheus. Shell-operator amatha kutumiza ma metric ku Prometheus, kuwasunga ku fayilo yomwe ili molingana ndi njira yomwe yafotokozedwa pakusintha kwachilengedwe $METRICS_PATH.