Pagpaila sa shell-operator: ang paghimo og mga operator para sa Kubernetes nahimong mas sayon

Naa nay mga artikulo sa among blog nga naghisgot mga kapabilidad sa operator sa Kubernetes ug unsaon pagsulat sa usa ka yano nga operator sa imong kaugalingon. Niining higayona gusto namong ipresentar sa imong pagtagad ang among Open Source nga solusyon, nga nagdala sa pagmugna sa mga operator ngadto sa labing sayon ​​nga lebel - check out shell-operator!

Ngano?

Ang ideya sa usa ka shell-operator yano ra: mag-subscribe sa mga panghitabo gikan sa mga butang sa Kubernetes, ug kung kini nga mga panghitabo madawat, maglunsad og usa ka eksternal nga programa, nga naghatag niini og impormasyon mahitungod sa panghitabo:

Pagpaila sa shell-operator: ang paghimo og mga operator para sa Kubernetes nahimong mas sayon

Ang panginahanglan alang niini mitungha sa dihang, sa panahon sa operasyon sa mga pungpong, ang gagmay nga mga buluhaton nagsugod sa pagpakita nga gusto gyud namo nga mag-automate sa hustong paagi. Ang tanan nga kini nga gagmay nga mga buluhaton nasulbad gamit ang yano nga mga script sa bash, bisan kung nahibal-an nimo, mas maayo nga isulat ang mga operator sa Golang. Dayag, ang pagpamuhunan sa bug-os nga pag-uswag sa usa ka operator alang sa matag ingon nga gamay nga buluhaton dili epektibo.

Operator sa 15 minuto

Atong tan-awon ang usa ka pananglitan kung unsa ang mahimo nga awtomatiko sa usa ka cluster sa Kubernetes ug kung giunsa makatabang ang shell-operator. Ang usa ka pananglitan mao ang mosunod: pagkopya sa usa ka sekreto aron ma-access ang docker registry.

Ang mga pod nga naggamit og mga hulagway gikan sa usa ka pribadong rehistro kinahanglang maglangkob sa ilang manifest nga usa ka sumpay sa usa ka sekreto nga adunay mga datos alang sa pag-access sa rehistro. Kini nga sekreto kinahanglang himoon sa matag namespace sa dili pa maghimo og mga pod. Mahimo kini nga mano-mano, apan kung magbutang kami mga dinamikong palibot, nan ang namespace alang sa usa ka aplikasyon mahimong daghan. Ug kung wala usab 2-3 nga aplikasyon ... ang gidaghanon sa mga sekreto mahimong dako kaayo. Ug usa pa ka butang bahin sa mga sekreto: Gusto nakong usbon ang yawe aron ma-access ang rehistro matag karon ug unya. Sa kadugayan, manual nga mga operasyon isip solusyon hingpit nga dili epektibo - kinahanglan naton nga awtomatiko ang paghimo ug pag-update sa mga sekreto.

Yano nga automation

Magsulat kita og script sa shell nga modagan kausa sa matag N segundos ug susihon ang mga namespace alang sa presensya sa usa ka sekreto, ug kung walay sekreto, nan kini gibuhat. Ang bentaha sa kini nga solusyon mao nga kini sama sa usa ka shell script sa cron - usa ka klasiko ug masabtan nga pamaagi sa tanan. Ang downside mao nga sa agwat tali sa mga paglansad niini usa ka bag-ong namespace ang mahimo ug sulod sa pipila ka panahon kini magpabilin nga walay sekreto, nga mosangpot sa mga sayup sa paglansad sa mga pod.

Automation nga adunay shell-operator

Aron ang among script molihok sa husto, ang klasiko nga paglansad sa cron kinahanglan nga pulihan sa usa ka paglansad kung ang usa ka namespace idugang: sa kini nga kaso, mahimo ka maghimo usa ka sekreto sa dili pa kini gamiton. Atong tan-awon kung giunsa kini ipatuman gamit ang shell-operator.

Una, atong tan-awon ang script. Ang mga script sa mga termino sa shell-operator gitawag nga mga kaw-it. Ang matag kaw-it kung modagan nga adunay bandila --config nagpahibalo sa shell-operator mahitungod sa mga pagbugkos niini, i.e. sa unsa nga mga panghitabo kini kinahanglan nga ilunsad. Sa among kaso among gamiton onKubernetesEvent:

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

Gihulagway dinhi nga kami interesado sa pagdugang sa mga panghitabo (add) mga butang sa tipo namespace.

Karon kinahanglan nimong idugang ang code nga ipatuman kung mahitabo ang panghitabo:

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

Nindot! Ang resulta usa ka gamay, nindot nga script. Aron "mabuhi" kini, adunay duha ka lakang nga nahabilin: andama ang imahe ug ilunsad kini sa cluster.

Pag-andam sa usa ka imahe nga adunay usa ka kaw-it

Kon imong tan-awon ang script, imong makita nga ang mga sugo gigamit kubectl и jq. Kini nagpasabot nga ang hulagway kinahanglang adunay mosunod nga mga butang: ang atong kaw-it, usa ka shell-operator nga momonitor sa mga panghitabo ug modagan sa kaw-it, ug ang mga sugo nga gigamit sa kaw-it (kubectl ug jq). Ang Hub.docker.com aduna nay andam nga hulagway diin ang shell-operator, kubectl ug jq giputos. Ang nahabilin mao ang pagdugang usa ka yano nga kaw-it 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

Nagdagan sa usa ka cluster

Atong tan-awon pag-usab ang kaw-it ug niining higayona isulat kung unsang mga aksyon ug kung unsang mga butang ang gihimo niini sa cluster:

  1. nag-subscribe sa mga panghitabo sa paghimo sa namespace;
  2. nagmugna og sekreto sa mga namespaces gawas sa usa diin kini gilusad.

Mogawas nga ang pod diin ilusad ang among imahe kinahanglan adunay mga pagtugot aron mahimo kini nga mga aksyon. Mahimo kini pinaagi sa paghimo sa imong kaugalingon nga ServiceAccount. Ang pagtugot kinahanglan buhaton sa porma sa ClusterRole ug ClusterRoleBinding, tungod kay kami interesado sa mga butang gikan sa tibuok cluster.

Ang katapusang paghulagway sa YAML motan-aw sama niini:

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

Mahimo nimong ilansad ang gitigum nga imahe ingon usa ka yano nga Deployment:

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

Alang sa kasayon, usa ka separado nga namespace ang gihimo diin ang shell-operator ilunsad ug ang mga gimugna nga mga manifests magamit:

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

Kana lang: magsugod ang shell-operator, mag-subscribe sa mga panghitabo sa paghimo sa namespace ug ipadagan ang hook kung gikinahanglan.

Pagpaila sa shell-operator: ang paghimo og mga operator para sa Kubernetes nahimong mas sayon

Busa, usa ka yano nga script sa shell nahimo nga usa ka tinuod nga operator para sa Kubernetes ug nagtrabaho isip bahin sa usa ka cluster. Ug kining tanan nga wala ang komplikado nga proseso sa pagpalambo sa mga operator sa Golang:

Pagpaila sa shell-operator: ang paghimo og mga operator para sa Kubernetes nahimong mas sayon

Adunay laing ilustrasyon bahin niini nga butang...Pagpaila sa shell-operator: ang paghimo og mga operator para sa Kubernetes nahimong mas sayon

Atong ibutyag ang kahulogan niini sa mas detalyado sa usa sa mosunod nga mga publikasyon.

pagsala

Ang pagsubay sa mga butang maayo, apan adunay kanunay nga panginahanglan sa pagtubag pagbag-o sa pipila ka mga kabtangan sa butang, pananglitan, aron usbon ang gidaghanon sa mga replika sa Deployment o aron usbon ang mga label sa butang.

Kung moabut ang usa ka panghitabo, ang shell-operator makadawat sa JSON nga pagpakita sa butang. Mahimo natong pilion ang mga kabtangan nga makapainteres kanato niining JSON ug ipadagan ang kaw-it lamang sa dihang nagbag-o sila. Adunay usa ka uma alang niini jqFilter, diin kinahanglan nimo ipiho ang jq nga ekspresyon nga magamit sa JSON manifest.

Pananglitan, aron matubag ang mga pagbag-o sa mga label alang sa mga butang sa Deployment, kinahanglan nimo nga isala ang uma labels gawas sa uma metadata. Ang config mahimong sama niini:

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

Kini nga ekspresyon sa jqFilter naghimo sa taas nga JSON nga gipakita sa Deployment ngadto sa mubo nga JSON nga adunay mga label:

Pagpaila sa shell-operator: ang paghimo og mga operator para sa Kubernetes nahimong mas sayon

shell-operator modagan lamang sa kaw-it sa diha nga kini nga mubo nga JSON mausab, ug ang mga kausaban sa ubang mga kabtangan dili tagdon.

Konteksto sa paglansad sa hook

Ang hook config nagtugot kanimo sa pagpiho sa daghang mga kapilian alang sa mga panghitabo - pananglitan, 2 nga kapilian alang sa mga panghitabo gikan sa Kubernetes ug 2 nga mga iskedyul:

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

Usa ka gamay nga digression: oo, ang shell-operator nagsuporta nagpadagan sa mga script sa estilo sa crontab. Dugang nga mga detalye makita sa dokumentasyon.

Aron mahibal-an kung ngano nga gilunsad ang kaw-it, ang shell-operator nagmugna usa ka temporaryo nga file ug gipasa ang agianan niini sa usa ka variable sa kaw-it BINDING_CONTEXT_TYPE. Ang file adunay usa ka paghulagway sa JSON sa hinungdan sa pagpadagan sa kaw-it. Pananglitan, matag 10 ka minuto ang kaw-it modagan uban sa mosunod nga sulod:

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

... ug sa Lunes magsugod kini niini:

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

Sa onKubernetesEvent Adunay mas daghang JSON trigger, tungod kay kini adunay usa ka paghulagway sa butang:

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

Ang mga sulod sa mga natad masabtan gikan sa ilang mga ngalan, ug daghang mga detalye ang mabasa sa dokumentasyon. Usa ka pananglitan sa pagkuha sa usa ka ngalan sa kapanguhaan gikan sa usa ka uma resourceName ang paggamit sa jq gipakita na sa usa ka kaw-it nga nagsundog sa mga sekreto:

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

Mahimo nimong makuha ang ubang mga natad sa parehas nga paagi.

Unsay sunod?

Sa repositoryo sa proyekto, sa / mga pananglitan sa mga direktoryo, adunay mga pananglitan sa mga kaw-it nga andam nga modagan sa usa ka pungpong. Sa pagsulat sa imong kaugalingon nga mga kaw-it, mahimo nimo kining gamiton isip basehan.

Adunay suporta alang sa pagkolekta sa mga sukatan gamit ang Prometheus - ang magamit nga mga sukatan gihulagway sa seksyon METRICS.

Sama sa imong gihunahuna, ang shell-operator gisulat sa Go ug giapod-apod sa ilawom sa usa ka lisensya sa Open Source (Apache 2.0). Magpasalamat kami sa bisan unsang tabang sa pagpauswag proyekto sa GitHub: ug mga bitoon, ug mga isyu, ug mga hangyo sa pagbitad.

Pagtangtang sa tabil sa sekreto, kami usab ipahibalo kanimo nga ang shell-operator mao gamay bahin sa among sistema nga makapadayon sa pag-install sa mga add-on sa cluster sa Kubernetes hangtod sa petsa ug makahimo sa lainlaing mga awtomatikong aksyon. Basaha ang dugang bahin niini nga sistema gisulti literal sa Lunes sa HighLoad ++ 2019 sa St. Petersburg - sa dili madugay atong imantala ang video ug transcript niini nga taho.

Kami adunay plano nga ablihan ang nahabilin nga sistema: ang addon-operator ug ang among koleksyon sa mga kaw-it ug mga module. Pinaagi sa dalan, addon-operator na anaa sa GitHub, apan ang dokumentasyon alang niini anaa pa sa dalan. Ang pagpagawas sa koleksyon sa mga module giplano alang sa ting-init.

Magpadayon nga tune!

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment