A’ toirt a-steach gnìomhaiche shligean: bha cruthachadh gnìomhaichean airson Kubernetes dìreach air fàs nas fhasa

Tha artaigilean air a bhith air ar blog mu thràth a’ bruidhinn comasan gnìomhaiche ann an Kubernetes agus ciamar sgrìobh gnìomhaiche sìmplidh thu fhèin. An turas seo bu mhath leinn ar fuasgladh Open Source a thaisbeanadh dhut, a bheir cruthachadh ghnìomhaichean gu ìre air leth furasta - thoir sùil air slige-ghnìomhaiche!

Carson?

Tha am beachd air gnìomhaiche sligean gu math sìmplidh: fo-sgrìobh gu tachartasan bho nithean Kubernetes, agus nuair a gheibhear na tachartasan sin, cuir air bhog prògram taobh a-muigh, a ’toirt seachad fiosrachadh mun tachartas:

A’ toirt a-steach gnìomhaiche shligean: bha cruthachadh gnìomhaichean airson Kubernetes dìreach air fàs nas fhasa

Dh’ èirich feum air nuair a thòisich gnìomhan beaga a’ nochdadh, rè obrachadh cruinneachaidhean, gu robh sinn dha-rìribh ag iarraidh fèin-ghluasad san dòigh cheart. Chaidh na gnìomhan beaga sin uile fhuasgladh le bhith a ’cleachdadh sgriobtaichean bash sìmplidh, ged, mar a tha fios agad, tha e nas fheàrr gnìomhaichean a sgrìobhadh ann an Golang. Gu dearbh, bhiodh tasgadh ann an làn-sgèile leasachadh gnìomhaiche airson gach gnìomh beag mar sin neo-èifeachdach.

Gnìomhaiche ann an 15 mionaidean

Bheir sinn sùil air eisimpleir de na ghabhas a dhèanamh fèin-ghluasadach ann an cruinneachadh Kubernetes agus mar as urrainn don ghnìomhaiche sligean cuideachadh. Bhiodh eisimpleir mar a leanas: ag ath-aithris dìomhaireachd gus faighinn gu clàr an docker.

Feumaidh pods a bhios a’ cleachdadh ìomhaighean bho chlàr prìobhaideach ceangal follaiseach a bhith aca ri dìomhaireachd le dàta airson faighinn chun chlàr. Feumar an dìomhair seo a chruthachadh anns gach ainm-àite mus cruthaichear pods. Faodar seo a dhèanamh le làimh, ach ma shuidhicheas sinn àrainneachdan fiùghantach, bidh an t-àite ainm airson aon iarrtas gu bhith tòrr. Agus mura h-eil 2-3 tagradh ann an dàrna cuid ... bidh an àireamh de dhìomhaireachd gu math mòr. Agus aon rud eile mu dhìomhaireachd: bu mhath leam an iuchair atharrachadh gus faighinn chun chlàr bho àm gu àm. Mu dheireadh, obrachaidhean làimhe mar fhuasgladh gu tur neo-èifeachdach - feumaidh sinn cruthachadh agus ùrachadh dìomhaireachdan gu fèin-ghluasadach.

Automation sìmplidh

Sgrìobhamaid sgriobt slige a ruitheas aon uair gach N diog agus a nì sgrùdadh air àiteachan ainmean airson dìomhaireachd a bhith ann, agus mura h-eil dìomhaireachd ann, thèid a chruthachadh. Is e buannachd an fhuasglaidh seo gu bheil e coltach ri sgriobt shligean ann an cron - dòigh-obrach clasaigeach agus so-thuigsinn don h-uile duine. Is e an ana-cothrom a th’ ann gum faodar àite-ainm ùr a chruthachadh san eadar-ama eadar an cur air bhog agus gum fuirich e às aonais dìomhaireachd airson ùine, a dh’ adhbhraicheas mearachdan ann a bhith a’ cur air bhog pods.

Automation le slige-obrachaidh

Gus an obraich an sgriobt againn gu ceart, feumar cur air bhog a chuir an àite an cur air bhog clasaigeach cron nuair a thèid àite-ainm a chur ris: anns a’ chùis seo, faodaidh tu dìomhaireachd a chruthachadh mus cleachd thu e. Chì sinn mar a chuireas sinn seo an gnìomh le bhith a’ cleachdadh slige-ghnìomhaiche.

An toiseach, leig dhuinn sùil a thoirt air an sgriobt. Canar dubhan ri sgriobtaichean ann an teirmean gnìomhaiche sligean. A h-uile dubhan nuair a ruith le bratach --config ag innse don ghnìomhaiche shligean mu na ceanglachan aige, i.e. air dè na tachartasan a bu chòir a chur air bhog. Anns a 'chùis againn cleachdaidh sinn onKubernetesEvent:

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

Tha e air a mhìneachadh an seo gu bheil ùidh againn tachartasan a chuir ris (add) nithean de sheòrsa namespace.

A-nis feumaidh tu an còd a chuir ris a thèid a chuir gu bàs nuair a thachras an tachartas:

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

Sgoinneil! B 'e an toradh sgriobt beag, brèagha. Gus a “ath-bheothachadh”, tha dà cheum air fhàgail: ullaich an ìomhaigh agus cuir air bhog e sa bhuidheann.

Ag ullachadh ìomhaigh le dubhan

Ma choimheadas tu air an sgriobt, chì thu gu bheil na h-òrdughan gan cleachdadh kubectl и jq. Tha seo a’ ciallachadh gum feum na rudan a leanas a bhith san ìomhaigh: an dubhan againn, gnìomhaiche slige a dh’èisteas ri tachartasan agus a ruitheas an dubhan, agus na h-àitheantan a chleachdas an dubhan (kubectl agus jq). Tha ìomhaigh deiseil aig Hub.docker.com mu thràth anns a bheil slige-ghnìomhaiche, kubectl agus jq air am pacadh. Chan eil air fhàgail ach dubhan sìmplidh a chur ris 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

A 'ruith ann an brabhsair

Bheir sinn sùil air an dubhan a-rithist agus an turas seo sgrìobh sìos dè na gnìomhan agus leis na nithean a bhios e a’ coileanadh sa bhuidheann:

  1. fo-sgrìobhadh do thachartasan cruthachadh spacespace;
  2. a’ cruthachadh dìomhaireachd ann an ainmean eile seach an tè far a bheil e air a chur air bhog.

Tha e a 'tionndadh a-mach gum feum cead a bhith aig a' pod anns an tèid an ìomhaigh againn a chuir air bhog na gnìomhan sin a dhèanamh. Faodar seo a dhèanamh le bhith a’ cruthachadh do chunntas seirbheis fhèin. Feumar an cead a dhèanamh ann an cruth ClusterRole agus ClusterRoleBinding, oir tha ùidh againn ann an nithean bhon bhuidheann gu lèir.

Bidh an tuairisgeul deireannach ann an YAML a’ coimhead rudeigin mar seo:

---
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

Faodaidh tu an ìomhaigh cruinnichte a chuir air bhog mar chleachdadh sìmplidh:

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

Airson goireasachd, thèid àite-ainm fa leth a chruthachadh far an tèid an gnìomhaiche sligean a chuir air bhog agus thèid na taisbeanaidhean cruthaichte a chuir an sàs:

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

Sin agad e: tòisichidh an gnìomhaiche sligean, fo-sgrìobh gu tachartasan cruthachaidh namespace agus ruithidh e an dubhan nuair a bhios feum air.

A’ toirt a-steach gnìomhaiche shligean: bha cruthachadh gnìomhaichean airson Kubernetes dìreach air fàs nas fhasa

Mar sin, thionndaidh sgriobt shligean sìmplidh gu bhith na fhìor ghnìomhaiche airson Kubernetes agus ag obair mar phàirt de bhuidheann. Agus seo uile às aonais pròiseas iom-fhillte a bhith a 'leasachadh ghnìomhaichean ann an Golang:

A’ toirt a-steach gnìomhaiche shligean: bha cruthachadh gnìomhaichean airson Kubernetes dìreach air fàs nas fhasa

Tha dealbh eile air a' chuspair seo...A’ toirt a-steach gnìomhaiche shligean: bha cruthachadh gnìomhaichean airson Kubernetes dìreach air fàs nas fhasa

Nochdaidh sinn a bhrìgh ann am fear de na foillseachaidhean a leanas.

criathradh

Tha e math lorg nithean, ach gu tric feumar dèiligeadh riutha ag atharrachadh cuid de fheartan nithean, mar eisimpleir, gus an àireamh de mhac-samhail ann an Cleachdadh atharrachadh no gus bileagan nì atharrachadh.

Nuair a ruigeas tachartas, gheibh an gnìomhaiche shligean am foillseachadh JSON den nì. Is urrainn dhuinn na feartan anns a bheil ùidh againn anns an JSON seo a thaghadh agus an dubhan a ruith a-mhàin nuair a dh'atharraicheas iad. Tha raon ann airson seo jqFilter, far am feum thu an abairt jq a shònrachadh a thèid a chuir an sàs ann am manifesto JSON.

Mar eisimpleir, gus freagairt a thoirt do dh'atharrachaidhean ann an bileagan airson stuthan cleachdadh, feumaidh tu an raon a shìoladh labels as an raon metadata. Bidh an rèiteachadh mar seo:

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

Bidh an abairt jqFilter seo a’ tionndadh foillseachadh fada JSON deployment gu JSON goirid le bileagan:

A’ toirt a-steach gnìomhaiche shligean: bha cruthachadh gnìomhaichean airson Kubernetes dìreach air fàs nas fhasa

cha ruith shell-operator an dubhan ach nuair a dh’ atharraicheas an JSON goirid seo is nach tèid atharraichean air feartan eile a leigeil seachad.

Co-theacs cur air bhog Hook

Leigidh an rèiteachadh dubhan leat grunn roghainnean a shònrachadh airson tachartasan - mar eisimpleir, roghainnean 2 airson tachartasan bho Kubernetes agus 2 chlàr:

{"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"
]}

Gluasad beag: tha, tha gnìomhaiche slige a’ toirt taic ruith sgriobtaichean stoidhle crontab. Gheibhear tuilleadh mion-fhiosrachaidh ann an sgrìobhainnean.

Gus faighinn a-mach carson a chaidh an dubhan a chuir air bhog, bidh an gnìomhaiche sligean a’ cruthachadh faidhle sealach agus a’ dol seachad air an t-slighe thuige ann an caochladair chun dubhan BINDING_CONTEXT_TYPE. Anns an fhaidhle tha tuairisgeul JSON air an adhbhar airson an dubhan a ruith. Mar eisimpleir, a h-uile 10 mionaidean ruithidh an dubhan leis an t-susbaint a leanas:

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

... agus air Diluain tòisichidh e le seo:

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

airson onKubernetesEvent Bidh barrachd luchd-brosnachaidh JSON ann, oir tha tuairisgeul ann air an nì:

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

Faodar susbaint nan raointean a thuigsinn bho na h-ainmean aca, agus faodar barrachd fiosrachaidh a leughadh a-steach sgrìobhainnean. Eisimpleir de bhith a’ faighinn ainm stòrais bho raon resourceName tha cleachdadh jq air a shealltainn mar-thà ann an dubhan a tha ag ath-aithris dìomhaireachdan:

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

Gheibh thu raointean eile san aon dòigh.

Dè a-nis?

Ann an stòr a’ phròiseict, ann an / mar eisimpleir clàran, tha eisimpleirean ann de dubhan a tha deiseil airson ruith air braisle. Nuair a bhios tu a’ sgrìobhadh na dubhan agad fhèin, faodaidh tu an cleachdadh mar bhunait.

Tha taic ann airson metrics a chruinneachadh a’ cleachdadh Prometheus - tha na meatrach a tha rim faighinn air am mìneachadh san earrann MEADHAIREAN.

Mar a shaoileadh tu, tha an gnìomhaiche shligean sgrìobhte ann an Go agus air a chuairteachadh fo chead Open Source (Apache 2.0). Bidh sinn taingeil airson taic leasachaidh sam bith pròiseact air GitHub: agus reultan, agus cùisean, agus tarraing iarrtasan.

A’ togail brat dìomhaireachd, innsidh sinn dhut cuideachd gur e gnìomhaiche sligean a th’ ann beag mar phàirt den t-siostam againn as urrainn tuilleadan a chuir a-steach ann an cruinneachadh Kubernetes ùrachadh agus diofar ghnìomhan fèin-ghluasadach a dhèanamh. Leugh tuilleadh mun t-siostam seo dh ’innis gu litireil Diluain aig HighLoad ++ 2019 ann an St. Petersburg - bidh sinn a’ foillseachadh a’ bhidio agus an tar-sgrìobhadh den aithisg seo a dh’ aithghearr.

Tha plana againn gus an còrr den t-siostam seo fhosgladh: an addon-operator agus ar cruinneachadh de dubhan agus mhodalan. Co-dhiù, tha addon-operator mu thràth ri fhaighinn air github, ach tha na sgrìobhainnean air a shon fhathast air an t-slighe. Thathas an dùil an cruinneachadh de mhodalan a leigeil ma sgaoil airson an t-samhraidh.

Cum sùil air!

PS

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann