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

Karong tuiga, ang pangunang Kubernetes conference sa Europe—KubeCon + CloudNativeCon Europe 2020—gipahigayon nga virtual. Apan, kini nga pagbag-o sa format wala makapugong kanamo sa paghatag sa among dugay nang giplano nga pakigpulong, "Go? Bash! Meet the Shell Operator," nga gipahinungod sa among open source nga proyekto. shell-operator.

Kini nga artikulo, base sa pakigpulong, nagpresentar og usa ka pamaagi sa pagpasimple sa proseso sa paghimo og mga operator para sa Kubernetes ug nagpakita kon unsaon nimo paghimo sa imong kaugalingon nga gamay ra ang paningkamot gamit ang shell operator.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Pagpaila video sa report (~23 minutos sa Iningles, mas daghan og impormasyon kay sa artikulo) ug usa ka sumaryo niini sa porma sa teksto. Tara na!

Sa Flant, kanunay namong gi-optimize ug gi-automate ang tanan. Karong adlawa, atong hisgutan ang laing makaiikag nga konsepto. Pakigkita kang: cloud-native shell scripting!

Apan, magsugod kita sa konteksto diin kini tanan nahitabo: Kubernetes.

Kubernetes API ug mga Controller

Ang Kubernetes API mahimong isipon nga usa ka file server nga adunay mga direktoryo alang sa matag klase sa butang. Ang mga butang (mga kapanguhaan) niini nga server girepresentahan sa mga YAML file. Dugang pa, ang server adunay usa ka batakang API nga nagtugot kanimo sa pagbuhat sa tulo ka mga butang:

  • pagkuha kahinguhaan pinaagi sa matang ug ngalan niini;
  • pagbag-o kapanguhaan (sa kini nga kaso, ang server nagtipig lamang sa mga "sakto" nga mga butang - ang tanan nga dili husto nga naporma o kadtong gituyo alang sa ubang mga direktoryo gilabay);
  • track para sa kahinguhaan (sa kini nga kaso, ang tiggamit makadawat dayon sa iyang kasamtangan/gi-update nga bersyon).

Mao nga, ang Kubernetes nagsilbing usa ka klase sa file server (para sa mga YAML manifest) nga adunay tulo ka batakang pamaagi (oo, naa pay uban, apan laktawan nato kini sa pagkakaron).

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Ang problema kay impormasyon ra ang matipigan sa server. Aron kini mogana, kinahanglan nimo controller — ang ikaduha nga labing importante ug pundamental nga konsepto sa kalibutan sa Kubernetes.

Adunay duha ka pangunang klase sa mga controller. Ang una mokuha og impormasyon gikan sa Kubernetes, iproseso kini sumala sa nested logic, ug ibalik kini sa mga K8. Ang ikaduha mokuha og impormasyon gikan sa Kubernetes apan, dili sama sa unang klase, mo-usab sa kahimtang sa mga external resources.

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

  • Tigkontrol sa Pag-deploy (gilakip sa kube-controller-manager) modawat og impormasyon bahin sa Deployment ug mohimo og ReplicaSet.
  • Ang ReplicaSet nagmugna og duha ka replica (duha ka pod) base niini nga impormasyon, apan kini nga mga pod wala pa ma-iskedyul.
  • Ang scheduler mo-iskedyul sa mga pod ug modugang og impormasyon sa node sa ilang mga YAML.
  • Ang mga Kubelets mohimo og mga pagbag-o sa usa ka eksternal nga kapanguhaan (pananglitan, Docker).

Dayon kining tibuok nga han-ay balik-balikon: ang kubelet mosusi sa mga container, mokalkulo sa status sa pod, ug ipadala kini balik. Ang ReplicaSet Controller modawat sa status ug mo-update sa state sa replica set. Mao usab kini ang mahitabo sa Deployment Controller, ug ang user sa katapusan makadawat sa updated (karon) nga status.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Shell-operator

Migawas nga ang Kubernetes gitukod sa kolaborasyon sa lain-laing mga controller (ang mga operator sa Kubernetes mga controller usab). Ang pangutana motungha: unsaon nimo paghimo sa imong kaugalingong operator nga gamay ra ang paningkamot? Ug mao kana ang hinungdan nganong ang atong operator mosulod. shell-operatorGitugotan niini ang mga administrador sa sistema sa paghimo sa ilang kaugalingong mga operator gamit ang pamilyar nga mga pamaagi.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Usa ka yanong ehemplo: pagkopya sa mga sekreto

Atong tan-awon ang usa ka yano nga ehemplo.

Ingnon ta nga naa tay Kubernetes cluster. Naa kini namespace. default uban sa pipila ka Sekreto mysecretAdunay usab ubang mga namespace sa cluster. Ang uban niini 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 namespace mahimong makita sa cluster, ug ang uban niini mahimong adunay kini nga label. Sa laing bahin, kung ang label mapapas, ang Sekreto kinahanglan usab nga mapapas. Dugang pa, ang Sekreto mismo mahimo usab nga mausab: sa kini nga kaso, ang bag-ong Sekreto kinahanglan nga kopyahon sa tanan nga mga namespace nga adunay mga label. Kung ang usa ka Sekreto aksidente nga mapapas sa bisan unsang namespace, ang among operator kinahanglan nga ibalik kini dayon.

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

Giunsa pagtrabaho ang operator sa shell

Sama sa ubang mga workload sa Kubernetes, ang shell-operator modagan sa kaugalingon niining pod. Niini nga pod, sa direktoryo /hooks Ang mga executable file gitipigan. Mahimo kini nga mga script sa Bash, Python, Ruby, ug uban pa. Gitawag nato ang ingon nga mga executable file nga mga kaw-it (mga kaw-it).

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Ang shell operator mo-subscribe sa mga Kubernetes events ug modagan niining mga hooks agig tubag sa mga events nga atong gikinahanglan.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Giunsa pagkahibalo sa shell-operator kung unsang hook ang ipadagan ug kanus-a? Ang matag hook adunay duha ka yugto. Atol sa pagsugod, ang shell-operator mopadagan sa tanang hook nga adunay argumento. --config — kini ang yugto sa pag-configure. Human niini, ang mga kaw-it gipatuman sa normal nga paagi—isip tubag sa mga panghitabo nga ilang gigapos. Sa ulahing kaso, ang kaw-it makadawat og konteksto sa paggapos (konteksto sa pagbugkos) — datos sa JSON format, nga atong hisgutan sa mas detalyado sa ubos.

Paghimo og operator sa Bash

Karon andam na kita alang sa implementasyon. Aron mahimo kini, kinahanglan natong isulat ang duha ka gimbuhaton (nga among girekomendar ang librarya shell_lib, nga nagpasimple pag-ayo sa mga writing hook sa Bash):

  • ang una gikinahanglan para sa yugto sa pag-configure - kini mopagawas sa konteksto sa pagbugkos;
  • Ang ikaduha naglangkob sa pangunang 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 pagtino kung unsang mga butang ang atong gikinahanglan. Sa atong kaso, kinahanglan natong sundan:

  • sekreto sa tinubdan para sa mga pagbag-o;
  • tanang namespaces sa cluster, aron mahibal-an kung hain ang adunay label nga gilakip niini;
  • mga sekreto sa target aron masiguro nga kini tanan nahiuyon sa sekreto sa tinubdan.

Mag-subscribe sa sekreto nga tinubdan

Ang pagkahan-ay sa pagbugkos niini yano ra kaayo. Atong ipiho nga kita interesado sa usa ka Sekreto nga ginganlan og mysecret sa namespace default:

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

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

Tungod niini, ang hook mo-trigger kon ang source secret mausab (src_secret) ug makadawat sa mosunod nga konteksto sa pagbugkos:

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

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

Pagsubay sa mga namespace

Karon kinahanglan natong mag-subscribe sa mga namespace. Aron mahimo kini, atong ipiho ang mosunod nga binding configuration:

- 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 nga ginganlan ang nagpakita sa configuration. jqFilter. Sama sa gisugyot sa ngalan niini, jqFilter Gisala ang tanang dili kinahanglan nga impormasyon ug naghimo og bag-ong JSON object nga adunay mga field nga atong gusto. Ang hook nga adunay kini nga configuration makadawat sa mosunod nga binding context:

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Kini adunay sulod nga usa ka array filterResults para sa matag namespace sa cluster. Boolean variable hasLabel Nagpakita kung ang label gilakip ba sa gihatag nga namespace. Tigpili keepFullObjectsInMemory: false nagpakita nga dili na kinahanglan nga tipigan ang kompletong mga butang sa memorya.

Pagsubay sa mga sekreto nga target

Nag-subscribe kami sa tanan nga mga Sekreto nga adunay usa ka set sa anotasyon managed-secret: "yes" (kini ang atong mga 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 gisala ang tanang impormasyon gawas sa namespace ug parameter resourceVersionAng katapusang parameter gipasa sa anotasyon sa paghimo sa sekreto: gitugotan ka niini nga itandi ang mga bersyon sa mga sekreto ug ipadayon kini nga updated.

Ang usa ka hook nga gi-configure niining paagiha makadawat sa tulo ka binding contexts nga gihulagway sa ibabaw kon ipatuman. Kini mahimong isipon nga usa ka matang sa snapshot (snapshot) pungpong.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Base sa tanan niining impormasyon, makahimo kita og usa ka batakang algorithm. Kini mo-iterate sa tanang namespaces ug:

  • kung hasLabel mga butang true para sa kasamtangang namespace:
    • nagtandi sa sekreto sa tibuok kalibutan ug sa sekreto sa lokal:
      • kon parehas ra sila - walay gibuhat;
      • kon lahi sila, kini ipahigayon kubectl replace o create;
  • kung hasLabel mga butang false para sa kasamtangang namespace:
    • gisiguro nga ang Sekreto wala sa gihatag nga namespace:
      • Kon naa ang lokal nga Sekreto, papasa kini gamit ang kubectl delete;
      • Kon ang lokal nga Sekreto dili makit-an, wala kini mahimo.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Pagpatuman sa algorithm sa Bash mahimo nimo kini i-download gikan 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 gidaghanon sa Bash code! Ang trabaho sa shell-operator mao ang pagkonektar kanila.

Apan, ang pagkopya sa mga sekreto dili lang ang gamit sa utility. Ania ang pipila pa ka mga ehemplo aron ipakita ang mga kapabilidad niini.

Ehemplo 1: Paghimo og mga pagbag-o sa ConfigMap

Atong hisgotan ang usa ka Deployment nga gilangkoban sa tulo ka pod. Ang mga pod mogamit og ConfigMap aron tipigan ang pipila ka configuration. Sa dihang gilunsad ang mga pod, ang ConfigMap naa sa usa ka piho nga estado (tawgon nato kini nga v.1). Busa, ang tanang pod mogamit niini nga bersyon sa ConfigMap.

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

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Unsaon nako sila pagpabalhin ngadto sa bag-ong ConfigMap (v.2)? Yano ra ang tubag: gamita ang template. Magdugang ta og checksum annotation sa seksyon. template Mga Konpigurasyon sa Pag-deploy:

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Tungod niini, ang tanang pods adunay kini nga checksum, ug kini parehas ra sa Deployment's. Karon kinahanglan ra nimo nga i-update ang annotation kung kanus-a mausab ang ConfigMap. Ug ang shell operator perpekto para niini. Ang kinahanglan ra nimo buhaton mao ang pag-program niini. usa ka hook nga mo-subscribe sa ConfigMap ug mo-update sa checksum.

Kon ang tiggamit mohimo og mga pagbag-o sa ConfigMap, ang shell operator makamatikod niini ug makalkulo pag-usab sa checksum. Dayon ang Kubernetes magic mo-epekto: ang orchestrator mopatay sa pod, mohimo og bag-o, ug maghulat nga kini mahimong Ready, ug mobalhin sa sunod. Kini mo-sync sa Deployment ug mobalhin niini ngadto sa bag-ong bersyon sa ConfigMap.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Ehemplo 2: Pagtrabaho uban sa Custom Resource Definitions

Sama sa imong nahibaloan, ang Kubernetes nagtugot kanimo sa paghimo og custom object types (mga klase). Pananglitan, mahimo kang maghimo og kind MysqlDatabaseIngnon ta nga kini nga tipo adunay duha ka parameter sa metadata: name и namespace.

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

Naa tay Kubernetes cluster nga adunay lain-laing namespaces diin makahimo ta og MySQL databases. Sa kini nga kaso, ang shell operator magamit sa pagmonitor sa mga resources. MysqlDatabase, ang ilang koneksyon sa MySQL server ug ang pag-synchronize sa gitinguha ug naobserbahan nga mga estado sa cluster.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Ehemplo 3: Pagmonitor sa usa ka Cluster Network

Sama sa atong nahibaloan, ang paggamit sa ping mao ang pinakasimple nga paagi sa pagmonitor sa usa ka network. Niini nga ehemplo, atong ipakita kung unsaon pagpatuman sa susamang pagmonitor gamit ang shell operator.

Una, kinahanglan ka nga mag-subscribe sa mga node. Kinahanglan sa shell operator ang ngalan ug IP address sa matag node. Gamiton niini kini aron 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: [] makapugong sa hook nga ma-fire agig tubag sa bisan unsang panghitabo (kana mao, agig tubag sa pag-ilis, pagdugang, o pagtangtang sa mga node). Bisan pa, kini ilunsad (ug i-update ang lista sa node) sumala sa iskedyul - matag minuto, sumala sa gimando sa natad schedule.

Karon ang pangutana motumaw, unsaon gyud nato pag-ila sa mga isyu sama sa packet loss? 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
}

Among gisubli-subli ang listahan sa mga node, gikuha ang ilang mga ngalan ug IP address, gi-ping kini, ug gipadala ang mga resulta sa Prometheus. Ang Shell-operator maka-export og mga metrics ngadto sa Prometheus, nga nagtipig niini sa usa ka file nga nahimutang sumala sa agianan nga gitino sa variable sa palibot $METRICS_PATH.

Dinhi Mahimo kang maghimo og operator para sa simpleng network monitoring sa usa ka cluster.

Mekanismo sa pagpila

Dili kompleto kining artikuloha kon dili nato ihulagway ang laing importanteng mekanismo nga anaa sa shell-operator. Handurawa nga kini nagpatuman og hook isip tubag sa usa ka panghitabo sa cluster.

  • Unsay mahitabo kon adunay mahitabo sa cluster sa samang higayon? usa pa ka butang panghitabo?
  • Mopadagan ba ang shell-operator og laing instance sa hook?
  • Unsa man kon, pananglitan, lima ka panghitabo ang mahitabo sa usa ka cluster sa samang higayon?
  • Iproseso ba kini sa shell-operator nga dungan?
  • Kumusta man ang mga nagamit nga kahinguhaan sama sa memorya ug CPU?

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

Atong iilustrar kini gamit ang mga ehemplo. Pananglit naa tay duha ka hook. Ang unang event moadto sa unang hook. Kung maproseso na kini, ang pila mopadayon. Ang sunod nga tulo ka event ipasa ngadto sa ikaduhang hook—kini kuhaon gikan sa pila ug idugang sa usa ka "batch." Kana mao, ang kaw-it makadawat og lain-laing mga panghitabo — o, mas tukma, usa ka han-ay sa mga konteksto nga nagbugkos.

Ug kini usab ang mga panghitabo mahimong iusa ngadto sa usa ka dako nga usaAng parameter mao ang responsable niini. group sa konpigurasyon sa pagbugkos.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Mahimo kang maghimo og bisan unsang gidaghanon sa mga pila/hook ug ang ilang lain-laing mga kombinasyon. Pananglitan, ang usa ka pila mahimong mogana uban ang duha ka hook, o vice versa.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Ang kinahanglan ra nimong buhaton mao ang pag-configure sa field sumala niana. queue sa binding configuration. Kon walay gipiho nga ngalan sa pila, ang hook modagan sa default queue (defaultKini nga mekanismo sa pagpila nagtugot kanato sa hingpit nga pagsulbad sa tanang isyu sa pagdumala sa kahinguhaan kung nagtrabaho gamit ang mga hook.

konklusyon

Among gipasabot kon unsa ang shell-operator, gipakita kon unsaon kini paggamit aron dali ug sayon ​​nga makahimo og mga Kubernetes operator, ug naghatag og pipila ka mga ehemplo sa paggamit niini.

Ang detalyadong impormasyon bahin sa shell-operator, ingon man usa ka dali nga giya kung giunsa kini gamiton, anaa sa katugbang nga mga repositoryo sa GitHubAyaw pagpanuko sa pagkontak kanamo kung adunay mga pangutana: mahimo nimo kini hisgutan sa usa ka espesyal nga Grupo sa Telegram (sa Ruso) o sa kini nga forum (sa Iningles).

Ug kon ganahan ka niini, malipayon kami nga makakita og mga bag-ong isyu/PR/bituon sa GitHub, diin, laing bahin, makit-an nimo ang uban pa. makapaikag nga mga proyektoLakip niini, angay i-highlight addon-operator, nga mao ang magulang nga igsoon sa shell-operatorKini nga utility naggamit og Helm charts aron mag-install og mga add-on, maghatud og mga update, magmonitor sa lain-laing mga parameter/value sa chart, mokontrol sa proseso sa pag-install sa chart, ug makausab niini agig tubag sa mga cluster event.

Go? Bash! Himamata ang shell operator (review ug video sa KubeCon EU'2020 talk)

Mga video ug mga slide

Video gikan sa pasundayag (~23 minutos):

Pagdula sa video

Presentasyon sa report:

PS

Basaha usab sa among blog:

Source: www.habr.com