Iepazīstinām ar čaulas operatoru: operatoru izveide Kubernetes ir kļuvusi vienkāršāka

Mūsu emuārā jau ir bijuši raksti par to operatora iespējas Kubernetes un kā pats uzraksti vienkāršu operatoru. Šoreiz vēlamies jūsu uzmanībai iepazīstināt ar mūsu atvērtā pirmkoda risinājumu, kas operatoru izveidi paceļ ļoti vienkāršā līmenī - iepazīstieties čaulas operators!

Kāpēc?

Apvalka operatora ideja ir pavisam vienkārša: abonējiet notikumus no Kubernetes objektiem un, kad šie notikumi ir saņemti, palaidiet ārēju programmu, nodrošinot tai informāciju par notikumu:

Iepazīstinām ar čaulas operatoru: operatoru izveide Kubernetes ir kļuvusi vienkāršāka

Nepieciešamība pēc tā radās, kad klasteru darbības laikā sāka parādīties nelieli uzdevumi, kurus mēs patiešām vēlējāmies automatizēt pareizi. Visi šie mazie uzdevumi tika atrisināti, izmantojot vienkāršus bash skriptus, lai gan, kā jūs zināt, labāk ir rakstīt operatorus Golangā. Acīmredzot investēt pilna mēroga operatora attīstībā katram tik mazam uzdevumam būtu neefektīvi.

Operators 15 minūtēs

Apskatīsim piemēru, ko var automatizēt Kubernetes klasterī un kā var palīdzēt čaulas operators. Piemērs varētu būt šāds: noslēpuma replicēšana, lai piekļūtu docker reģistram.

Aplikācijas, kurās tiek izmantoti attēli no privāta reģistra, manifestā ir jāietver saite uz noslēpumu ar datiem, lai piekļūtu reģistram. Šis noslēpums ir jāizveido katrā nosaukumvietā pirms aplikumu izveides. To var izdarīt manuāli, bet, ja mēs iestatīsim dinamiskas vides, tad vienas lietojumprogrammas nosaukumvietas būs daudz. Un ja arī nav 2-3 pieteikumu... noslēpumu skaits kļūst ļoti liels. Un vēl viena lieta par noslēpumiem: es vēlētos laiku pa laikam mainīt atslēgu, lai piekļūtu reģistram. Galu galā, manuālās darbības kā risinājums pilnīgi neefektīva — mums ir jāautomatizē noslēpumu izveide un atjaunināšana.

Vienkārša automatizācija

Uzrakstīsim čaulas skriptu, kas palaižas reizi N sekundēs un pārbauda, ​​vai nosaukumvietās nav noslēpuma, un, ja noslēpuma nav, tad tas tiek izveidots. Šī risinājuma priekšrocība ir tāda, ka tas izskatās pēc čaulas skripta cron valodā - klasiska un visiem saprotama pieeja. Negatīvā puse ir tāda, ka intervālā starp tā palaišanu var izveidot jaunu nosaukumvietu un kādu laiku tā paliks bez noslēpuma, kas novedīs pie kļūdām podiņu palaišanā.

Automatizācija ar čaulas operatoru

Lai mūsu skripts darbotos pareizi, klasiskā cron palaišana ir jāaizstāj ar palaišanu, kad tiek pievienota nosaukumvieta: šajā gadījumā pirms tā izmantošanas varat izveidot noslēpumu. Apskatīsim, kā to ieviest, izmantojot čaulas operatoru.

Vispirms apskatīsim skriptu. Skriptus čaulas operatora terminos sauc par āķiem. Katrs āķis, kad skrien ar karogu --config informē čaulas operatoru par saviem iesējumiem, t.i. par kādiem pasākumiem tas būtu jāuzsāk. Mūsu gadījumā mēs izmantosim onKubernetesEvent:

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

Šeit ir aprakstīts, ka mēs esam ieinteresēti pievienot notikumus (add) tipa objekti namespace.

Tagad jums jāpievieno kods, kas tiks izpildīts, kad notiks notikums:

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

Lieliski! Rezultāts bija mazs, skaists scenārijs. Lai to “atdzīvinātu”, ir atlikušas divas darbības: sagatavojiet attēlu un palaidiet to klasterī.

Attēla sagatavošana ar āķi

Ja paskatās uz skriptu, jūs varat redzēt, ka komandas tiek izmantotas kubectl и jq. Tas nozīmē, ka attēlā ir jābūt šādām lietām: mūsu āķis, apvalka operators, kas pārraudzīs notikumus un palaidīs āķi, un āķa izmantotās komandas (kubectl un jq). Vietnē Hub.docker.com jau ir gatavs attēls, kurā ir iepakoti čaulas operators, kubectl un jq. Atliek tikai pievienot vienkāršu āķi 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

Skriešana klasterī

Apskatīsim āķi vēlreiz un šoreiz pierakstīsim, kādas darbības un ar kādiem objektiem tas klasterī veic:

  1. abonē nosaukumvietas izveides pasākumus;
  2. izveido noslēpumu citās nosaukumvietās, nevis tajā, kur tas tiek palaists.

Izrādās, ka podam, kurā tiks palaists mūsu attēls, ir jābūt atļaujām veikt šīs darbības. To var izdarīt, izveidojot savu ServiceAccount. Atļauja ir jāveic ClusterRole un ClusterRoleBinding formātā, jo mūs interesē objekti no visa klastera.

Galīgais YAML apraksts izskatīsies apmēram šādi:

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

Varat palaist salikto attēlu kā vienkāršu izvietošanu:

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

Ērtības labad tiek izveidota atsevišķa nosaukumvieta, kurā tiks palaists čaulas operators un tiks lietoti izveidotie manifesti:

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

Tas arī viss: čaulas operators sāks darbu, abonēs nosaukumvietas izveides pasākumus un palaidīs āķi, kad nepieciešams.

Iepazīstinām ar čaulas operatoru: operatoru izveide Kubernetes ir kļuvusi vienkāršāka

Tātad, vienkāršs čaulas skripts kļuva par īstu Kubernetes operatoru un darbojas kā klastera daļa. Un tas viss bez sarežģīta operatoru izstrādes procesa Golangā:

Iepazīstinām ar čaulas operatoru: operatoru izveide Kubernetes ir kļuvusi vienkāršāka

Šim jautājumam ir vēl viena ilustrācija...Iepazīstinām ar čaulas operatoru: operatoru izveide Kubernetes ir kļuvusi vienkāršāka

Sīkāk tā nozīmi atklāsim kādā no turpmākajām publikācijām.

filtrēšana

Objektu izsekošana ir laba, taču bieži vien ir jāreaģē mainot dažas objekta īpašības, piemēram, lai mainītu izvietošanas reprodukciju skaitu vai mainītu objektu etiķetes.

Kad pienāk notikums, čaulas operators saņem objekta JSON manifestu. Mēs varam atlasīt rekvizītus, kas mūs interesē šajā JSON, un palaist āķi tikai kad tie mainās. Tam ir lauks jqFilter, kur jānorāda jq izteiksme, kas tiks lietota JSON manifestā.

Piemēram, lai reaģētu uz izmaiņām izvietošanas objektu etiķetēs, jums ir jāfiltrē lauks labels ārpus lauka metadata. Konfigurācija būs šāda:

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

Šī jqFilter izteiksme pārvērš izvietošanas garo JSON manifestu par īsu JSON ar etiķetēm:

Iepazīstinām ar čaulas operatoru: operatoru izveide Kubernetes ir kļuvusi vienkāršāka

shell-operator palaidīs āķi tikai tad, kad tiks mainīts šis īsais JSON, un citu rekvizītu izmaiņas tiks ignorētas.

Āķa palaišanas konteksts

Āķa konfigurācija ļauj norādīt vairākas notikumu opcijas, piemēram, 2 iespējas notikumiem no Kubernetes un 2 grafikus:

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

Neliela atkāpe: jā, čaulas operatoru atbalsta darbojas crontab stila skripti. Sīkāku informāciju var atrast dokumentācija.

Lai atšķirtu, kāpēc āķis tika palaists, čaulas operators izveido pagaidu failu un nodod ceļu uz to mainīgajā āķim BINDING_CONTEXT_TYPE. Failā ir JSON apraksts par āķa palaišanas iemeslu. Piemēram, ik pēc 10 minūtēm āķis darbosies ar šādu saturu:

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

... un pirmdien tas sāksies ar šo:

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

Par onKubernetesEvent Būs vairāk JSON aktivizētāju, jo tajā ir objekta apraksts:

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

Lauku saturu var saprast pēc to nosaukumiem, un sīkāku informāciju var izlasīt dokumentācija. Piemērs resursa nosaukuma iegūšanai no lauka resourceName jq izmantošana jau ir parādīta āķī, kas atkārto noslēpumus:

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

Līdzīgā veidā varat iegūt citus laukus.

Ko tālāk?

Projektu krātuvē, in /examples direktoriji, ir piemēri āķiem, kas ir gatavi darbam klasterī. Rakstot savus āķus, varat tos izmantot par pamatu.

Ir atbalsts metrikas apkopošanai, izmantojot Prometheus – pieejamie rādītāji ir aprakstīti sadaļā METRIKA.

Kā jūs varētu nojaust, čaulas operators ir rakstīts programmā Go un izplatīts saskaņā ar atvērtā pirmkoda licenci (Apache 2.0). Būsim pateicīgi par jebkādu palīdzību attīstībai projekts vietnē GitHub: un zvaigznes, un problēmas, un izvilkšanas pieprasījumi.

Paceļot noslēpuma plīvuru, informēsim arī, ka čaulas operators ir mazs daļa no mūsu sistēmas, kas var atjaunināt Kubernetes klasterī instalētos papildinājumus un veikt dažādas automātiskas darbības. Lasiet vairāk par šo sistēmu stāstīja burtiski pirmdien HighLoad++ 2019 Sanktpēterburgā - drīzumā publicēsim šī ziņojuma video un atšifrējumu.

Mums ir plāns atvērt pārējo sistēmu: papildinājumu operatoru un mūsu āķu un moduļu kolekciju. Starp citu, addon-operators jau ir pieejams vietnē github, taču tā dokumentācija vēl ir ceļā. Moduļu kolekcijas iznākšana plānota vasarā.

Sekojiet līdzi!

PS

Lasi arī mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru