Tunakuletea kiendesha ganda: kuunda waendeshaji kwa Kubernetes imekuwa rahisi

Tayari kumekuwa na nakala kwenye blogi yetu zinazozungumza uwezo wa waendeshaji katika Kubernetes na jinsi gani andika mwendeshaji rahisi mwenyewe. Wakati huu tungependa kuwasilisha kwa mawazo yako suluhisho letu la Open Source, ambalo linachukua uundaji wa waendeshaji kwa kiwango rahisi sana - angalia shell-operator!

Kwa nini?

Wazo la operesheni ya ganda ni rahisi sana: jiandikishe kwa hafla kutoka kwa vitu vya Kubernetes, na wakati matukio haya yanapokelewa, zindua programu ya nje, ukitoa habari juu ya tukio hilo:

Tunakuletea kiendesha ganda: kuunda waendeshaji kwa Kubernetes imekuwa rahisi

Haja yake iliibuka wakati, wakati wa operesheni ya nguzo, kazi ndogo zilianza kuonekana kwamba kwa kweli tulitaka kujiendesha kwa njia sahihi. Kazi hizi zote ndogo zilitatuliwa kwa kutumia maandishi rahisi ya bash, ingawa, kama unavyojua, ni bora kuandika waendeshaji katika Golang. Kwa wazi, kuwekeza katika maendeleo kamili ya opereta kwa kila kazi ndogo kama hiyo hakutakuwa na ufanisi.

Opereta katika dakika 15

Wacha tuangalie mfano wa kile kinachoweza kuendeshwa kiotomatiki kwenye nguzo ya Kubernetes na jinsi kiendesha ganda kinaweza kusaidia. Mfano utakuwa ufuatao: kuiga siri ili kufikia usajili wa docker.

Podi zinazotumia picha kutoka kwa sajili ya faragha lazima ziwe na kiungo kwenye faili ya maelezo ya siri iliyo na data ya kufikia sajili. Siri hii lazima iundwe katika kila nafasi ya majina kabla ya kuunda maganda. Hii inaweza kufanywa kwa mikono, lakini ikiwa tutaweka mazingira yanayobadilika, basi nafasi ya majina ya programu moja itakuwa nyingi. Na ikiwa pia hakuna maombi 2-3 ... idadi ya siri inakuwa kubwa sana. Na jambo moja zaidi kuhusu siri: Ningependa kubadilisha ufunguo wa kufikia Usajili mara kwa mara. Hatimaye, shughuli za mikono kama suluhu isiyofaa kabisa - tunahitaji kubinafsisha uundaji na kusasisha siri.

Uendeshaji rahisi

Wacha tuandike maandishi ya ganda ambayo huendesha mara moja kila sekunde N na kukagua nafasi za majina kwa uwepo wa siri, na ikiwa hakuna siri, basi inaundwa. Faida ya suluhisho hili ni kwamba inaonekana kama hati ya ganda kwenye cron - njia ya kawaida na inayoeleweka kwa kila mtu. Kikwazo ni kwamba katika muda kati ya uzinduzi wake nafasi mpya ya jina inaweza kuundwa na kwa muda itabaki bila siri, ambayo itasababisha makosa katika uzinduzi wa pods.

Automatisering na shell-operator

Ili hati yetu ifanye kazi kwa usahihi, uzinduzi wa cron wa kawaida unahitaji kubadilishwa na uzinduzi wakati nafasi ya jina imeongezwa: katika kesi hii, unaweza kuunda siri kabla ya kuitumia. Hebu tuone jinsi ya kutekeleza hili kwa kutumia shell-operator.

Kwanza, hebu tuangalie script. Maandishi katika masharti ya kiendesha ganda huitwa ndoano. Kila ndoano inapoendeshwa na bendera --config hufahamisha shell-operator kuhusu vifungo vyake, i.e. juu ya matukio gani inapaswa kuzinduliwa. Kwa upande wetu tutatumia onKubernetesEvent:

#!/bin/bash
if [[ $1 == "--config" ]] ; then
cat <<EOF
{
"onKubernetesEvent": [
  { "kind": "namespace",
    "event":["add"]
  }
]}
EOF
fi

Inaelezwa hapa kwamba tuna nia ya kuongeza matukio (add) vitu vya aina namespace.

Sasa unahitaji kuongeza nambari ambayo itatekelezwa wakati tukio litatokea:

#!/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

Kubwa! Matokeo yake yalikuwa hati ndogo, nzuri. Ili "kufufua", kuna hatua mbili zilizobaki: kuandaa picha na kuizindua kwenye nguzo.

Kuandaa picha na ndoano

Ikiwa unatazama script, unaweza kuona kwamba amri hutumiwa kubectl и jq. Hii ina maana kwamba picha lazima iwe na mambo yafuatayo: ndoano yetu, shell-operator ambayo itafuatilia matukio na kuendesha ndoano, na amri zinazotumiwa na ndoano (kubectl na jq). Hub.docker.com tayari ina picha iliyotengenezwa tayari ambayo kiendesha ganda, kubectl na jq huwekwa. Yote iliyobaki ni kuongeza ndoano rahisi Dockerfile:

$ cat Dockerfile
FROM flant/shell-operator:v1.0.0-beta.1-alpine3.9
ADD namespace-hook.sh /hooks

$ docker build -t registry.example.com/my-operator:v1 . 
$ docker push registry.example.com/my-operator:v1

Kukimbia katika nguzo

Wacha tuangalie ndoano tena na wakati huu tuandike ni vitendo gani na vitu gani hufanya kwenye nguzo:

  1. hujiandikisha kwa matukio ya kuunda nafasi ya majina;
  2. huunda siri katika nafasi za majina isipokuwa ile ambayo inazinduliwa.

Inatokea kwamba pod ambayo picha yetu itazinduliwa lazima iwe na ruhusa ya kufanya vitendo hivi. Hii inaweza kufanywa kwa kuunda Akaunti yako ya Huduma. Ruhusa lazima ifanywe kwa njia ya ClusterRole na ClusterRoleBinding, kwa sababu tunavutiwa na vitu kutoka kwa nguzo nzima.

Maelezo ya mwisho katika YAML yataonekana kitu kama hiki:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: monitor-namespaces-acc

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: monitor-namespaces
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list", "create", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: monitor-namespaces
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: monitor-namespaces
subjects:
  - kind: ServiceAccount
    name: monitor-namespaces-acc
    namespace: example-monitor-namespaces

Unaweza kuzindua picha iliyokusanyika kama Usambazaji rahisi:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1
      serviceAccountName: monitor-namespaces-acc

Kwa urahisi, nafasi tofauti ya majina imeundwa ambapo kiendesha ganda kitazinduliwa na maonyesho yaliyoundwa yatatumika:

$ kubectl create ns example-monitor-namespaces
$ kubectl -n example-monitor-namespaces apply -f rbac.yaml
$ kubectl -n example-monitor-namespaces apply -f deployment.yaml

Hiyo tu: kiendesha ganda kitaanza, jiandikishe kwa hafla za uundaji wa nafasi ya majina na endesha ndoano inapohitajika.

Tunakuletea kiendesha ganda: kuunda waendeshaji kwa Kubernetes imekuwa rahisi

Hivyo, hati rahisi ya ganda iligeuka kuwa mwendeshaji halisi wa Kubernetes na inafanya kazi kama sehemu ya nguzo. Na haya yote bila mchakato mgumu wa kukuza waendeshaji huko Golang:

Tunakuletea kiendesha ganda: kuunda waendeshaji kwa Kubernetes imekuwa rahisi

Kuna mfano mwingine juu ya suala hili ...Tunakuletea kiendesha ganda: kuunda waendeshaji kwa Kubernetes imekuwa rahisi

Tutafunua maana yake kwa undani zaidi katika mojawapo ya machapisho yafuatayo.

kuchuja

Kufuatilia vitu ni nzuri, lakini mara nyingi kuna haja ya kuguswa kubadilisha baadhi ya mali ya kitu, kwa mfano, kubadilisha idadi ya nakala katika Usambazaji au kubadilisha lebo za vitu.

Tukio linapofika, kiendesha ganda hupokea faili ya maelezo ya JSON ya kitu hicho. Tunaweza kuchagua mali zinazotuvutia katika JSON hii na kuendesha ndoano tu wanapobadilika. Kuna uwanja kwa hii jqFilter, ambapo unahitaji kubainisha usemi wa jq ambao utatumika kwenye faili ya maelezo ya JSON.

Kwa mfano, ili kujibu mabadiliko katika lebo za Vipengee vya Usambazaji, unahitaji kuchuja uga labels kutoka shambani metadata. Mpangilio utakuwa kama hii:

cat <<EOF
{
"onKubernetesEvent": [
{ "kind": "deployment",
  "event":["update"],
  "jqFilter": ".metadata.labels"
}
]}
EOF

Msemo huu wa jqFilter hubadilisha faili ya maelezo marefu ya JSON ya Usambazaji kuwa JSON fupi iliyo na lebo:

Tunakuletea kiendesha ganda: kuunda waendeshaji kwa Kubernetes imekuwa rahisi

shell-operator itaendesha ndoano tu wakati JSON fupi hii inabadilika, na mabadiliko ya sifa zingine yatapuuzwa.

Muktadha wa uzinduzi wa ndoano

Usanidi wa ndoano hukuruhusu kutaja chaguzi kadhaa za hafla - kwa mfano, chaguzi 2 za hafla kutoka Kubernetes na ratiba 2:

{"onKubernetesEvent":[
  {"name":"OnCreatePod",
  "kind": "pod",
  "event":["add"]
  },
  {"name":"OnModifiedNamespace",
  "kind": "namespace",
  "event":["update"],
  "jqFilter": ".metadata.labels"
  }
],
"schedule": [
{ "name":"every 10 min",
  "crontab":"* */10 * * * *"
}, {"name":"on Mondays at 12:10",
"crontab": "* 10 12 * * 1"
]}

Kicheko kidogo: ndio, kiendesha ganda inasaidia kuendesha maandishi ya mtindo wa crontab. Maelezo zaidi yanaweza kupatikana katika nyaraka.

Ili kutofautisha kwa nini ndoano ilizinduliwa, kiendesha ganda huunda faili ya muda na kupitisha njia yake kwa kutofautisha kwa ndoano. BINDING_CONTEXT_TYPE. Faili ina maelezo ya JSON ya sababu ya kuendesha ndoano. Kwa mfano, kila dakika 10 ndoano itaendesha na maudhui yafuatayo:

[{ "binding": "every 10 min"}]

... na Jumatatu itaanza na hii:

[{ "binding": "every 10 min"}, { "binding": "on Mondays at 12:10"}]

Kwa onKubernetesEvent Kutakuwa na vichochezi zaidi vya JSON, kwa sababu ina maelezo ya kitu:

[
 {
 "binding": "onCreatePod",
 "resourceEvent": "add",
 "resourceKind": "pod",
 "resourceName": "foo",
 "resourceNamespace": "bar"
 }
]

Yaliyomo kwenye sehemu yanaweza kueleweka kutoka kwa majina yao, na maelezo zaidi yanaweza kusomwa ndani nyaraka. Mfano wa kupata jina la rasilimali kutoka kwa shamba resourceName kutumia jq tayari imeonyeshwa kwenye ndoano ambayo inaiga siri:

jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH

Unaweza kupata sehemu zingine kwa njia sawa.

Nini hapo?

Katika hazina ya mradi, in / mifano saraka, kuna mifano ya ndoano ambazo ziko tayari kukimbia kwenye nguzo. Wakati wa kuandika ndoano zako mwenyewe, unaweza kuzitumia kama msingi.

Kuna usaidizi wa kukusanya vipimo kwa kutumia Prometheus - vipimo vinavyopatikana vimefafanuliwa katika sehemu hii METRICS.

Kama unavyoweza kudhani, kiendesha ganda kimeandikwa katika Go na kusambazwa chini ya leseni ya Open Source (Apache 2.0). Tutashukuru kwa msaada wowote wa maendeleo mradi kwenye GitHub: na nyota, na masuala, na maombi ya kuvuta.

Kuinua pazia la usiri, tutakujulisha pia kuwa kiendesha ganda ni ndogo sehemu ya mfumo wetu inayoweza kusasisha programu jalizi kwenye kundi la Kubernetes na kutekeleza vitendo mbalimbali otomatiki. Soma zaidi kuhusu mfumo huu aliiambia siku ya Jumatatu katika HighLoad++ 2019 huko St. Petersburg - hivi karibuni tutachapisha video na manukuu ya ripoti hii.

Tuna mpango wa kufungua wengine wa mfumo huu: addon-operator na mkusanyiko wetu wa ndoano na modules. Kwa njia, addon-operator tayari inapatikana kwenye GitHub, lakini nyaraka zake bado ziko njiani. Kutolewa kwa mkusanyiko wa modules imepangwa kwa majira ya joto.

Endelea!

PS

Soma pia kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni