L-introduzzjoni ta' shell-operator: il-ħolqien ta' operaturi għal Kubernetes sar aktar faċli

Diġà kien hemm artikli fuq il-blog tagħna li jitkellmu dwarhom kapaċitajiet tal-operatur f'Kubernetes u kif ikteb operatur sempliċi lilek innifsek. Din id-darba nixtiequ nippreżentaw għall-attenzjoni tiegħek is-soluzzjoni Open Source tagħna, li tieħu l-ħolqien ta' operaturi għal livell super-faċli - iċċekkja operatur tal-qoxra!

Għaliex?

L-idea ta 'operatur tal-qoxra hija pjuttost sempliċi: abbona għal avvenimenti minn oġġetti Kubernetes, u meta dawn l-avvenimenti jiġu riċevuti, iniedi programm estern, billi tipprovdih b'informazzjoni dwar l-avveniment:

L-introduzzjoni ta' shell-operator: il-ħolqien ta' operaturi għal Kubernetes sar aktar faċli

Il-ħtieġa għaliha qamet meta, waqt it-tħaddim tar-raggruppamenti, bdew jidhru ħidmiet żgħar li verament ridna awtomatizzaw bil-mod it-tajjeb. Dawn il-kompiti żgħar kollha ġew solvuti bl-użu ta 'skripts bash sempliċi, għalkemm, kif tafu, huwa aħjar li tikteb operaturi f'Golang. Ovvjament, l-investiment fl-iżvilupp fuq skala sħiħa ta' operatur għal kull kompitu żgħir bħal dan ikun ineffettiv.

Operatur fi 15-il minuta

Ejja nħarsu lejn eżempju ta 'x'jista' jiġi awtomatizzat fi cluster Kubernetes u kif l-operatur tal-qoxra jista 'jgħin. Eżempju jkun dan li ġej: replika ta' sigriet biex taċċessa r-reġistru tad-docker.

Il-miżwed li jużaw immaġini minn reġistru privat għandu jkun fihom fil-manifest tagħhom link għal sigriet b'dejta għall-aċċess tar-reġistru. Dan is-sigriet għandu jinħoloq f'kull namespace qabel ma jinħolqu l-imżiewed. Dan jista 'jsir manwalment, iżda jekk inwaqqfu ambjenti dinamiċi, allura l-ispazju tal-isem għal applikazzjoni waħda se jsir ħafna. U jekk ma jkunx hemm ukoll 2-3 applikazzjonijiet... in-numru ta 'sigrieti jsir kbir ħafna. U ħaġa oħra dwar is-sigrieti: nixtieq nibdel iċ-ċavetta biex taċċessa r-reġistru minn żmien għal żmien. Eventwalment, operazzjonijiet manwali bħala soluzzjoni kompletament ineffettiv — jeħtieġ li nawtomatizzaw il-ħolqien u l-aġġornament tas-sigrieti.

Awtomazzjoni sempliċi

Ejja nikteb script shell li jibda darba kull N sekondi u jiċċekkja namespaces għall-preżenza ta 'sigriet, u jekk ma jkunx hemm sigriet, allura jinħoloq. Il-vantaġġ ta 'din is-soluzzjoni huwa li tidher qisha script shell f'cron - approċċ klassiku u li jinftiehem għal kulħadd. L-iżvantaġġ huwa li fl-intervall bejn it-tnedija tiegħu jista 'jinħoloq namespace ġdid u għal xi żmien jibqa' mingħajr sigriet, li jwassal għal żbalji fit-tnedija tal-miżwed.

Awtomazzjoni ma 'shell-operatur

Biex l-iskrittura tagħna taħdem b'mod korrett, it-tnedija klassika tal-cron jeħtieġ li tiġi sostitwita b'tnedija meta jiżdied namespace: f'dan il-każ, tista 'toħloq sigriet qabel ma tużah. Ejja naraw kif timplimenta dan billi tuża shell-operator.

