Ho hlahisa li-shell-operator: ho theha basebelisi ba Kubernetes ho se ho le bonolo

Ho se ho ntse ho e-na le lingoliloeng ho blog ea rona tse buang ka tsona bokhoni ba opareitara ho Kubernetes le joang ngola opareitara e bonolo ka bowena. Lekhetlong lena re rata ho u tsebisa tharollo ea rona ea Open Source, e isang popo ea basebelisi boemong bo bonolo haholo - sheba. khetla-mosebetsi!

Hobane'ng?

Mohopolo oa "shell-operator" o bonolo haholo: ingolisa ho liketsahalo tse tsoang ho Kubernetes, 'me ha liketsahalo tsena li amoheloa, qala lenaneo la kantle, le fana ka leseli mabapi le ketsahalo eo:

Ho hlahisa li-shell-operator: ho theha basebelisi ba Kubernetes ho se ho le bonolo

Tlhokahalo ea eona e ile ea hlaha ha, nakong ea ts'ebetso ea lihlopha, mesebetsi e menyenyane e qala ho bonahala eka re hlile re batla ho iketsetsa ka tsela e nepahetseng. Mesebetsi ena eohle e menyenyane e ile ea rarolloa ka ho sebelisa mangolo a bonolo a bash, leha ho le joalo, joalo ka ha u tseba, ho molemo ho ngola basebelisi ba Golang. Ho hlakile hore ho tsetela ntlafatsong e felletseng ea opareitara bakeng sa mosebetsi o mong le o mong o monyane joalo ho ka se sebetse.

Opereishene ka metsotso e 15

Ha re shebeng mohlala oa se ka etsoang ka boiketsetso sehlopheng sa Kubernetes le hore na mochini oa khetla o ka thusa joang. Mohlala e ka ba o latelang: ho pheta-pheta lekunutu ho fihlella registry ea docker.

Li-pods tse sebelisang litšoantšo ho tsoa ho registry ea poraefete li tlameha ho ba le sehokelo sa lekunutu se nang le data bakeng sa ho fihlella ngoliso. Sephiri sena se tlameha ho etsoa sebakeng se seng le se seng sa mabitso pele ho etsoa li-pods. Sena se ka etsoa ka letsoho, empa haeba re theha maemo a matla, sebaka sa mabitso sa kopo e le 'ngoe se tla ba ngata. 'Me haeba ho boetse ho se na likopo tse 2-3 ... palo ea liphiri e ba khōlō haholo. Le ntho e 'ngoe hape ka liphiri: Ke kopa ho fetola senotlolo ho fihlella ngoliso nako le nako. Qetellong, mesebetsi ea matsoho e le tharollo e sa sebetseng ka botlalo - re hloka ho iketsetsa popo le ntlafatso ea liphiri.

Boiketsetso bo bonolo

Ha re ngole lengolo la khetla le tsamaeang hang ka metsotsoana e meng le e meng ea N le ho hlahloba libaka tsa mabitso bakeng sa boteng ba sephiri, 'me haeba ho se sephiri, joale sea thehoa. Molemo oa tharollo ena ke hore e shebahala joaloka script ea khetla ka cron - mokhoa oa khale le o utloisisoang ho bohle. Ntho e nyahamisang ke hore ka nako e pakeng tsa ho qala ha eona sebaka se secha sa mabitso se ka etsoa 'me ka nako e itseng se tla lula se se na sephiri, se tla lebisa liphoso tsa ho qala li-pods.

Automation e nang le shell-operator

E le hore sengoloa sa rona se sebetse ka nepo, tlhahiso ea khale ea cron e hloka ho nkeloa sebaka ke ho qala ha sebaka sa mabitso se eketsoa: ntlheng ena, o ka etsa lekunutu pele o e sebelisa. A re boneng hore na re ka etsa sena joang ho sebelisa shell-operator.

Pele, a re shebeng mongolo. Lingoliloeng ka mantsoe a likhetla li bitsoa hook. Hoko e 'ngoe le e 'ngoe ha e tsamaisoa ka folakha --config e tsebisa moetsi oa likhetla ka litlamo tsa eona, i.e. ka diketsahalo dife tseo e lokelang ho thakgolwa ka tsona. Tabeng ea rona re tla sebelisa onKubernetesEvent:

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

Ho hlalositsoe mona hore re na le thahasello ea ho eketsa liketsahalo (add) dintho tsa mofuta namespace.

Joale o hloka ho eketsa khoutu e tla etsoa ha ketsahalo e etsahala:

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

E kholo! Phello e bile mongolo o monyenyane, o motle. Ho e "hlasimolla", ho na le mehato e 'meli e setseng: lokisetsa setšoantšo ebe u se qala ka har'a sehlopha.

Ho lokisa setšoantšo ka hook

Haeba u sheba script, u ​​ka bona hore litaelo li sebelisoa kubectl и jq. Sena se bolela hore setšoantšo se tlameha ho ba le lintho tse latelang: hook ea rona, shell-operator e tla mamela liketsahalo le ho tsamaisa hook, le litaelo tse sebelisoang ke hook (kubectl le jq). Hub.docker.com e se e na le setšoantšo se seng se entsoe seo ho sona shell-operator, kubectl le jq li pakiloeng. Sohle se setseng ke ho eketsa hook e bonolo 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

Ho matha ka sehlopha

Ha re shebeng hook hape 'me lekhetlong lena ngola fatše hore na ke liketso life le hore na e etsa lintho life sehlopheng:

  1. e ingolisa ho liketsahalo tsa pōpo ea sebaka sa mabitso;
  2. e etsa lekunutu dibakeng tse ding ntle le moo e qalisoang teng.

Hoa etsahala hore pod eo setšoantšo sa rona se tla hlahisoa ka eona e tlameha ho ba le tumello ea ho etsa liketso tsena. Sena se ka etsoa ka ho iketsetsa ServiceAccount. Tumello e tlameha ho etsoa ka mokhoa oa ClusterRole le ClusterRoleBinding, hobane re thahasella lintho tse tsoang sehlopheng sohle.

Tlhaloso ea ho qetela ho YAML e tla shebahala tjena:

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

O ka qala setšoantšo se bokelletsoeng joalo ka Deployment e bonolo:

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

Bakeng sa boiketlo, ho etsoa sebaka se arohaneng sa mabitso moo shell-operator e tla hlahisoa 'me ho tla sebelisoa lipontšo tse entsoeng:

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

Ke phetho: shell-operator e tla qala, ingolise liketsahalong tsa pōpo ea sebaka sa mabitso ebe o tsamaisa hook ha ho hlokahala.

Ho hlahisa li-shell-operator: ho theha basebelisi ba Kubernetes ho se ho le bonolo

Kahoo, mongolo o bonolo oa khetla o fetohile opareitara ea 'nete bakeng sa Kubernetes mme e sebetsa joalo ka karolo ea sehlopha. Mme tsena tsohle ntle le ts'ebetso e rarahaneng ea ho nts'etsapele basebetsi Golang:

Ho hlahisa li-shell-operator: ho theha basebelisi ba Kubernetes ho se ho le bonolo

Ho na le papiso e 'ngoe tabeng ena ...Ho hlahisa li-shell-operator: ho theha basebelisi ba Kubernetes ho se ho le bonolo

Re tla senola moelelo oa eona ka botlalo ho e 'ngoe ea likhatiso tse latelang.

filtara

Ho latela lintho ho lokile, empa hangata ho na le tlhoko ea ho arabela ho fetola dintho tse itseng, mohlala, ho fetola palo ea likopi ho Deployment kapa ho fetola lileibole tsa ntho.

Ha ketsahalo e fihla, shell-operator e amohela JSON manifest ya ntho eo. Re ka khetha thepa e re khahlang ho JSON ena mme ra tsamaisa hook feela ha ba fetoha. Ho na le sebaka sa sena jqFilter, moo o hlokang ho hlakisa polelo ea jq e tla sebelisoa ho ponahalo ea JSON.

Mohlala, ho arabela liphetohong tsa lileibole bakeng sa lintho tsa Deployment, o hloka ho sefa sebaka labels ho tsoa tšimong metadata. Sebopeho se tla ba tjena:

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

Polelo ena ea jqFilter e fetola ponahalo e telele ea JSON ea Deployment hore e be JSON e khuts'oane e nang le mangolo:

Ho hlahisa li-shell-operator: ho theha basebelisi ba Kubernetes ho se ho le bonolo

shell-operator e tla tsamaisa hook feela ha JSON ena e khuts'oane e fetoha, 'me liphetoho meahong e meng li tla hlokomolohuoa.

Boemo ba ho qala hook

Hook config eu lumella ho hlakisa likhetho tse 'maloa bakeng sa liketsahalo - mohlala, likhetho tse 2 bakeng sa liketsahalo tse tsoang ho Kubernetes le mananeo a 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"
]}

Pharohano e nyane: e, shell-operator e tšehetsa ho tsamaisa mongolo oa mokhoa oa crontab. Lintlha tse ling li ka fumanoa ho litokomane.

Ho khetholla hore na ke hobane'ng ha hook e ile ea qalisoa, shell-operator e etsa faele ea nakoana 'me e fetisa tsela e eang ho eona ka ho feto-fetoha ho hook. BINDING_CONTEXT_TYPE. Faele e na le tlhaloso ea JSON ea lebaka la ho sebelisa hook. Mohlala, metsotso e meng le e meng e 10 hook e tla sebetsa le litaba tse latelang:

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

... mme ka Mantaha e tla qala ka sena:

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

etsoe onKubernetesEvent Ho tla ba le li-triggers tse ngata tsa JSON, hobane e na le tlhaloso ea ntho:

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

Likahare tsa masimo li ka utloisisoa ho tsoa mabitsong a tsona, 'me lintlha tse ling li ka baloa ho tsona litokomane. Mohlala oa ho fumana lebitso la mohlodi tšimong resourceName ho sebelisa jq ho se ho bontšitsoe ka hook e phetang liphiri:

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

U ka fumana likarolo tse ling ka tsela e tšoanang.

Ke'ng e latelang?

Sebakeng sa polokelo ea morero, ho /mohlala oa libuka, ho na le mehlala ea lihakisi tse seng li loketse ho matha ka sehlopha. Ha u ngola lihakisi tsa hau, u ka li sebelisa e le motheo.

Ho na le ts'ehetso ea ho bokella metrics ka Prometheus - metrics e fumanehang e hlalositsoe karolong METETSI.

Joalo ka ha u ka hakanya, mochini oa likhetla o ngotsoe ho Go mme o abuoa tlasa laesense ea Open Source (Apache 2.0). Re tla leboha thuso efe kapa efe ea ntlafatso morero ho GitHub: le linaleli, le litaba, le ho hula likopo.

Ho phahamisa lesira la sephiri, re tla boela re u tsebise hore shell-operator ke nyane karolo ea tsamaiso ea rona e ka bolokang li-add-on tse kentsoeng sehlopheng sa Kubernetes ho fihlela joale le ho etsa liketso tse sa tšoaneng tse ikemetseng. Bala haholoanyane ka tsamaiso ena bolelletsoe ka ho toba ka Mantaha ho HighLoad ++ 2019 St. Petersburg - haufinyane re tla phatlalatsa video le sengoloa sa tlaleho ena.

Re na le moralo oa ho bula tsamaiso ena kaofela: addon-operator le pokello ea rona ea li-hook le modules. Ka tsela, addon-operator e se e ntse e le teng e fumaneha ho GitHub, empa litokomane tsa eona li ntse li le tseleng. Ho lokolloa ha pokello ea li-module ho reriloe bakeng sa lehlabula.

Lula u mametse!

PES

Bala hape ho blog ea rona:

Source: www.habr.com

Eketsa ka tlhaloso