Tutvustame shell-operaatorit: operaatorite loomine Kubernetese jaoks muutus just lihtsamaks

Meie ajaveebis on juba artikleid, millest räägitakse operaatori võimalused Kubernetesis ja kuidas kirjutage ise lihtne operaator. Seekord soovime teie tähelepanu pöörata meie avatud lähtekoodiga lahendusele, mis viib operaatorite loomise ülilihtsale tasemele - vaadake kesta operaator!

Miks?

Shell-operaatori idee on üsna lihtne: tellige Kubernetese objektide sündmused ja kui need sündmused on vastu võetud, käivitage väline programm, pakkudes sellele sündmuse kohta teavet:

Tutvustame shell-operaatorit: operaatorite loomine Kubernetese jaoks muutus just lihtsamaks

Vajadus selle järele tekkis siis, kui klastrite töö käigus hakkasid tekkima väikesed ülesanded, mida tahtsime väga õigel viisil automatiseerida. Kõik need väikesed ülesanded lahendati lihtsate bash-skriptide abil, kuigi nagu teate, on parem kirjutada operaatorid Golangi keeles. Ilmselgelt oleks iga sellise väikese ülesande puhul operaatori täiemahulisse arendusse investeerimine ebaefektiivne.

Operaator 15 minuti pärast

Vaatame näidet selle kohta, mida saab Kubernetese klastris automatiseerida ja kuidas saab aidata shell-operaator. Näide oleks järgmine: saladuse replikatsioon dokkeri registrile juurdepääsuks.

Eraregistri kujutisi kasutavad kaustad peavad oma manifestis sisaldama linki registrile juurdepääsu andmetega saladusele. See saladus tuleb enne kaunade loomist luua igas nimeruumis. Seda saab teha käsitsi, kuid kui seadistame dünaamilised keskkonnad, muutub ühe rakenduse nimeruumi palju. Ja kui pole ka 2-3 rakendust... saladuste arv muutub väga suureks. Ja veel üks asi saladuste kohta: ma tahaksin aeg-ajalt registrile juurdepääsu võtit vahetada. Lõpuks käsitsi toimingud lahendusena täiesti ebaefektiivne — peame automatiseerima saladuste loomise ja värskendamise.

Lihtne automatiseerimine

Kirjutame shelliskripti, mis jookseb kord iga N sekundi järel ja kontrollib nimeruumides saladuse olemasolu ja kui saladust pole, siis see luuakse. Selle lahenduse eeliseks on see, et see näeb välja nagu shelliskript Cron - klassikaline ja kõigile arusaadav lähenemine. Negatiivne külg on see, et selle käivitamise vahelisel ajal saab luua uue nimeruumi ja see jääb mõnda aega saladuseks, mis toob kaasa vigu kaunade käivitamisel.

Automatiseerimine shell-operaatoriga

Meie skripti korrektseks toimimiseks tuleb nimeruumi lisamisel klassikaline cron käivitamine asendada käivitamisega: sel juhul saate enne selle kasutamist luua saladuse. Vaatame, kuidas seda shell-operaatori abil rakendada.

Kõigepealt vaatame skripti. Shell-operaatori terminites skripte nimetatakse konksudeks. Iga konks lipuga joostes --config teatab shell-operaatorile oma sidemetest, s.o. millistel üritustel seda käivitada. Meie puhul kasutame onKubernetesEvent:

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

Siin on kirjeldatud, et oleme huvitatud sündmuste lisamisest (add) tüüpi objektid namespace.

Nüüd peate lisama koodi, mis käivitatakse sündmuse toimumisel:

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

Suurepärane! Tulemuseks oli väike ilus stsenaarium. Selle "elustamiseks" on jäänud kaks sammu: valmistage pilt ette ja käivitage see klastris.

Pildi ettevalmistamine konksuga

Kui vaatate skripti, näete, et käske kasutatakse kubectl и jq. See tähendab, et pildil peavad olema järgmised asjad: meie konks, shell-operaator, mis jälgib sündmusi ja käivitab konksu, ning konksu kasutatavad käsud (kubectl ja jq). Hub.docker.com-il on juba valmis pilt, kuhu on pakendatud shell-operator, kubectl ja jq. Jääb vaid lisada lihtne konks 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

Kobaras jooksmine

Vaatame uuesti konksu ja paneme seekord kirja, milliseid toiminguid ja milliste objektidega ta klastris teeb:

  1. tellib nimeruumi loomise üritusi;
  2. loob saladuse muudes nimeruumides peale selle, kus see käivitatakse.

Selgub, et podil, milles meie pilt käivitatakse, peavad olema nende toimingute tegemiseks õigused. Seda saab teha oma teenusekonto loomisega. Luba tuleb teha vormis ClusterRole ja ClusterRoleBinding, sest meid huvitavad objektid kogu klastrist.

Lõplik kirjeldus YAML-is näeb välja umbes selline:

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

Saate käivitada kokkupandud pildi lihtsa juurutusena:

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

Mugavuse huvides luuakse eraldi nimeruum, kus käivitatakse shell-operaator ja rakendatakse loodud manifeste:

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

See on kõik: shell-operaator käivitab, tellib nimeruumi loomise sündmused ja käivitab vajaduse korral konksu.

Tutvustame shell-operaatorit: operaatorite loomine Kubernetese jaoks muutus just lihtsamaks

Seega lihtsast shelliskriptist sai Kubernetese tõeline operaator ja töötab klastri osana. Ja seda kõike ilma Golangi operaatorite arendamise keeruka protsessita:

Tutvustame shell-operaatorit: operaatorite loomine Kubernetese jaoks muutus just lihtsamaks

Sellel teemal on veel üks näide ...Tutvustame shell-operaatorit: operaatorite loomine Kubernetese jaoks muutus just lihtsamaks

Avaldame selle tähendust üksikasjalikumalt ühes järgmistest väljaannetest.

filtreerimine

Objektide jälgimine on hea, kuid sageli on vaja reageerida mõne objekti omaduse muutmine, näiteks et muuta juurutuses olevate koopiate arvu või muuta objektide silte.

Sündmuse saabumisel võtab shell-operaator vastu objekti JSON-manifesti. Saame selles JSON-is valida meid huvitavad atribuudid ja käivitada konksu ainult kui nad muutuvad. Selle jaoks on väli jqFilter, kus peate määrama jq-avaldise, mis rakendatakse JSON-i manifestile.

Näiteks juurutusobjektide siltide muudatustele reageerimiseks peate välja filtreerima labels põllult välja metadata. Konfiguratsioon saab olema selline:

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

See jqFilteri avaldis muudab juurutamise pika JSON-manifesti lühikeseks JSON-iks koos siltidega:

Tutvustame shell-operaatorit: operaatorite loomine Kubernetese jaoks muutus just lihtsamaks

shell-operator käivitab konksu ainult siis, kui see lühike JSON muutub, ja muude atribuutide muudatusi eiratakse.

Konksu käivitamise kontekst

Konksu konfiguratsioon võimaldab määrata sündmuste jaoks mitu valikut – näiteks 2 võimalust Kubernetese sündmuste jaoks ja 2 ajakava:

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

Väike kõrvalepõige: jah, shell-operaatori toed crontab stiilis skriptide käivitamine. Rohkem üksikasju leiate aadressilt dokumentatsioon.

Et eristada, miks konks käivitati, loob shell-operaator ajutise faili ja edastab selle tee konksule muutujana BINDING_CONTEXT_TYPE. Fail sisaldab konksu käivitamise põhjuse JSON-i kirjeldust. Näiteks iga 10 minuti järel jookseb konks järgmise sisuga:

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

... ja esmaspäeval algab see järgmisega:

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

eest onKubernetesEvent JSON-päästikuid on rohkem, sest see sisaldab objekti kirjeldust:

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

Väljade sisust saab aru nende nimede järgi ja täpsemalt saab sisse lugeda dokumentatsioon. Näide väljalt ressursi nime hankimisest resourceName jq kasutamist on juba näidatud konksus, mis kordab saladusi:

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

Sarnasel viisil saate hankida ka teisi välju.

Mis edasi?

Projekti hoidlas, sisse /examples kataloogid, on näiteid konksudest, mis on klastris kasutamiseks valmis. Oma konksude kirjutamisel saate neid aluseks võtta.

Prometheuse abil mõõdikute kogumisel on tugi – saadaolevaid mõõdikuid kirjeldatakse jaotises MEETRIKA.

Nagu võite arvata, on shell-operaator kirjutatud Go-s ja seda levitatakse avatud lähtekoodiga litsentsi (Apache 2.0) alusel. Oleme tänulikud igasuguse arenguabi eest projekt GitHubis: ja tärnid ning väljaanded ja tõmbamistaotlused.

Saladusloori kergitades anname ka teada, et shell-operaator on väike osa meie süsteemist, mis suudab hoida Kubernetese klastris installitud lisandmooduleid ajakohasena ja teha erinevaid automaatseid toiminguid. Lugege selle süsteemi kohta lisateavet rääkinud sõna otseses mõttes esmaspäeval Peterburis HighLoad++ 2019 – peagi avaldame selle raporti video ja ärakirja.

Meil on plaan avada ülejäänud süsteem: lisandmoodul ning meie konksude ja moodulite kollektsioon. Muide, addon-operator on juba olemas saadaval githubis, kuid selle dokumentatsioon on alles pooleli. Moodulite kollektsiooni väljaandmine on planeeritud suveks.

Hoia!

PS

Loe ka meie blogist:

Allikas: www.habr.com

Lisa kommentaar