L-ewwel, ejja nħarsu lejn l-iskrittura. Skripts f'termini ta 'shell-operator jissejħu ganċijiet. Kull ganċ meta jitmexxa bil-bandiera --config jinforma lill-operatur tal-qoxra dwar l-irbit tiegħu, i.e. fuq liema avvenimenti għandha titnieda. Fil-każ tagħna se nużaw onKubernetesEvent:

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

Hawnhekk huwa deskritt li aħna interessati li nżidu avvenimenti (add) oġġetti tat-tip namespace.

Issa trid iżżid il-kodiċi li se jiġi esegwit meta jseħħ l-avveniment:

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

Kbir! Ir-riżultat kien skript żgħir u sabiħ. Biex "tqajjem" dan, fadal żewġ passi: ipprepara l-immaġni u tniediha fil-cluster.

Tħejjija ta 'immaġni b'ganċ

Jekk tħares lejn l-iskrittura, tista 'tara li l-kmandi huma użati kubectl и jq. Dan ifisser li l-immaġni għandu jkollha l-affarijiet li ġejjin: il-ganċ tagħna, operatur tal-qoxra li se jimmonitorja l-avvenimenti u jmexxi l-ganċ, u l-kmandi użati mill-ganċ (kubectl u jq). Hub.docker.com diġà għandu immaġni lesta li fiha shell-operator, kubectl u jq huma ppakkjati. Li jibqa 'huwa li żżid ganċ sempliċ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

Running fi cluster

Ejja nerġgħu nħarsu lejn il-ganċ u din id-darba ikteb liema azzjonijiet u b'liema oġġetti twettaq fil-cluster:

  1. jissottoskrivi għal avvenimenti ta' ħolqien ta' spazju tal-isem;
  2. joħloq sigriet fl-ispazji tal-isem minbarra dak fejn jiġi mniedi.

Jirriżulta li l-pod li fih se tkun imnedija l-immaġni tagħna jrid ikollu permessi biex jagħmel dawn l-azzjonijiet. Dan jista' jsir billi toħloq ServiceAccount tiegħek stess. Il-permess għandu jsir fil-forma ta 'ClusterRole u ClusterRoleBinding, għaliex aħna interessati fl-oġġetti mill-cluster kollu.

Id-deskrizzjoni finali f'YAML tidher xi ħaġa bħal din:

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

Tista' tniedi l-immaġni immuntata bħala Skjerament sempliċi:

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

Għall-konvenjenza, jinħoloq spazju tal-isem separat fejn jitnieda l-operatur tal-qoxra u jiġu applikati l-manifesti maħluqa:

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

Dak kollu: l-operatur tal-qoxra se jibda, jissottoskrivi għall-avvenimenti tal-ħolqien tal-ispazji tal-isem u jmexxi l-ganċ meta jkun meħtieġ.

L-introduzzjoni ta' shell-operator: il-ħolqien ta' operaturi għal Kubernetes sar aktar faċli

Għalhekk, il- script shell sempliċi inbidel f'operatur reali għal Kubernetes u jaħdem bħala parti minn raggruppament. U dan kollu mingħajr il-proċess kumpless ta 'żvilupp ta' operaturi f'Golang:

L-introduzzjoni ta' shell-operator: il-ħolqien ta' operaturi għal Kubernetes sar aktar faċli

Hemm illustrazzjoni oħra dwar din il-kwistjoni...L-introduzzjoni ta' shell-operator: il-ħolqien ta' operaturi għal Kubernetes sar aktar faċli

Se niżvelaw it-​tifsira tiegħu f’aktar dettall f’waħda mill-​pubblikazzjonijiet li ġejjin.

filtrazzjoni

It-traċċar tal-oġġetti huwa tajjeb, iżda ħafna drabi jkun hemm bżonn li tirreaġixxi għalihom jibdlu xi proprjetajiet ta 'oġġett, pereżempju, biex tbiddel in-numru ta 'repliki fl-Iskjerament jew biex tbiddel it-tikketti tal-oġġetti.

Meta jasal avveniment, l-operatur tal-qoxra jirċievi l-manifest JSON tal-oġġett. Nistgħu nagħżlu l-proprjetajiet li jinteressawna f'dan il-JSON u nħaddmu l-ganċ biss meta jinbidlu. Hemm qasam għal dan jqFilter, fejn għandek bżonn tispeċifika l-espressjoni jq li se tiġi applikata għall-manifest JSON.

Pereżempju, biex twieġeb għal bidliet fit-tikketti għall-oġġetti ta' Deployment, għandek bżonn tiffiltra l-qasam labels barra mill-għalqa metadata. Il-konfigurazzjoni se tkun bħal din:

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

Din l-espressjoni jqFilter tibdel il-manifest JSON twil ta' Deployment f'JSON qasir b'tikketti:

L-introduzzjoni ta' shell-operator: il-ħolqien ta' operaturi għal Kubernetes sar aktar faċli

shell-operator se jmexxi l-ganċ biss meta dan il-JSON qasir jinbidel, u l-bidliet fi proprjetajiet oħra jiġu injorati.

Il-kuntest tat-tnedija tal-ganċ

Il-konfigurazzjoni tal-ganċ tippermettilek li tispeċifika diversi għażliet għal avvenimenti - pereżempju, 2 għażliet għal avvenimenti minn Kubernetes u 2 skedi:

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

Digressjoni żgħira: iva, jappoġġja l-operatur tal-qoxra tmexxija ta 'skripts ta' stil crontab. Aktar dettalji jistgħu jinstabu fi dokumentazzjoni.

Biex tiddistingwi għaliex tnieda l-ganċ, l-operatur tal-qoxra joħloq fajl temporanju u jgħaddi l-mogħdija lejh f'varjabbli għall-ganċ BINDING_CONTEXT_TYPE. Il-fajl fih deskrizzjoni JSON tar-raġuni għat-tħaddim tal-ganċ. Pereżempju, kull 10 minuti l-ganċ se jaħdem bil-kontenut li ġej:

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

... u nhar it-Tnejn jibda b'dan:

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

Għal onKubernetesEvent Se jkun hemm aktar JSON triggers, għaliex fiha deskrizzjoni tal-oġġett:

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

Il-kontenut tal-oqsma jistgħu jinftiehmu mill-ismijiet tagħhom, u aktar dettalji jistgħu jinqraw fihom dokumentazzjoni. Eżempju ta' kif tikseb isem ta' riżorsa minn qasam resourceName l-użu ta' jq diġà ġie muri f'ganċ li jirreplika s-sigrieti:

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

Tista 'tikseb oqsma oħra b'mod simili.

Xi jmiss?

Fir-repożitorju tal-proġett, fi /eżempji direttorji, hemm eżempji ta 'ganċijiet li huma lesti biex jaħdmu fuq cluster. Meta tikteb il-ganċijiet tiegħek, tista 'tużahom bħala bażi.

Hemm appoġġ għall-ġbir ta 'metriċi bl-użu ta' Prometheus - il-metriċi disponibbli huma deskritti fit-taqsima METRIKA.

Kif tista' taħsbu, l-operatur tal-qoxra huwa miktub f'Go u mqassam taħt liċenzja Open Source (Apache 2.0). Inkunu grati għal kwalunkwe għajnuna għall-iżvilupp proġett fuq GitHub: u stilel, u kwistjonijiet, u pull talbiet.

Tneħħi l-velu tas-segretezza, aħna se ninfurmak ukoll li shell-operatur huwa żgħir parti mis-sistema tagħna li tista’ żżomm aġġornati l-add-ons installati fil-cluster Kubernetes u twettaq diversi azzjonijiet awtomatiċi. Aqra aktar dwar din is-sistema qal litteralment nhar it-Tnejn f'HighLoad++ 2019 f'San Pietruburgu - dalwaqt se nippubblikaw il-vidjo u t-traskrizzjoni ta' dan ir-rapport.

Għandna pjan biex niftħu l-bqija ta 'din is-sistema: l-addon-operator u l-kollezzjoni tagħna ta' ganċijiet u moduli. Mill-mod, addon-operatur huwa diġà disponibbli fuq github, iżda d-dokumentazzjoni għaliha għadha fit-triq. Ir-rilaxx tal-ġbir ta 'moduli huwa ppjanat għas-sajf.

Soġġorn sintonizzat!

PS

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment