Iṣafihan onišẹ ikarahun: ṣiṣẹda awọn oniṣẹ fun Kubernetes kan ni irọrun

Awọn nkan ti wa tẹlẹ lori bulọọgi wa ti n sọrọ nipa awọn agbara oniṣẹ ni Kubernetes ati bawo ni kọ oniṣẹ ẹrọ ti o rọrun funrararẹ. Ni akoko yii a yoo fẹ lati ṣafihan si akiyesi rẹ ojutu Orisun Ṣiṣii wa, eyiti o gba ẹda ti awọn oniṣẹ si ipele ti o rọrun pupọ - ṣayẹwo jade ikarahun-onišẹ!

Kí nìdí?

Imọran ti oniṣẹ ikarahun jẹ ohun rọrun: ṣe alabapin si awọn iṣẹlẹ lati awọn nkan Kubernetes, ati nigbati awọn iṣẹlẹ wọnyi ba gba, ṣe ifilọlẹ eto ita kan, pese alaye nipa iṣẹlẹ naa:

Iṣafihan onišẹ ikarahun: ṣiṣẹda awọn oniṣẹ fun Kubernetes kan ni irọrun

Iwulo fun rẹ dide nigbati, lakoko iṣẹ awọn iṣupọ, awọn iṣẹ-ṣiṣe kekere bẹrẹ si han pe a fẹ gaan lati ṣe adaṣe ni ọna ti o tọ. Gbogbo awọn iṣẹ-ṣiṣe kekere wọnyi ni a yanju nipa lilo awọn iwe afọwọkọ bash ti o rọrun, botilẹjẹpe, bi o ṣe mọ, o dara lati kọ awọn oniṣẹ ni Golang. O han ni, idoko-owo ni idagbasoke iwọn-kikun ti oniṣẹ fun ọkọọkan iru iṣẹ-ṣiṣe kekere yoo jẹ ailagbara.

Onišẹ ni 15 iṣẹju

Jẹ ki a wo apẹẹrẹ ti ohun ti o le ṣe adaṣe ni iṣupọ Kubernetes ati bii oniṣẹ ẹrọ ikarahun ṣe le ṣe iranlọwọ. Apeere kan yoo jẹ atẹle yii: tun ṣe aṣiri kan lati wọle si iforukọsilẹ docker.

Awọn adarọ-ese ti o lo awọn aworan lati iforukọsilẹ ikọkọ gbọdọ ni ninu iṣafihan wọn ọna asopọ kan si aṣiri kan pẹlu data fun iraye si iforukọsilẹ. Aṣiri yii gbọdọ ṣẹda ni aaye orukọ kọọkan ṣaaju ṣiṣẹda awọn adarọ-ese. Eyi le ṣee ṣe pẹlu ọwọ, ṣugbọn ti a ba ṣeto awọn agbegbe ti o ni agbara, lẹhinna aaye orukọ fun ohun elo kan yoo di pupọ. Ati pe ti ko ba tun wa awọn ohun elo 2-3 ... nọmba awọn aṣiri di pupọ. Ati ohun kan diẹ sii nipa awọn aṣiri: Emi yoo fẹ lati yi bọtini pada lati wọle si iforukọsilẹ lati igba de igba. Níkẹyìn, ọwọ mosi bi ojutu patapata doko - a nilo lati ṣe adaṣe adaṣe ati imudojuiwọn awọn aṣiri.

Irọrun adaṣe

Jẹ ki a kọ iwe afọwọkọ ikarahun kan ti o nṣiṣẹ lẹẹkan ni gbogbo iṣẹju-aaya N ati ṣayẹwo awọn aaye orukọ fun wiwa aṣiri kan, ati pe ti ko ba si aṣiri, lẹhinna o ṣẹda. Anfani ti ojutu yii ni pe o dabi iwe afọwọkọ ikarahun ni cron - ọna Ayebaye ati oye si gbogbo eniyan. Ilọkuro ni pe ni aarin laarin awọn ifilọlẹ rẹ aaye orukọ tuntun le ṣẹda ati fun igba diẹ yoo wa laisi aṣiri, eyiti yoo ja si awọn aṣiṣe ni ifilọlẹ awọn adarọ-ese.

Adaṣiṣẹ pẹlu ikarahun-onišẹ

Fun iwe afọwọkọ wa lati ṣiṣẹ ni deede, ifilọlẹ cron Ayebaye nilo lati paarọ rẹ pẹlu ifilọlẹ kan nigbati aaye orukọ kan ba ṣafikun: ninu ọran yii, o le ṣẹda aṣiri ṣaaju lilo rẹ. Jẹ ki a wo bii o ṣe le ṣe eyi nipa lilo oluṣe-iṣẹ ikarahun.

Ni akọkọ, jẹ ki a wo iwe afọwọkọ naa. Awọn iwe afọwọkọ ni awọn ofin oluṣe ikarahun ni a pe ni kio. Gbogbo kio nigba ṣiṣe pẹlu asia --config sọfun oniṣẹ ẹrọ ikarahun nipa awọn asopọ rẹ, i.e. lori awọn iṣẹlẹ wo ni o yẹ ki o ṣe ifilọlẹ. Ninu ọran wa a yoo lo onKubernetesEvent:

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

O ṣe apejuwe nibi pe a nifẹ lati ṣafikun awọn iṣẹlẹ (add) awọn nkan ti iru namespace.

Bayi o nilo lati ṣafikun koodu ti yoo ṣiṣẹ nigbati iṣẹlẹ ba waye:

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

Nla! Abajade jẹ iwe afọwọkọ kekere, lẹwa. Lati “sọji” rẹ, awọn igbesẹ meji lo wa: mura aworan naa ki o ṣe ifilọlẹ ni iṣupọ.

Ngbaradi aworan pẹlu kio kan

Ti o ba wo iwe afọwọkọ, o le rii pe a lo awọn aṣẹ naa kubectl и jq. Eyi tumọ si pe aworan naa gbọdọ ni awọn nkan wọnyi: kio wa, oniṣẹ ẹrọ ikarahun ti yoo ṣe atẹle awọn iṣẹlẹ ati ṣiṣe kio, ati awọn aṣẹ ti a lo nipasẹ kio (kubectl ati jq). Hub.docker.com ti ni aworan ti o ti ṣetan ninu eyiti o ti ṣajọ ẹrọ-isẹ, kubectl ati jq. Gbogbo ohun ti o ku ni lati ṣafikun kio ti o rọrun 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

Nṣiṣẹ ni a iṣupọ

Jẹ ki a wo kio lẹẹkansi ati ni akoko yii kọ awọn iṣe wo ati pẹlu awọn nkan wo ni o ṣe ninu iṣupọ:

  1. ṣe alabapin si awọn iṣẹlẹ ẹda orukọ;
  2. ṣẹda aṣiri ni awọn aaye orukọ yatọ si eyiti o ti ṣe ifilọlẹ.

O wa ni jade pe podu ninu eyiti aworan wa yoo ṣe ifilọlẹ gbọdọ ni awọn igbanilaaye lati ṣe awọn iṣe wọnyi. Eyi le ṣee ṣe nipa ṣiṣẹda Account Service tirẹ. Igbanilaaye gbọdọ ṣee ni irisi ClusterRole ati ClusterRoleBinding, nitori a nifẹ si awọn nkan lati gbogbo iṣupọ.

Apejuwe ikẹhin ni YAML yoo dabi nkan bayi:

---
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 le ṣe ifilọlẹ aworan ti o pejọ bi Imuṣiṣẹ ti o rọrun:

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

Fun irọrun, aaye orukọ lọtọ ni a ṣẹda nibiti yoo ṣe ifilọlẹ oniṣẹ ikarahun ati pe awọn ifihan ti o ṣẹda yoo lo:

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

Iyẹn ni gbogbo rẹ: oniṣẹ ikarahun yoo bẹrẹ, ṣe alabapin si awọn iṣẹlẹ ẹda orukọ ati ṣiṣe kio nigbati o nilo.

Iṣafihan onišẹ ikarahun: ṣiṣẹda awọn oniṣẹ fun Kubernetes kan ni irọrun

Ni ọna yi, iwe afọwọkọ ikarahun ti o rọrun kan yipada si oniṣẹ gidi fun Kubernetes ati pe o ṣiṣẹ gẹgẹbi apakan ti iṣupọ kan. Ati gbogbo eyi laisi ilana eka ti awọn oniṣẹ idagbasoke ni Golang:

Iṣafihan onišẹ ikarahun: ṣiṣẹda awọn oniṣẹ fun Kubernetes kan ni irọrun

Àpèjúwe mìíràn tún wà lórí ọ̀ràn yìí...Iṣafihan onišẹ ikarahun: ṣiṣẹda awọn oniṣẹ fun Kubernetes kan ni irọrun

A yoo ṣe afihan itumọ rẹ ni awọn alaye diẹ sii ninu ọkan ninu awọn atẹjade atẹle.

Sisẹ

Ṣiṣayẹwo awọn nkan dara, ṣugbọn igbagbogbo nilo lati fesi si iyipada diẹ ninu awọn ohun ini, fun apẹẹrẹ, lati yi nọmba awọn ẹda ni Imuṣiṣẹ tabi lati yi awọn aami ohun pada.

Nigbati iṣẹlẹ ba de, oniṣẹ ikarahun gba ifihan JSON ti nkan naa. A le yan awọn ohun-ini ti o nifẹ si wa ni JSON yii ati ṣiṣe kio naa Nikan nigbati nwọn yipada. Aaye kan wa fun eyi jqFilter, nibiti o nilo lati pato ikosile jq ti yoo lo si ifihan JSON.

Fun apẹẹrẹ, lati dahun si awọn ayipada ninu awọn akole fun awọn ohun imuṣiṣẹ, o nilo lati ṣe àlẹmọ aaye naa labels jade ninu oko metadata. Eto naa yoo dabi eyi:

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

Ọrọ jqFilter yii yi ifihan JSON gigun ti imuṣiṣẹ pada si JSON kukuru pẹlu awọn akole:

Iṣafihan onišẹ ikarahun: ṣiṣẹda awọn oniṣẹ fun Kubernetes kan ni irọrun

ikarahun-onišẹ yoo nikan ṣiṣe awọn kio nigbati yi kukuru JSON ayipada, ati awọn ayipada si miiran ini yoo wa ni bikita.

Kio ifilọlẹ o tọ

Iṣeto kio gba ọ laaye lati pato awọn aṣayan pupọ fun awọn iṣẹlẹ - fun apẹẹrẹ, awọn aṣayan 2 fun awọn iṣẹlẹ lati Kubernetes ati awọn iṣeto 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"
]}

Digression kekere: bẹẹni, ikarahun-onišẹ atilẹyin nṣiṣẹ crontab ara awọn iwe afọwọkọ. Awọn alaye diẹ sii ni a le rii ni iwe.

Lati ṣe iyatọ idi ti a fi ṣe ifilọlẹ kio naa, oniṣẹ ikarahun ṣẹda faili igba diẹ ati ki o kọja ọna si ọdọ rẹ ni oniyipada si kio. BINDING_CONTEXT_TYPE. Faili naa ni apejuwe JSON kan ti idi fun ṣiṣe kio naa. Fun apẹẹrẹ, ni gbogbo iṣẹju mẹwa 10 kio yoo ṣiṣẹ pẹlu akoonu atẹle:

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

ati ni ọjọ Mọndee yoo bẹrẹ pẹlu eyi:

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

fun onKubernetesEvent Awọn okunfa JSON diẹ sii yoo wa, nitori o ni apejuwe nkan naa ninu:

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

Awọn akoonu ti awọn aaye le ni oye lati awọn orukọ wọn, ati awọn alaye diẹ sii ni a le ka ninu iwe. Apeere ti gbigba orukọ orisun lati aaye kan resourceName lilo jq ti han tẹlẹ ninu kio kan ti o ṣe atunṣe awọn aṣiri:

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

O le gba awọn aaye miiran ni ọna kanna.

Ohun ti ni tókàn?

Ninu ibi ipamọ ise agbese, ni / awọn apẹẹrẹ awọn ilana, Awọn apẹẹrẹ ti awọn kio wa ti o ṣetan lati ṣiṣe lori iṣupọ kan. Nigbati o ba kọ awọn kio tirẹ, o le lo wọn gẹgẹbi ipilẹ.

Atilẹyin wa fun gbigba awọn metiriki nipa lilo Prometheus - awọn metiriki ti o wa ni a ṣe apejuwe ni apakan METIRI.

Bi o ṣe le gboju, oluṣe ikarahun naa ni kikọ ni Go ati pinpin labẹ iwe-aṣẹ Orisun Ṣii (Apache 2.0). A yoo dupẹ lọwọ eyikeyi iranlọwọ idagbasoke ise agbese lori GitHub: ati awọn irawọ, ati awọn oran, ati awọn ibeere fa.

Gbigbe ibori ti asiri, a yoo tun sọ fun ọ pe oniṣẹ ẹrọ ikarahun jẹ kekere apakan ti eto wa ti o le jẹ ki awọn afikun fi sori ẹrọ ni iṣupọ Kubernetes titi di oni ati ṣe ọpọlọpọ awọn iṣe adaṣe. Ka siwaju sii nipa yi eto so fun gangan ni Ọjọ Aarọ ni HighLoad ++ 2019 ni St.

A ni eto lati ṣii awọn iyokù eto yii: oluṣe-addon ati ikojọpọ awọn iwọ ati awọn modulu wa. Nipa ọna, addon-operator ti wa tẹlẹ wa lori github, ṣugbọn awọn iwe fun o jẹ ṣi lori awọn ọna. Itusilẹ ti gbigba ti awọn modulu ni a gbero fun igba ooru.

Duro aifwy!

PS

Ka tun lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun