Fampidirana shell-operator: nanjary mora kokoa ny famoronana operator ho an'ny Kubernetes

Efa nisy lahatsoratra miresaka momba ny bilaoginay fahaizan'ny mpandraharaha ao amin'ny Kubernetes ary ahoana manorata mpandraharaha tsotra. Amin'ity indray mitoraka ity dia tianay ny manolotra ny sainao ny vahaolana Open Source, izay mitondra ny famoronana mpandraharaha ho amin'ny ambaratonga faran'izay mora - jereo shell-operator!

Nahoana?

Ny hevitra momba ny shell-operator dia tsotra: misoratra anarana amin'ny hetsika avy amin'ny zavatra Kubernetes, ary rehefa voaray ireo hetsika ireo dia manomboha fandaharana ivelany, manome azy fampahalalana momba ny hetsika:

Fampidirana shell-operator: nanjary mora kokoa ny famoronana operator ho an'ny Kubernetes

Nipoitra ny filana izany rehefa, nandritra ny fampandehanana ny cluster, dia nanomboka niseho ireo asa kely izay tena tiantsika ny hanao automatique amin'ny fomba mety. Ireo asa kely rehetra ireo dia voavaha tamin'ny alàlan'ny script bash tsotra, na dia fantatrao aza fa tsara kokoa ny manoratra mpandraharaha amin'ny Golang. Mazava ho azy fa tsy hahomby ny fampiasam-bola amin'ny fampandrosoana feno ny mpandraharaha iray ho an'ny asa kely toy izany.

Operator ao anatin'ny 15 minitra

Andeha hojerentsika ny ohatra iray amin'ny zavatra azo automatique amin'ny cluster Kubernetes sy ny fomba ahafahan'ny shell-operator manampy. Ohatra iray dia izao manaraka izao: mamerina ny tsiambaratelo hidirana amin'ny rejisitra docker.

Ny pods izay mampiasa sary avy amin'ny rejisitra manokana dia tsy maintsy misy rohy mankany amin'ny tsiambaratelo miaraka amin'ny angon-drakitra hidirana ao amin'ny rejisitra. Ity tsiambaratelo ity dia tsy maintsy noforonina amin'ny sehatra anarana tsirairay alohan'ny hamoronana pods. Azo atao amin'ny tanana izany, fa raha manangana tontolo mavitrika isika, dia ho lasa be dia be ny espace anarana ho an'ny fampiharana iray. Ary raha tsy misy ihany koa ny fampiharana 2-3 ... lasa be dia be ny isan'ny tsiambaratelo. Ary zavatra iray hafa momba ny tsiambaratelo: Tiako ny hanova ny lakile hidirana amin'ny rejisitra tsindraindray. Farany, asa tanana ho vahaolana tsy mandaitra tanteraka - mila manao automatique ny famoronana sy fanavaozana ny tsiambaratelo.

automatique tsotra

Andao hanoratra script shell izay mandeha indray mandeha isaky ny N segondra ary manamarina ny anaran'ny toerana misy tsiambaratelo, ary raha tsy misy tsiambaratelo dia noforonina izy io. Ny tombony amin'ity vahaolana ity dia toa ny script shell amin'ny cron - fomba fanao mahazatra sy azo takarina amin'ny rehetra. Ny lafy ratsiny dia eo amin'ny elanelam-potoana eo anelanelan'ny fandefasana azy dia afaka mamorona namespace vaovao ary mandritra ny fotoana fohy dia hijanona tsy misy tsiambaratelo izany, izay hitarika amin'ny fahadisoana amin'ny fandefasana pods.

Automation miaraka amin'ny shell-operator

Mba hampandehanana tsara ny scripty, dia mila soloina fanombohana ny fandefasana cron mahazatra rehefa ampiana toerana misy anarana: amin'ity tranga ity, afaka mamorona tsiambaratelo ianao alohan'ny hampiasana azy. Andeha hojerentsika ny fomba fampiharana izany amin'ny fampiasana shell-operator.

Voalohany, andeha hojerentsika ny script. Ny script amin'ny teny shell-operator dia antsoina hoe hooks. Ny hook tsirairay rehefa mihazakazaka miaraka amin'ny saina --config mampahafantatra ny shell-operator momba ny famatorana azy, i.e. momba ny hetsika tokony hatomboka. Amin'ny tranga misy antsika dia hampiasaintsika onKubernetesEvent:

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

Voalaza eto fa mahaliana antsika ny manampy hetsika (add) zavatra misy karazana namespace.

Ankehitriny dia mila manampy ny code izay hotanterahina rehefa mitranga ny hetsika:

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

Mahafinaritra! Ny vokatra dia script kely sy tsara tarehy. Mba "hamelona" azy, dia misy dingana roa sisa: manomana ny sary ary atombohy ao anaty cluster.

Manomana sary miaraka amin'ny hook

Raha mijery ny script ianao dia ho hitanao fa ampiasaina ny baiko kubectl и jq. Midika izany fa ny sary dia tsy maintsy manana ireto zavatra manaraka ireto: ny hook, ny akorandriaka-operateur izay hanara-maso ny zava-nitranga sy hampandeha ny hook, ary ny baiko ampiasain'ny hook (kubectl sy jq). Hub.docker.com dia efa manana sary efa vita izay ametrahana ny shell-operator, kubectl ary jq. Ny hany sisa tavela dia ny manampy hook tsotra 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

Hiverina any amin'ny cluster

Andeha hojerentsika indray ny hook ary amin'ity indray mitoraka ity dia soraty hoe inona ny hetsika sy ny zavatra ataony ao amin'ny cluster:

  1. misoratra anarana amin'ny hetsika famoronana namespace;
  2. mamorona tsiambaratelo amin'ny toeran'ny anarana hafa ankoatry ny toerana nanombohana azy.

Hita fa tsy maintsy manana alalana hanao ireo hetsika ireo ny pod izay hanombohan'ny sarintsika. Izany dia azo atao amin'ny famoronana ServiceAccount anao manokana. Ny fahazoan-dàlana dia tsy maintsy atao amin'ny endrika ClusterRole sy ClusterRoleBinding, satria liana amin'ny zavatra avy amin'ny cluster manontolo izahay.

Ny famaritana farany amin'ny YAML dia ho toy izao:

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

Azonao atao ny manomboka ny sary tafangona ho toy ny Deployment tsotra:

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

Ho fanamorana, misy toerana misy anarana mitokana izay hanombohan'ny shell-operator ary hampiharina ireo fanehoana noforonina:

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

Izay ihany: hanomboka ny shell-operator, misoratra anarana amin'ny hetsika famoronana namespace ary mihazakazaka ny hook rehefa ilaina izany.

Fampidirana shell-operator: nanjary mora kokoa ny famoronana operator ho an'ny Kubernetes

Noho izany, script akorandriaka tsotra nivadika ho mpandraharaha tena izy ho an'ny Kubernetes ary miasa ao anatin'ny cluster. Ary izany rehetra izany tsy misy dingana sarotra amin'ny fampandrosoana ny mpandraharaha ao Golang:

Fampidirana shell-operator: nanjary mora kokoa ny famoronana operator ho an'ny Kubernetes

Misy fanoharana hafa momba ity raharaha ity...Fampidirana shell-operator: nanjary mora kokoa ny famoronana operator ho an'ny Kubernetes

Hambarantsika amin’ny an-tsipiriany kokoa ny dikan’izany ao amin’ny iray amin’ireo zavatra vita an-tsoratra manaraka.

fanasivanana

Tsara ny manara-maso zavatra, saingy matetika no ilaina ny mihetsika manova toetra zavatra sasany, ohatra, hanova ny isan'ny kopia ao amin'ny Deployment na hanova ny etikety zavatra.

Rehefa tonga ny hetsika iray, ny shell-operator dia mahazo ny fanehoana JSON an'ilay zavatra. Afaka misafidy ireo fananana mahaliana antsika amin'ity JSON ity isika ary mihazakazaka ny hook ihany rehefa miova izy ireo. Misy sehatra ho an'izany jqFilter, izay mila mamaritra ny fomba fiteny jq izay hampiharina amin'ny fanehoana JSON.

Ohatra, mba hamaliana ny fiovana amin'ny etikety ho an'ny zavatra Deployment dia mila manivana ny saha ianao labels ivelan'ny saha metadata. Ny config dia ho toy izao:

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

Ity fomba fiteny jqFilter ity dia mamadika ny fanehoana JSON lava an'ny Deployment ho JSON fohy misy marika:

Fampidirana shell-operator: nanjary mora kokoa ny famoronana operator ho an'ny Kubernetes

Ny shell-operator dia tsy hanao afa-tsy ny hook rehefa miova ity JSON fohy ity, ary tsy horaharahaina ny fanovana amin'ny fananana hafa.

Ny context launch hook

Ny config hook dia ahafahanao mamaritra safidy maromaro ho an'ny hetsika - ohatra, safidy 2 ho an'ny hetsika avy amin'ny Kubernetes sy fandaharam-potoana 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"
]}

Fihodinana kely: eny, manohana ny shell-operator mihazakazaka script crontab style. Ny antsipiriany bebe kokoa dia azo jerena ao tahirin-kevitra.

Mba hanavahana ny antony nanombohan'ny hook, ny shell-operator dia mamorona rakitra vonjimaika ary mandalo ny lalana mankany amin'ny fari-pitsipika mankany amin'ny hook. BINDING_CONTEXT_TYPE. Ny rakitra dia misy famaritana JSON momba ny anton'ny fampandehanana ny hook. Ohatra, isaky ny 10 minitra dia handeha miaraka amin'ireto votoaty manaraka ireto ny hook:

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

... ary ny Alatsinainy dia hanomboka amin'izao:

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

ho an'ny onKubernetesEvent Hisy ny JSON trigger bebe kokoa, satria misy famaritana ny zavatra:

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

Ny votoatin'ny saha dia azo takarina amin'ny anarany, ary azo vakiana ny antsipiriany bebe kokoa tahirin-kevitra. Ohatra iray amin'ny fahazoana anarana loharano avy amin'ny saha resourceName Ny fampiasana jq dia efa naseho tamina hook izay mamerina ny tsiambaratelo:

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

Azonao atao ny mahazo sehatra hafa amin'ny fomba mitovy.

Inona ny manaraka?

Ao amin'ny tranokalan'ny tetikasa, in / ohatra lahatahiry, misy ohatra amin'ny farango efa vonona ny handeha amin'ny cluster. Rehefa manoratra ny hooks manokana ianao dia azonao ampiasaina ho fototra.

Misy fanohanana amin'ny fanangonana metrika amin'ny fampiasana Prometheus - ny metrika misy dia voalaza ao amin'ny fizarana mari-pandrefesana.

Araka ny mety ho eritreretinao, ny shell-operator dia voasoratra ao amin'ny Go ary zaraina amin'ny lisansa Open Source (Apache 2.0). Hankasitraka ny fanampiana rehetra izahay amin'ny fampandrosoana tetikasa amin'ny GitHub: sy kintana, ary olana, ary fangatahana fisintonana.

Manainga ny voaly ny tsiambaratelo, dia hampahafantatra anao koa izahay fa ny shell-operator dia kely ampahany amin'ny rafitray izay afaka mitazona fanampim-panampiana napetraka ao amin'ny kluster Kubernetes hatramin'ny farany ary manao hetsika mandeha ho azy isan-karazany. Vakio bebe kokoa momba ity rafitra ity nilaza ara-bakiteny amin'ny Alatsinainy ao amin'ny HighLoad++ 2019 any Saint-Pétersbourg - tsy ho ela dia hamoaka ny lahatsary sy ny fandikana an'ity tatitra ity izahay.

Manana drafitra hanokatra ny ambiny amin'ity rafitra ity izahay: ny addon-operator sy ny fanangonana ny hooks sy modules. Raha ny marina, ny addon-operator dia efa azo alaina amin'ny github, fa ny antontan-taratasy momba izany dia mbola an-dalana. Ny famoahana ny fanangonana modules dia nomanina ho an'ny fahavaratra.

Maharaha vaovao!

Sal

Vakio ihany koa ao amin'ny bilaoginay:

Source: www.habr.com

Add a comment