Ang ideya sa usa ka shell-operator yano ra: mag-subscribe sa mga panghitabo gikan sa mga butang sa Kubernetes, ug kung kini nga mga panghitabo madawat, maglunsad og usa ka eksternal nga programa, nga naghatag niini og impormasyon mahitungod sa panghitabo:
Ang panginahanglan alang niini mitungha sa dihang, sa panahon sa operasyon sa mga pungpong, ang gagmay nga mga buluhaton nagsugod sa pagpakita nga gusto gyud namo nga mag-automate sa hustong paagi. Ang tanan nga kini nga gagmay nga mga buluhaton nasulbad gamit ang yano nga mga script sa bash, bisan kung nahibal-an nimo, mas maayo nga isulat ang mga operator sa Golang. Dayag, ang pagpamuhunan sa bug-os nga pag-uswag sa usa ka operator alang sa matag ingon nga gamay nga buluhaton dili epektibo.
Operator sa 15 minuto
Atong tan-awon ang usa ka pananglitan kung unsa ang mahimo nga awtomatiko sa usa ka cluster sa Kubernetes ug kung giunsa makatabang ang shell-operator. Ang usa ka pananglitan mao ang mosunod: pagkopya sa usa ka sekreto aron ma-access ang docker registry.
Ang mga pod nga naggamit og mga hulagway gikan sa usa ka pribadong rehistro kinahanglang maglangkob sa ilang manifest nga usa ka sumpay sa usa ka sekreto nga adunay mga datos alang sa pag-access sa rehistro. Kini nga sekreto kinahanglang himoon sa matag namespace sa dili pa maghimo og mga pod. Mahimo kini nga mano-mano, apan kung magbutang kami mga dinamikong palibot, nan ang namespace alang sa usa ka aplikasyon mahimong daghan. Ug kung wala usab 2-3 nga aplikasyon ... ang gidaghanon sa mga sekreto mahimong dako kaayo. Ug usa pa ka butang bahin sa mga sekreto: Gusto nakong usbon ang yawe aron ma-access ang rehistro matag karon ug unya. Sa kadugayan, manual nga mga operasyon isip solusyon hingpit nga dili epektibo - kinahanglan naton nga awtomatiko ang paghimo ug pag-update sa mga sekreto.
Yano nga automation
Magsulat kita og script sa shell nga modagan kausa sa matag N segundos ug susihon ang mga namespace alang sa presensya sa usa ka sekreto, ug kung walay sekreto, nan kini gibuhat. Ang bentaha sa kini nga solusyon mao nga kini sama sa usa ka shell script sa cron - usa ka klasiko ug masabtan nga pamaagi sa tanan. Ang downside mao nga sa agwat tali sa mga paglansad niini usa ka bag-ong namespace ang mahimo ug sulod sa pipila ka panahon kini magpabilin nga walay sekreto, nga mosangpot sa mga sayup sa paglansad sa mga pod.
Automation nga adunay shell-operator
Aron ang among script molihok sa husto, ang klasiko nga paglansad sa cron kinahanglan nga pulihan sa usa ka paglansad kung ang usa ka namespace idugang: sa kini nga kaso, mahimo ka maghimo usa ka sekreto sa dili pa kini gamiton. Atong tan-awon kung giunsa kini ipatuman gamit ang shell-operator.
Una, atong tan-awon ang script. Ang mga script sa mga termino sa shell-operator gitawag nga mga kaw-it. Ang matag kaw-it kung modagan nga adunay bandila --config nagpahibalo sa shell-operator mahitungod sa mga pagbugkos niini, i.e. sa unsa nga mga panghitabo kini kinahanglan nga ilunsad. Sa among kaso among gamiton onKubernetesEvent:
#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "namespace",
"event":["add"]
}
]}
EOF
fi
Gihulagway dinhi nga kami interesado sa pagdugang sa mga panghitabo (add) mga butang sa tipo namespace.
Karon kinahanglan nimong idugang ang code nga ipatuman kung mahitabo ang panghitabo:
#!/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
Nindot! Ang resulta usa ka gamay, nindot nga script. Aron "mabuhi" kini, adunay duha ka lakang nga nahabilin: andama ang imahe ug ilunsad kini sa cluster.
Pag-andam sa usa ka imahe nga adunay usa ka kaw-it
Kon imong tan-awon ang script, imong makita nga ang mga sugo gigamit kubectl и jq. Kini nagpasabot nga ang hulagway kinahanglang adunay mosunod nga mga butang: ang atong kaw-it, usa ka shell-operator nga momonitor sa mga panghitabo ug modagan sa kaw-it, ug ang mga sugo nga gigamit sa kaw-it (kubectl ug jq). Ang Hub.docker.com aduna nay andam nga hulagway diin ang shell-operator, kubectl ug jq giputos. Ang nahabilin mao ang pagdugang usa ka yano nga kaw-it Dockerfile:
Atong tan-awon pag-usab ang kaw-it ug niining higayona isulat kung unsang mga aksyon ug kung unsang mga butang ang gihimo niini sa cluster:
nag-subscribe sa mga panghitabo sa paghimo sa namespace;
nagmugna og sekreto sa mga namespaces gawas sa usa diin kini gilusad.
Mogawas nga ang pod diin ilusad ang among imahe kinahanglan adunay mga pagtugot aron mahimo kini nga mga aksyon. Mahimo kini pinaagi sa paghimo sa imong kaugalingon nga ServiceAccount. Ang pagtugot kinahanglan buhaton sa porma sa ClusterRole ug ClusterRoleBinding, tungod kay kami interesado sa mga butang gikan sa tibuok cluster.
Ang katapusang paghulagway sa YAML motan-aw sama niini:
Kana lang: magsugod ang shell-operator, mag-subscribe sa mga panghitabo sa paghimo sa namespace ug ipadagan ang hook kung gikinahanglan.
Busa, usa ka yano nga script sa shell nahimo nga usa ka tinuod nga operator para sa Kubernetes ug nagtrabaho isip bahin sa usa ka cluster. Ug kining tanan nga wala ang komplikado nga proseso sa pagpalambo sa mga operator sa Golang:
Adunay laing ilustrasyon bahin niini nga butang...
Atong ibutyag ang kahulogan niini sa mas detalyado sa usa sa mosunod nga mga publikasyon.
pagsala
Ang pagsubay sa mga butang maayo, apan adunay kanunay nga panginahanglan sa pagtubag pagbag-o sa pipila ka mga kabtangan sa butang, pananglitan, aron usbon ang gidaghanon sa mga replika sa Deployment o aron usbon ang mga label sa butang.
Kung moabut ang usa ka panghitabo, ang shell-operator makadawat sa JSON nga pagpakita sa butang. Mahimo natong pilion ang mga kabtangan nga makapainteres kanato niining JSON ug ipadagan ang kaw-it lamang sa dihang nagbag-o sila. Adunay usa ka uma alang niini jqFilter, diin kinahanglan nimo ipiho ang jq nga ekspresyon nga magamit sa JSON manifest.
Pananglitan, aron matubag ang mga pagbag-o sa mga label alang sa mga butang sa Deployment, kinahanglan nimo nga isala ang uma labels gawas sa uma metadata. Ang config mahimong sama niini:
Kini nga ekspresyon sa jqFilter naghimo sa taas nga JSON nga gipakita sa Deployment ngadto sa mubo nga JSON nga adunay mga label:
shell-operator modagan lamang sa kaw-it sa diha nga kini nga mubo nga JSON mausab, ug ang mga kausaban sa ubang mga kabtangan dili tagdon.
Konteksto sa paglansad sa hook
Ang hook config nagtugot kanimo sa pagpiho sa daghang mga kapilian alang sa mga panghitabo - pananglitan, 2 nga kapilian alang sa mga panghitabo gikan sa Kubernetes ug 2 nga mga iskedyul:
Usa ka gamay nga digression: oo, ang shell-operator nagsuporta nagpadagan sa mga script sa estilo sa crontab. Dugang nga mga detalye makita sa dokumentasyon.
Aron mahibal-an kung ngano nga gilunsad ang kaw-it, ang shell-operator nagmugna usa ka temporaryo nga file ug gipasa ang agianan niini sa usa ka variable sa kaw-it BINDING_CONTEXT_TYPE. Ang file adunay usa ka paghulagway sa JSON sa hinungdan sa pagpadagan sa kaw-it. Pananglitan, matag 10 ka minuto ang kaw-it modagan uban sa mosunod nga sulod:
Ang mga sulod sa mga natad masabtan gikan sa ilang mga ngalan, ug daghang mga detalye ang mabasa sa dokumentasyon. Usa ka pananglitan sa pagkuha sa usa ka ngalan sa kapanguhaan gikan sa usa ka uma resourceName ang paggamit sa jq gipakita na sa usa ka kaw-it nga nagsundog sa mga sekreto:
jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH
Mahimo nimong makuha ang ubang mga natad sa parehas nga paagi.
Unsay sunod?
Sa repositoryo sa proyekto, sa / mga pananglitan sa mga direktoryo, adunay mga pananglitan sa mga kaw-it nga andam nga modagan sa usa ka pungpong. Sa pagsulat sa imong kaugalingon nga mga kaw-it, mahimo nimo kining gamiton isip basehan.
Adunay suporta alang sa pagkolekta sa mga sukatan gamit ang Prometheus - ang magamit nga mga sukatan gihulagway sa seksyon METRICS.
Sama sa imong gihunahuna, ang shell-operator gisulat sa Go ug giapod-apod sa ilawom sa usa ka lisensya sa Open Source (Apache 2.0). Magpasalamat kami sa bisan unsang tabang sa pagpauswag proyekto sa GitHub: ug mga bitoon, ug mga isyu, ug mga hangyo sa pagbitad.
Pagtangtang sa tabil sa sekreto, kami usab ipahibalo kanimo nga ang shell-operator mao gamay bahin sa among sistema nga makapadayon sa pag-install sa mga add-on sa cluster sa Kubernetes hangtod sa petsa ug makahimo sa lainlaing mga awtomatikong aksyon. Basaha ang dugang bahin niini nga sistema gisulti literal sa Lunes sa HighLoad ++ 2019 sa St. Petersburg - sa dili madugay atong imantala ang video ug transcript niini nga taho.
Kami adunay plano nga ablihan ang nahabilin nga sistema: ang addon-operator ug ang among koleksyon sa mga kaw-it ug mga module. Pinaagi sa dalan, addon-operator na anaa sa GitHub, apan ang dokumentasyon alang niini anaa pa sa dalan. Ang pagpagawas sa koleksyon sa mga module giplano alang sa ting-init.