O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Selemong sena, kopano ea mantlha ea Kubernetes ea Europe - KubeCon + CloudNativeCon Europe 2020 - e ne e le teng. Leha ho le joalo, phetoho e joalo ea sebōpeho ha ea ka ea re thibela ho fana ka tlaleho ea rōna eo e leng khale e reriloe “E-ea? Bash! Kopana le Shell-operator” e inehetseng morerong oa rona oa Open Source khetla-mosebetsi.

Sengoliloeng sena, se khothalelitsoeng ke puo, se fana ka mokhoa oa ho nolofatsa mokhoa oa ho theha li-operator bakeng sa Kubernetes mme se bonts'a hore na u ka iketsetsa joang ka boikitlaetso bo fokolang ka ho sebelisa khetla.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Tsebisoa video ea tlaleho (~ Metsotso e ka bang 23 ka Senyesemane, e na le tsebo e ngata ho feta sengoloa) le karolo ea mantlha e tsoang ho eona ka mokhoa oa mongolo. Tsamaea!

Ho Flant re lula re ntlafatsa le ho iketsetsa tsohle. Kajeno re tla bua ka khopolo e 'ngoe e thabisang. Kopana: cloud-native shell scripting!

Leha ho le joalo, ha re qaleng ka moelelo oo sena sohle se etsahalang ho ona: Kubernetes.

Kubernetes API le balaoli

API ho Kubernetes e ka emeloa e le mofuta oa seva ea faele e nang le li-directory bakeng sa mofuta o mong le o mong oa ntho. Lintho (lisebelisoa) ho seva sena li emeloa ke lifaele tsa YAML. Ntle le moo, seva e na le API ea mantlha e u lumellang ho etsa lintho tse tharo:

  • amohela mohlodi ka mofuta le lebitso la ona;
  • fetoha sesebelisoa (tabeng ena, seva se boloka feela lintho tse "nepahetseng" - tsohle tse entsoeng ka phoso kapa tse reretsoeng li-directory tse ling li lahliloe);
  • pina bakeng sa sesebelisoa (tabeng ena, mosebelisi o fumana hang-hang mofuta oa hona joale / o ntlafalitsoeng).

Kahoo, Kubernetes e sebetsa joalo ka mofuta oa seva ea faele (bakeng sa YAML e bonts'a) ka mekhoa e meraro ea mantlha (e, ho na le tse ling, empa re tla li tlohela hajoale).

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Bothata ke hore seva se khona ho boloka tlhahisoleseling feela. Ho etsa hore e sebetse o hloka molaoli - mohopolo oa bobeli oa bohlokoa le oa bohlokoa lefats'eng la Kubernetes.

Ho na le mefuta e 'meli e meholo ea balaoli. Ea pele e nka tlhahisoleseling ho Kubernetes, e e sebetsa ho latela logic e behiloeng, ebe e e khutlisetsa ho K8s. Ea bobeli e nka boitsebiso ho Kubernetes, empa, ho fapana le mofuta oa pele, e fetola boemo ba mehloli e meng ea kantle.

Ha re shebisiseng mokhoa oa ho theha Phallo ho Kubernetes:

  • Deployment Controller (e kenyellelitsoe ho kube-controller-manager) e fumana tlhahisoleseling mabapi le Deployment mme e theha ReplicaSet.
  • ReplicaSet e theha likopi tse peli (li-pods tse peli) ho latela tlhaiso-leseling ena, empa li-pods tsena ha li so hlophisoe.
  • Mohlophisi o hlophisa li-pods mme o eketsa lintlha tsa node ho YAML ea bona.
  • Li-Kubelets li etsa liphetoho ho sesebelisoa sa kantle (e re Docker).

Joale tatelano ena kaofela e phetoa ka tatellano e fapaneng: kubelet e hlahloba lijana, e lekanya boemo ba pod ebe e e khutlisetsa morao. Molaoli oa ReplicaSet o amohela boemo mme o ntlafatsa boemo ba sete ea replica. Ho etsahala ntho e tšoanang le Mookameli oa Phatlalatso 'me qetellong mosebedisi o fumana boemo bo ntlafalitsoeng (hona joale).

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Shell-operator

Hoa etsahala hore Kubernetes e thehiloe mosebetsing o kopanetsoeng oa balaoli ba fapaneng (Basebelisi ba Kubernetes le bona ke balaoli). Ho hlaha potso ea hore na u ka iketsetsa opereishene ea hau joang ka boiteko bo fokolang? Mme ke ena eo re e ntlafaditseng e re thusa khetla-mosebetsi. E lumella batsamaisi ba tsamaiso ho iketsetsa lipolelo ba sebelisa mekhoa e tloaelehileng.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Mohlala o bonolo: ho kopitsa liphiri

A re shebeng mohlala o bonolo.

Ha re re re na le sehlopha sa Kubernetes. E na le sebaka sa mabitso default ka Sephiri se itseng mysecret. Ho feta moo, ho na le libaka tse ling tsa mabitso sehlopheng. Tse ling tsa tsona li na le label e khethehileng e khomaretsoeng ho tsona. Sepheo sa rona ke ho kopitsa Lekunutu libakeng tsa mabitso ka leibole.

Mosebetsi o thatafalitsoe ke taba ea hore libaka tse ncha tsa mabitso li ka hlaha sehlopheng, 'me tse ling tsa tsona li ka ba le lengolo lena. Ka lehlakoreng le leng, ha lengolo le hlakotsoe, Lekunutu le lona le lokela ho hlakoloa. Ho phaella ho sena, Sephiri ka boeona se ka boela sa fetoha: tabeng ena, Lekunutu le lecha le tlameha ho kopitsoa libakeng tsohle tsa mabitso tse nang le mabitso. Haeba Lekunutu le hlakotsoe ka phoso sebakeng sefe kapa sefe sa mabitso, opereishene ea rona e lokela ho e khutlisa hanghang.

Kaha joale mosebetsi o se o hlophisitsoe, ke nako ea ho qala ho o kenya ts'ebetsong ka ho sebelisa shell-operator. Empa pele ho bohlokoa ho bua mantsoe a seng makae mabapi le khetla-opereishene ka boeona.

Kamoo shell-operator e sebetsang kateng

Joalo ka mesebetsi e meng ho Kubernetes, shell-operator e sebetsa ka har'a pod ea eona. Ka pod ena bukeng ea /hooks lifaele tse phethiloeng lia bolokoa. Tsena e ka ba lingoloa ho Bash, Python, Ruby, joalo-joalo. Re bitsa lifaele tse joalo tse sebetsang lihoko (hooks).

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Shell-operator e ingolisa ho liketsahalo tsa Kubernetes mme e tsamaisa lihoko tsena ho arabela liketsahalong tseo re li hlokang.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Sebapali sa khetla se tseba joang hore na ho na le hoke efe le neng? Taba ke hore hook e 'ngoe le e 'ngoe e na le mekhahlelo e' meli. Nakong ea ho qala, shell-operator e tsamaisa lihakisi tsohle ka khang --config Ena ke boemo ba tlhophiso. 'Me ka mor'a eona, li-hook li qalisoa ka mokhoa o tloaelehileng - ho arabela liketsahalong tseo ba li khomaretseng. Tabeng ea ho qetela, hook e fumana moelelo o tlamang (moelelo o tlamang) - data ka sebopeho sa JSON, seo re tla bua ka sona ka botlalo ka tlase.

Ho etsa opareitara ho Bash

Jwale re se re loketse ho kenngwa tshebetsong. Ho etsa sena, re hloka ho ngola mesebetsi e 'meli (ka tsela, re khothaletsa laeborari khetla_lib, e nolofatsang lihoko tsa ho ngola haholo ka Bash):

  • ea pele e hlokahala bakeng sa sethala sa tlhophiso - e bonts'a moelelo o tlamang;
  • ea bobeli e na le moelelo oa sehlooho oa hook.

#!/bin/bash

source /shell_lib.sh

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

function __main__() {
  # THE LOGIC
}

hook::run "$@"

Mohato o latelang ke ho etsa qeto ea hore na re hloka lintho life. Tabeng ea rona, re lokela ho ela hloko:

  • sephiri sa mohloli bakeng sa liphetoho;
  • libaka tsohle tsa mabitso sehlopheng, e le hore u tsebe hore na ke life tse nang le leibole e khomaretsoeng ho tsona;
  • liphiri tsa sepheo ho netefatsa hore kaofela li lumellana le sephiri sa mohloli.

Ingolise ho mohloli oa lekunutu

Tlhophiso e tlamang bakeng sa eona e bonolo haholo. Re bontša hore re thahasella Lekunutu ka lebitso mysecret sebakeng sa mabitso default:

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho 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

Ka lebaka leo, hook e tla qala ha sephiri sa mohloli se fetoha (src_secret) 'me u fumane moelelo o latelang o tlamang:

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Joalokaha u bona, e na le lebitso le ntho eohle.

Ho boloka tlaleho ea libaka tsa mabitso

Joale o hloka ho ingolisa ho libaka tsa mabitso. Ho etsa sena, re totobatsa tlhophiso e latelang e tlamang:

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

Joalokaha u ka bona, tšimo e ncha e hlahile ho tlhophiso e nang le lebitso jqFilter. Joalokaha lebitso la eona le bontša, jqFilter e sefa tlhahisoleseling eohle e sa hlokahaleng mme e theha ntho e ncha ea JSON e nang le masimo a re khahlang. Hook e nang le tlhophiso e ts'oanang e tla fumana moelelo o tlamang o latelang:

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

E na le sehlopha filterResults bakeng sa sebaka ka seng sa mabitso sehlopheng. Phapang ea Boolean hasLabel e bonts'a hore na leibole e khomaretsoe sebakeng se fanoeng sa mabitso. Mokhethi keepFullObjectsInMemory: false e bontša hore ha ho hlokahale ho boloka lintho tse feletseng mohopolong.

Tracking target liphiri

Re ingolisa ho Liphiri tsohle tse nang le litlhaloso tse boletsoeng managed-secret: "yes" (tsena ke sepheo sa rona 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

Le ntlheng ena jqFilter e sefa lintlha tsohle ntle le sebaka sa mabitso le paramethara resourceVersion. Parameter ea ho qetela e fetiselitsoe ho tlhaloso ha u theha sephiri: e u lumella ho bapisa mefuta ea liphiri le ho li boloka li le morao tjena.

Hook e hlophisitsoeng ka tsela ena, ha e etsoa, ​​​​e tla amohela maemo a mararo a tlamang a hlalositsoeng ka holimo. Li ka nkoa e le mofuta oa setšoantšo (sekhetho) sehlopha.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Ho itšetlehile ka boitsebiso bona bohle, algorithm ea motheo e ka etsoa. E pheta-pheta libakeng tsohle tsa mabitso le:

  • haeba hasLabel ditaba true bakeng sa sebaka sa hajoale sa mabitso:
    • e bapisa sephiri sa lefats'e le sa lehae:
      • haeba li tšoana, ha ho etse letho;
      • haeba li fapane - e etsa kubectl replace kapa create;
  • haeba hasLabel ditaba false bakeng sa sebaka sa hajoale sa mabitso:
    • e etsa bonnete ba hore Lekunutu ha le eo sebakeng se fanoeng sa mabitso:
      • haeba Lekunutu la lehae le le teng, le hlakole ka ho sebelisa kubectl delete;
      • ha Sephiri sa lehae se sa fumanwe, ha se etse letho.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Ts'ebetsong ea algorithm ho Bash o ka khoasolla ho rona polokelong ka mehlala.

Ke kamoo re khonneng ho theha molaoli o bonolo oa Kubernetes re sebelisa mela e 35 ea YAML config le palo e lekanang le ea Bash code! Mosebetsi oa khetla ke ho li hokahanya hammoho.

Leha ho le joalo, ho kopitsa liphiri ha se eona feela sebaka sa ts'ebeliso ea ts'ebeliso. Mehlala e meng e seng mekae ke ena ho bontša seo a khonang ho se etsa.

Mohlala 1: Ho etsa liphetoho ho ConfigMap

Ha re shebeng Phatlalatso e nang le li-pod tse tharo. Li-Pod li sebelisa ConfigMap ho boloka tlhophiso e itseng. Ha li-pods li qala, ConfigMap e ne e le boemong bo itseng (ha re e bitse v.1). Ka hona, li-pods tsohle li sebelisa mofuta ona oa ConfigMap.

Joale ha re nke hore ConfigMap e fetohile (v.2). Leha ho le joalo, li-pods li tla sebelisa mofuta o fetileng oa ConfigMap (v.1):

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Nka etsa joang hore ba fetohele ho ConfigMap e ncha (v.2)? Karabo e bonolo: sebelisa template. Ha re kenye tlhaloso ea checksum karolong template Litlhophiso tsa phepelo:

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Ka lebaka leo, checksum ena e tla ngolisoa ho li-pods tsohle, 'me e tla tšoana le ea Deployment. Joale o hloka feela ho nchafatsa litlatsetso ha ConfigMap e fetoha. 'Me mochine oa likhetla o tla sebetsa tabeng ena. Seo u hlokang ho se etsa feela ke lenaneo hoko e tla ingolisa ho ConfigMap le ho nchafatsa cheke.

Haeba mosebelisi a etsa liphetoho ho ConfigMap, moetsi oa khetla o tla li hlokomela ebe o bala cheke hape. Ka mor'a moo boselamose ba Kubernetes bo tla sebetsa: 'mino oa liletsa o tla bolaea pod, a thehe e ncha, a emele hore e fetohe. Ready, ebe o fetela ho e latelang. Ka lebaka leo, Deployment e tla hokahanya le ho fetohela mofuteng o mocha oa ConfigMap.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Mohlala 2: Ho sebetsa ka Litlhaloso tsa Custom Resource

Joalo ka ha u tseba, Kubernetes e u lumella ho etsa mefuta e tloaelehileng ea lintho. Ka mohlala, u ka etsa mofuta o motle MysqlDatabase. Ha re re mofuta ona o na le liparamente tse peli tsa metadata: name и namespace.

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

Re na le sehlopha sa Kubernetes se nang le libaka tse fapaneng tsa mabitso moo re ka thehang database tsa MySQL. Tabeng ena, shell-operator e ka sebelisoa ho latela lisebelisoa MysqlDatabase, ho li hokahanya le seva sa MySQL le ho hokahanya linaha tse lakatsehang le tse hlokometsoeng tsa sehlopha.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Mohlala 3: Cluster Network Monitoring

Joalo ka ha u tseba, ho sebelisa ping ke mokhoa o bonolo oa ho beha leihlo marang-rang. Mohlaleng ona re tla bonts'a mokhoa oa ho kenya ts'ebetso ea ho beha leihlo ho sebelisa shell-operator.

Pele ho tsohle, o tla hloka ho ingolisa ho li-node. Mokhanni oa khetla o hloka lebitso le aterese ea IP ea node ka 'ngoe. Ka thuso ea bona, o tla penya li-node tsena.

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: [] e thibela hook hore e se ke ea sebetsa ka lebaka la ketsahalo leha e le efe (ke hore, ho arabela ho fetola, ho eketsa, ho tlosa li-node). Leha ho le joalo, eena e tla matha ('me u ntlafatse lenane la li-node) E hlophisitsoeng - motsotso o mong le o mong, joalo ka ha ho laetsoe ke tšimo schedule.

Joale ho hlaha potso, hantle-ntle re tseba joang ka mathata a kang tahlehelo ea pakete? Ha re shebeng khoutu:

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
}

Re pheta lethathamo la li-node, re fumana mabitso a bona le liaterese tsa IP, re li ping ebe re romella liphetho ho Prometheus. Shell-operator e ka romella metrics ho Prometheus, ho li boloka faeleng e fumanehang ho latela tsela e boletsoeng ho feto-fetoha ha tikoloho $METRICS_PATH.

Mona ho joalo o ka etsa opareitara bakeng sa tlhahlobo e bonolo ea marang-rang ka har'a sehlopha.

Mochini oa ho etsa mela

Sengoliloeng sena se tla be se sa phethahala ntle le ho hlalosa mokhoa o mong oa bohlokoa o hahelletsoeng ka har'a khetla. Nahana hore e etsa mofuta o itseng oa hook ho arabela ketsahalo e sehlopheng.

  • Ho etsahala'ng haeba, ka nako e tšoanang, ntho e 'ngoe e etsahala sehlopheng? E 'ngoe ketsahalo?
  • Na shell-operator e tla tsamaisa mohlala o mong oa hook?
  • Ho thoe'ng haeba, ha re re, liketsahalo tse hlano li etsahala sehlopheng ka nako e le 'ngoe?
  • A na shell-operator e tla li sebetsa ka ho bapisa?
  • Ho thoe'ng ka lisebelisoa tse sebelisitsoeng tse kang memori le CPU?

Ka lehlohonolo, shell-operator e na le mochine o hahelletsoeng ka har'a queuing. Liketsahalo tsohle li behiloe moleng le ho sebetsoa ka tatellano.

A re ke re bontše sena ka mehlala. Ha re re re na le lihakisi tse peli. Ketsahalo ea pele e ea ho hook ea pele. Hang ha ts'ebetso ea eona e felile, mokoloko o tsoela pele. Liketsahalo tse tharo tse latelang li fetisetsoa ho hook ea bobeli - li ntšoa moleng ebe li kenngoa ho eona ka "bundle". Ke hore hook e amohela letoto la diketsahalo - kapa, ka nepo, letoto la maemo a tlamang.

Hape tsena liketsahalo li ka kopanngoa ho ba kholo e le 'ngoe. Parameter e ikarabella bakeng sa sena group setaeleng se tlamang.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

O ka etsa palo efe kapa efe ea mela/hook le metsoako ea tsona e fapaneng. Mohlala, mokoloko o le mong o ka sebetsa ka lihakisi tse peli, kapa ka tsela e fapaneng.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Seo u hlokang ho se etsa feela ke ho lokisa sebaka ka nepo queue setaeleng se tlamang. Haeba lebitso la queue le sa hlalosoa, hook e matha letotong la kamehla (default). Mokhoa ona oa queuing o u lumella ho rarolla mathata ohle a taolo ea lisebelisoa ka botlalo ha u sebetsa ka lihakisi.

fihlela qeto e

Re hlalositse hore na shell-operator ke eng, re bontšitse hore na e ka sebelisoa joang ho theha basebetsi ba Kubernetes kapele le ka thata, 'me ra fana ka mehlala e mengata ea tšebeliso ea eona.

Lintlha tse qaqileng mabapi le khetla-opereishene, hammoho le thupelo e potlakileng mabapi le mokhoa oa ho e sebelisa, e fumaneha ka har'a sengoloa. libaka tsa polokelo ho GitHub. Se ke oa tsilatsila ho ikopanya le rona ka lipotso: o ka buisana ka tsona ka mokhoa o khethehileng Sehlopha sa Telegraph (ka Serussia) kapa ka forum ena (ka Senyesemane).

'Me haeba u e ratile, kamehla re thabela ho bona litaba tse ncha / PR / linaleli ho GitHub, moo, ka tsela, u ka fumanang ba bang. merero e khahlisang. Har'a bona ke habohlokoa ho totobatsa addon-opereta, eo e leng moholoane oa khetla. Ts'ebeliso ena e sebelisa lichate tsa Helm ho kenya li-add-on, e ka fana ka lintlafatso le ho lekola mekhahlelo / litekanyetso tse fapaneng tsa lichate, e laola ts'ebetso ea ho kenya lichate, hape e ka li fetola ho latela liketsahalo tse sehlopheng.

O ea? Bash! Kopana le moetsi oa likhetla (tlhahlobo le tlaleho ea video e tsoang ho KubeCon EU'2020)

Lifitio le li-slide

Video e tsoang tšebetsong (~ metsotso e 23):


Tlhahiso ea tlaleho:

PES

Bala hape ho blog ea rona:

Source: www.habr.com

Eketsa ka tlhaloso