Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Karong tuiga, ang panguna nga komperensya sa European Kubernetes - KubeCon + CloudNativeCon Europe 2020 - virtual. Bisan pa, ang ingon nga pagbag-o sa format wala makapugong kanamo sa paghatud sa among dugay nang giplano nga taho nga "Lakaw? Bash! Himamata ang Shell-operator” nga gipahinungod sa among proyekto sa Open Source shell-operator.

Kini nga artikulo, nga giinspirar sa pakigpulong, nagpresentar sa usa ka pamaagi sa pagpayano sa proseso sa paghimo og mga operator para sa Kubernetes ug nagpakita kung giunsa nimo paghimo ang imong kaugalingon nga adunay gamay nga paningkamot gamit ang usa ka shell-operator.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Pagpaila video sa report (~ 23 minutos sa English, mamatikdan nga mas impormasyon kay sa artikulo) ug ang nag-unang kinuha gikan niini sa porma sa teksto. Lakaw!

Sa Flant kami kanunay nga nag-optimize ug nag-automate sa tanan. Karon kita maghisgot mahitungod sa laing makapahinam nga konsepto. Magkita: cloud-native shell scripting!

Bisan pa, magsugod kita sa konteksto kung diin nahitabo ang tanan: Kubernetes.

Kubernetes API ug mga controller

Ang API sa Kubernetes mahimong irepresentar isip usa ka matang sa file server nga adunay mga direktoryo alang sa matag matang sa butang. Ang mga butang (mga kapanguhaan) sa kini nga server girepresentahan sa mga file nga YAML. Dugang pa, ang server adunay sukaranan nga API nga nagtugot kanimo sa pagbuhat sa tulo ka mga butang:

  • pagkuha kahinguhaan pinaagi sa matang ug ngalan niini;
  • pagbag-o kahinguhaan (sa kini nga kaso, ang server nagtipig lamang sa "husto" nga mga butang - ang tanan nga dili husto nga pagkaporma o gituyo alang sa ubang mga direktoryo gilabay);
  • track alang sa kahinguhaan (sa kini nga kaso, ang user makadawat dayon sa iyang kasamtangan/updated nga bersyon).

Busa, ang Kubernetes naglihok isip usa ka matang sa file server (alang sa YAML manifests) nga adunay tulo ka mga batakang pamaagi (oo, sa pagkatinuod adunay uban pa, apan ato kining laktawan sa pagkakaron).

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Ang problema mao nga ang server mahimo ra magtipig kasayuran. Aron mahimo kini nga trabaho kinahanglan nimo controller - ang ikaduha nga labing hinungdanon ug sukaranan nga konsepto sa kalibutan sa Kubernetes.

Adunay duha ka nag-unang matang sa mga controller. Ang una nagkuha ug impormasyon gikan sa Kubernetes, giproseso kini sumala sa nested logic, ug gibalik kini sa K8s. Ang ikaduha nagkuha og impormasyon gikan sa Kubernetes, apan, dili sama sa una nga tipo, nagbag-o sa kahimtang sa pipila ka mga kahinguhaan sa gawas.

Atong tan-awon pag-ayo ang proseso sa paghimo og Deployment sa Kubernetes:

  • Deployment Controller (gilakip sa kube-controller-manager) nakadawat og impormasyon bahin sa Deployment ug nagmugna og ReplicaSet.
  • Ang ReplicaSet nagmugna og duha ka replika (duha ka pod) base niini nga impormasyon, apan kini nga mga pod wala pa naka-iskedyul.
  • Ang scheduler nag-iskedyul sa mga pod ug nagdugang sa impormasyon sa node sa ilang mga YAML.
  • Ang mga Kubelets naghimo og mga pagbag-o sa usa ka eksternal nga kapanguhaan (ingon Docker).

Unya kining tibuok nga han-ay gisubli sa reverse order: gisusi sa kubelet ang mga sudlanan, gikalkulo ang status sa pod ug gibalik kini. Ang ReplicaSet controller nakadawat sa status ug nag-update sa estado sa replica set. Ang sama nga butang mahitabo sa Deployment Controller ug ang user sa katapusan makakuha sa updated (kasamtangan) status.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Shell-operator

Kini nahimo nga ang Kubernetes gibase sa hiniusang trabaho sa lainlaing mga controller (ang mga operator sa Kubernetes mga tigkontrol usab). Ang pangutana mitungha, kung giunsa paghimo ang imong kaugalingon nga operator nga adunay gamay nga paningkamot? Ug dinhi ang usa nga among naugmad moabut sa pagluwas shell-operator. Gitugotan niini ang mga tagdumala sa sistema sa paghimo sa ilang kaugalingon nga mga pahayag gamit ang pamilyar nga mga pamaagi.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Simple nga pananglitan: pagkopya sa mga sekreto

Atong tan-awon ang usa ka yano nga pananglitan.

Ingnon ta nga naa tay Kubernetes cluster. Kini adunay namespace default uban sa pipila ka Sekreto mysecret. Dugang pa, adunay ubang mga namespace sa cluster. Ang uban kanila adunay espesipikong label nga gilakip niini. Ang among tumong mao ang pagkopya sa Secret ngadto sa mga namespace nga adunay label.

Ang buluhaton komplikado tungod sa kamatuoran nga ang mga bag-ong namespaces mahimong makita sa cluster, ug ang uban niini mahimong adunay kini nga label. Sa laing bahin, kung matangtang ang label, kinahanglan usab nga tangtangon ang Secret. Dugang pa niini, ang Sekreto mismo mahimo usab nga magbag-o: sa kini nga kaso, ang bag-ong Sekreto kinahanglan nga kopyahon sa tanan nga mga namespace nga adunay mga label. Kung ang Secret wala tuyoa nga natangtang sa bisan unsang namespace, kinahanglan nga ibalik dayon kini sa among operator.

Karon nga ang buluhaton naporma na, panahon na nga magsugod sa pagpatuman niini gamit ang shell-operator. Apan una kini angay nga isulti ang pipila ka mga pulong bahin sa shell-operator mismo.

Giunsa pagtrabaho ang shell-operator

Sama sa ubang mga buluhaton sa Kubernetes, ang shell-operator nagdagan sa kaugalingon nga pod. Niini pod sa direktoryo /hooks Ang mga executable nga mga file gitipigan. Mahimo kini nga mga script sa Bash, Python, Ruby, ug uban pa. Gitawag namo ang maong mga executable files nga mga hook (mga kaw-it).

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Ang Shell-operator nag-subscribe sa mga panghitabo sa Kubernetes ug nagpadagan niini nga mga kaw-it isip tubag sa mga panghitabo nga among gikinahanglan.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Giunsa pagkahibalo sa shell-operator kung unsang kaw-it ang pagdagan ug kanus-a? Ang punto mao nga ang matag kaw-it adunay duha ka yugto. Atol sa pagsugod, ang shell-operator nagpadagan sa tanan nga mga kaw-it nga adunay argumento --config Kini ang yugto sa pag-configure. Ug pagkahuman niini, ang mga kaw-it gilunsad sa normal nga paagi - agig tubag sa mga panghitabo diin sila gilakip. Sa ulahing kaso, ang kaw-it makadawat sa nagbugkos nga konteksto (nagbugkos nga konteksto) - data sa JSON format, nga atong hisgutan sa mas detalyado sa ubos.

Paghimo usa ka operator sa Bash

Karon andam na kami alang sa pagpatuman. Aron mahimo kini, kinahanglan namon nga isulat ang duha nga mga gimbuhaton (sa paagi, girekomenda namon ang librarya shell_lib, nga gipasimple kaayo ang pagsulat sa mga kaw-it sa Bash):

  • ang una gikinahanglan alang sa yugto sa pag-configure - kini nagpakita sa nagbugkos nga konteksto;
  • ang ikaduha naglangkob sa nag-unang lohika sa kaw-it.

#!/bin/bash

source /shell_lib.sh

function __config__() {
  cat << EOF
    configVersion: v1
    # BINDING CONFIGURATION
EOF
}

function __main__() {
  # THE LOGIC
}

hook::run "$@"

Ang sunod nga lakang mao ang pagdesisyon kung unsang mga butang ang kinahanglan namon. Sa among kaso, kinahanglan namon nga bantayan:

  • tinubdan sekreto alang sa mga kausaban;
  • tanan nga mga namespace sa cluster, aron mahibal-an nimo kung kinsa ang adunay label nga gilakip niini;
  • target nga mga sekreto aron masiguro nga silang tanan nahiuyon sa gigikanan nga sekreto.

Mag-subscribe sa sekreto nga tinubdan

Ang pag-configure sa pagbugkos alang niini yano ra. Gipakita namon nga interesado kami sa Secret nga adunay ngalan mysecret sa namespace default:

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

function __config__() {
  cat << EOF
    configVersion: v1
    kubernetes:
    - name: src_secret
      apiVersion: v1
      kind: Secret
      nameSelector:
        matchNames:
        - mysecret
      namespace:
        nameSelector:
          matchNames: ["default"]
      group: main
EOF

Ingon nga resulta, ang kaw-it ma-trigger kung ang tinubdan nga sekreto mausab (src_secret) ug makadawat sa mosunod nga nagbugkos nga konteksto:

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Sama sa imong makita, kini naglangkob sa ngalan ug sa tibuok nga butang.

Pagsubay sa mga namespaces

Karon kinahanglan ka nga mag-subscribe sa mga namespace. Aron mahimo kini, among gitakda ang mosunud nga pag-configure sa pagbugkos:

- name: namespaces
  group: main
  apiVersion: v1
  kind: Namespace
  jqFilter: |
    {
      namespace: .metadata.name,
      hasLabel: (
       .metadata.labels // {} |  
         contains({"secret": "yes"})
      )
    }
  group: main
  keepFullObjectsInMemory: false

Sama sa imong makita, usa ka bag-ong field ang nagpakita sa configuration nga adunay ngalan jqFilter. Ingon sa gisugyot sa ngalan niini, jqFilter gisala ang tanan nga wala kinahanglana nga kasayuran ug nagmugna usa ka bag-ong butang nga JSON nga adunay mga natad nga interesado kanamo. Ang usa ka kaw-it nga adunay susama nga pagsumpo makadawat sa mosunod nga konteksto sa pagbugkos:

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Kini adunay usa ka array filterResults alang sa matag namespace sa cluster. Boolean nga variable hasLabel nagpakita kung ang usa ka label gilakip sa gihatag nga namespace. Tigpili keepFullObjectsInMemory: false nagpakita nga dili kinahanglan nga tipigan ang kompleto nga mga butang sa memorya.

Pagsubay sa mga sekreto sa target

Nag-subscribe kami sa tanan nga mga Sekreto nga adunay gipiho nga anotasyon managed-secret: "yes" (Kini ang among target dst_secrets):

- name: dst_secrets
  apiVersion: v1
  kind: Secret
  labelSelector:
    matchLabels:
      managed-secret: "yes"
  jqFilter: |
    {
      "namespace":
        .metadata.namespace,
      "resourceVersion":
        .metadata.annotations.resourceVersion
    }
  group: main
  keepFullObjectsInMemory: false

Sa kini nga kaso jqFilter nagsala sa tanang impormasyon gawas sa namespace ug parameter resourceVersion. Ang katapusang parameter gipasa sa anotasyon sa paghimo sa sekreto: kini nagtugot kanimo sa pagtandi sa mga bersyon sa mga sekreto ug ipadayon kini nga updated.

Ang usa ka kaw-it nga gi-configure niining paagiha, kung ipatuman, makadawat sa tulo nga nagbugkos nga konteksto nga gihulagway sa ibabaw. Mahimo silang isipon nga usa ka matang sa snapshot (snapshot) cluster.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Base sa tanan niini nga impormasyon, ang usa ka batakang algorithm mahimong maugmad. Gisubli niini ang tanan nga mga namespace ug:

  • kung hasLabel mga butang true alang sa kasamtangan nga namespace:
    • gitandi ang global nga sekreto sa lokal nga usa:
      • kon sila managsama, kini walay mahimo;
      • kung magkalainlain sila - ipatuman kubectl replace o create;
  • kung hasLabel mga butang false alang sa kasamtangan nga namespace:
    • gisiguro nga ang Secret wala sa gihatag nga namespace:
      • kung naa ang lokal nga Sekreto, kuhaa kini gamit kubectl delete;
      • kung dili makit-an ang lokal nga Sekreto, wala kini mahimo.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Pagpatuman sa algorithm sa Bash mahimo nimo i-download sa among mga repositoryo nga adunay mga pananglitan.

Mao kana kung giunsa namo paghimo ang usa ka yano nga Kubernetes controller gamit ang 35 ka linya sa YAML config ug halos parehas nga kantidad sa Bash code! Ang trabaho sa shell-operator mao ang pagsumpay kanila.

Bisan pa, ang pagkopya sa mga sekreto dili lamang ang lugar sa aplikasyon sa utility. Ania ang pipila pa nga mga pananglitan aron ipakita kung unsa ang iyang mahimo.

Pananglitan 1: Paghimo og mga kausaban sa ConfigMap

Atong tan-awon ang usa ka Deployment nga naglangkob sa tulo ka pod. Gigamit sa mga pod ang ConfigMap aron tipigan ang pipila ka configuration. Sa dihang gilusad ang mga pod, ang ConfigMap anaa sa usa ka piho nga kahimtang (tawgon nato kini nga v.1). Tungod niini, ang tanang pod naggamit niining partikular nga bersyon sa ConfigMap.

Karon atong hunahunaon nga ang ConfigMap nausab (v.2). Bisan pa, ang mga pod mogamit sa miaging bersyon sa ConfigMap (v.1):

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Unsaon nako sa pagpabalhin kanila ngadto sa bag-ong ConfigMap (v.2)? Ang tubag yano ra: gamita ang usa ka template. Magdugang ta og checksum annotation sa seksyon template Mga configuration sa deployment:

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Ingon usa ka sangputanan, kini nga checksum marehistro sa tanan nga mga pod, ug parehas kini sa Deployment. Karon kinahanglan nimo nga i-update ang annotation kung mabag-o ang ConfigMap. Ug ang shell-operator magamit sa kini nga kaso. Ang kinahanglan nimong buhaton mao ang programa usa ka hook nga mag-subscribe sa ConfigMap ug mag-update sa checksum.

Kung ang tiggamit maghimo mga pagbag-o sa ConfigMap, ang shell-operator makamatikod kanila ug kalkulahon pag-usab ang checksum. Pagkahuman ang salamangka sa Kubernetes magsugod: ang orkestra mopatay sa pod, maghimo usa ka bag-o, maghulat nga kini mahimong Ready, ug mopadayon sa sunod. Ingon usa ka sangputanan, ang Deployment mag-synchronize ug mobalhin sa bag-ong bersyon sa ConfigMap.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Pananglitan 2: Pagtrabaho uban sa Custom Resource Definition

Sama sa imong nahibal-an, ang Kubernetes nagtugot kanimo sa paghimo og mga custom nga matang sa mga butang. Pananglitan, makahimo ka og matang MysqlDatabase. Ingnon ta nga kini nga tipo adunay duha ka mga parameter sa metadata: name ΠΈ namespace.

apiVersion: example.com/v1alpha1
kind: MysqlDatabase
metadata:
  name: foo
  namespace: bar

Kami adunay usa ka Kubernetes cluster nga adunay lain-laing mga namespaces diin kami makahimo sa MySQL databases. Niini nga kaso ang shell-operator mahimong magamit sa pagsubay sa mga kapanguhaan MysqlDatabase, pagkonektar kanila sa MySQL server ug pag-synchronize sa gitinguha ug naobserbahan nga mga estado sa cluster.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Pananglitan 3: Cluster Network Monitoring

Sama sa imong nahibal-an, ang paggamit sa ping mao ang pinakasimple nga paagi sa pag-monitor sa usa ka network. Sa kini nga pananglitan ipakita namon kung giunsa ipatuman ang ingon nga pag-monitor gamit ang shell-operator.

Una sa tanan, kinahanglan nimo nga mag-subscribe sa mga node. Ang shell operator nagkinahanglan sa ngalan ug IP address sa matag node. Uban sa ilang tabang, iyang i-ping kini nga mga node.

configVersion: v1
kubernetes:
- name: nodes
  apiVersion: v1
  kind: Node
  jqFilter: |
    {
      name: .metadata.name,
      ip: (
       .status.addresses[] |  
        select(.type == "InternalIP") |
        .address
      )
    }
  group: main
  keepFullObjectsInMemory: false
  executeHookOnEvent: []
schedule:
- name: every_minute
  group: main
  crontab: "* * * * *"

Parameter executeHookOnEvent: [] nagpugong sa kaw-it sa pagdagan agig tubag sa bisan unsang panghitabo (nga mao, agig tubag sa pagbag-o, pagdugang, pagtangtang sa mga node). Apan, siya modagan (ug i-update ang listahan sa mga node) Gi-iskedyul - matag minuto, ingon nga gimando sa uma schedule.

Karon mitungha ang pangutana, giunsa nato pagkahibalo bahin sa mga problema sama sa pagkawala sa packet? Atong tan-awon ang code:

function __main__() {
  for i in $(seq 0 "$(context::jq -r '(.snapshots.nodes | length) - 1')"); do
    node_name="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.name')"
    node_ip="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.ip')"
    packets_lost=0
    if ! ping -c 1 "$node_ip" -t 1 ; then
      packets_lost=1
    fi
    cat >> "$METRICS_PATH" <<END
      {
        "name": "node_packets_lost",
        "add": $packets_lost,
        "labels": {
          "node": "$node_name"
        }
      }
END
  done
}

Gisubli namo ang lista sa mga node, kuhaa ang ilang mga ngalan ug IP address, i-ping kini ug ipadala ang mga resulta sa Prometheus. Ang Shell-operator mahimong maka-eksport sa mga sukatan sa Prometheus, i-save kini sa usa ka file nga nahimutang sumala sa agianan nga gitakda sa variable sa palibot $METRICS_PATH.

Dinhi makahimo ka ug operator para sa simple nga network monitoring sa usa ka cluster.

Mekanismo sa pagpila

Kini nga artikulo dili kompleto kung wala’y paghubit sa usa ka hinungdanon nga mekanismo nga gitukod sa shell-operator. Hunahunaa nga kini nagpatuman sa usa ka matang sa kaw-it isip tubag sa usa ka panghitabo sa cluster.

  • Unsa ang mahitabo kung, sa samang higayon, adunay mahitabo sa cluster? usa pa panghitabo?
  • Ang shell-operator ba magpadagan sa laing pananglitan sa hook?
  • Unsa kaha kung, ingnon ta, lima ka mga panghitabo ang mahitabo sa cluster sa usa ka higayon?
  • Ang shell-operator ba magproseso niini nga managsama?
  • Unsa man ang bahin sa nahurot nga mga kapanguhaan sama sa memorya ug CPU?

Maayo na lang, ang shell-operator adunay built-in nga mekanismo sa pagpila. Ang tanan nga mga panghitabo gipila ug giproseso nga sunud-sunod.

Atong iilustrar kini pinaagig mga pananglitan. Ingnon ta nga adunay duha ka kaw-it. Ang unang panghitabo moadto sa unang kaw-it. Kung nahuman na ang pagproseso niini, ang pila nagpadayon. Ang sunod nga tulo nga mga panghitabo gi-redirect sa ikaduha nga kaw-it - kini gikuha gikan sa pila ug gisulod kini sa usa ka "bundle". Kana mao Ang hook nakadawat usa ka han-ay sa mga panghitabo β€” o, mas tukma, usa ka han-ay sa nagbugkos nga mga konteksto.

Kini usab Ang mga panghitabo mahimong mahiusa sa usa ka dako. Ang parameter mao ang responsable niini group sa binding configuration.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Makahimo ka ug bisan unsang gidaghanon sa mga pila/mga kaw-it ug ang ilang lainlaing mga kombinasyon. Pananglitan, ang usa ka pila mahimong magamit sa duha ka kaw-it, o vice versa.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Ang kinahanglan nimong buhaton mao ang pag-configure sa uma sumala niana queue sa binding configuration. Kung ang ngalan sa pila wala gitino, ang kaw-it modagan sa default nga pila (default). Kini nga mekanismo sa pagpila nagtugot kanimo nga hingpit nga masulbad ang tanan nga mga problema sa pagdumala sa kapanguhaan kung nagtrabaho uban ang mga kaw-it.

konklusyon

Among gipatin-aw kung unsa ang shell-operator, gipakita kung giunsa kini magamit sa dali ug dali nga paghimo sa mga operator sa Kubernetes, ug naghatag daghang mga pananglitan sa paggamit niini.

Ang detalyado nga kasayuran bahin sa shell-operator, ingon man usa ka dali nga panudlo kung giunsa kini paggamit, magamit sa katugbang nga mga repositoryo sa GitHub. Ayaw pagpanuko sa pagkontak kanamo sa mga pangutana: mahimo nimong hisgutan kini sa usa ka espesyal Grupo sa telegrama (sa Russian) o sa kini nga forum (sa English).

Ug kung gusto nimo kini, kanunay kaming nalipay nga makita ang mga bag-ong isyu / PR / mga bituon sa GitHub, diin, sa paagi, makit-an nimo ang uban makapaikag nga mga proyekto. Lakip kanila kini angay nga ipasiugda addon-operator, nga mao ang dako nga igsoon sa shell-operator. Kini nga utility naggamit sa mga Helm chart aron i-install ang mga add-on, makahatag og mga update ug makamonitor sa nagkalain-laing mga parameter/values ​​sa tsart, makontrol ang proseso sa pag-instalar sa mga tsart, ug mahimo usab nga usbon kini isip tubag sa mga panghitabo sa cluster.

Lakaw? Bash! Himamata ang shell-operator (review ug video report gikan sa KubeCon EU'2020)

Mga video ug mga slide

Video gikan sa pasundayag (~23 minutos):


Presentasyon sa report:

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment