Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

O le tausaga nei, o le konafesi autu a Europa Kubernetes - KubeCon + CloudNativeCon Europe 2020 - sa faʻapitoa. Peitai, o sea suiga i le faatulagaga e lei taofia ai i matou mai le tuuina atu o la matou lipoti ua leva ona fuafuaina “Alu? Bash! Feiloai i le Shell-operator" faʻapitoa i la matou poloketi Open Source tagata fai atigi.

O lenei tusiga, faʻaosofia e le lauga, o loʻo tuʻuina mai ai se auala e faʻafaigofie ai le faʻagasologa o le fausiaina o tagata faʻatautaia mo Kubernetes ma faʻaalia ai le auala e mafai ai ona e faia oe lava i se taumafaiga itiiti e faʻaaoga ai se atigi-operator.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Fa'ailoa vitio o le lipoti (~ 23 minute i le Igilisi, e sili atu le faʻamatalaga nai lo le tusiga) ma le faʻamatalaga autu mai ai i tusitusiga. Alu!

I Flant matou te fa'amalieina ma fa'autometi mea uma. O le asō o le a tatou talanoa e uiga i se isi manatu manaia. Feiloai: fa'asologa o atigi cloud-native!

Peitaʻi, seʻi o tatou amata i le tala e tupu ai nei mea uma: Kubernetes.

Kubernetes API ma pule

O le API i Kubernetes e mafai ona faʻatusalia o se ituaiga faila faila ma faʻamaumauga mo ituaiga taʻitasi. O mea (punaoa) i luga o lenei 'au'aunaga o lo'o fa'atusalia e faila YAML. E le gata i lea, o le server o loʻo i ai se API faʻavae e mafai ai ona e faia ni mea se tolu:

  • talia punaoa i lona ituaiga ma lona igoa;
  • suia punaoa (i lenei tulaga, e naʻo mea "saʻo" e teuina e le 'auʻaunaga - o mea uma e le saʻo na faʻatulagaina pe faʻamoemoe mo isi faʻamaumauga e lafoai);
  • ala mo le punaoa (i lenei tulaga, e vave maua e le tagata faʻaoga lona faʻamatalaga lata mai / faʻafouina).

O le mea lea, o Kubernetes e galue o se ituaiga faila faila (mo YAML faʻaaliga) faʻatasi ai ma auala faʻavae e tolu (ioe, o loʻo i ai isi, ae o le a matou faʻaumatia mo le taimi nei).

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

O le fa'afitauli e na'o le 'au'aunaga e mafai ona teuina fa'amatalaga. Ina ia galue e te manaʻomia pule - le manatu lona lua sili ona taua ma faavae i le lalolagi o Kubernetes.

E lua ituaiga autu o le pulea. O le mea muamua e ave faʻamatalaga mai Kubernetes, faʻagasolo e tusa ai ma manatu faʻapipiʻi, ma toe faʻafoʻi i K8s. O le lona lua e ave faʻamatalaga mai Kubernetes, ae, e le pei o le ituaiga muamua, suia le tulaga o nisi punaoa i fafo.

Sei o tatou vaʻavaʻai totoʻa i le faʻagasologa o le fatuina o se Faʻasalalauga i Kubernetes:

  • Fa'atonu Pule (e aofia i totonu kube-controller-manager) maua faʻamatalaga e uiga i le Faʻatulagaina ma fatuina se ReplicaSet.
  • ReplicaSet e faia ni kopi se lua (lua pods) e fa'atatau i lenei fa'amatalaga, ae o nei pods e le'i fa'atulagaina.
  • E fa'atulaga e le tagata fa'atulagaina pods ma fa'aopoopo fa'amatalaga node i a latou YAML.
  • Kubelets faia suiga i se punaoa i fafo (fai mai Docker).

Ona toe faia lea o lenei faasologa atoa i le faasologa faasolosolo: siaki e le kubelet pusa, fuafua le tulaga o le pod ma toe faafoi atu. E maua e le Pule o le ReplicaSet le tulaga ma fa'afouina le tulaga o le seti fa'atusa. O le mea lava lea e tasi e tupu i le Deployment Controller ma iu ai ina maua e le tagata faʻaoga le tulaga faʻafouina (o le taimi nei).

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

tagata fa'a'au'au

E foliga mai o Kubernetes e faʻavae i luga o le galuega faʻatasi a le tele o faʻatonu (o le Kubernetes operators o loʻo pulea foi). O le fesili e tulaʻi mai, faʻafefea ona fatuina lau oe lava faʻalapotopotoga ma se taumafaiga itiiti? Ma o le mea lea na matou atiina ae e sau e laveai tagata fai atigi. E mafai ai e le pulega o le polokalama ona fatuina a latou lava faʻamatalaga e faʻaaoga ai metotia masani.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Fa'ata'ita'iga faigofie: kopi mea lilo

Seʻi o tatou vaavaai i se faaaʻoaʻoga faigofie.

Fa'apea o lo'o i ai la tatou fuifui Kubernetes. O lo'o i ai se igoa avanoa default ma se mea lilo mysecret. E le gata i lea, o loʻo i ai isi igoa i totonu o le fuifui. O nisi oi latou o loʻo i ai se igoa faʻapitoa e faʻapipiʻi ia i latou. O la matou sini o le kopiina o le Secret i igoa avanoa ma se igoa.

O le galuega e faigata ona o le mea moni e mafai ona aliali mai igoa fou i totonu o le fuifui, ma o nisi oi latou e ono iai lenei igoa. I le isi itu, pe a tape le igoa, e tatau foi ona tape le Secret. E le gata i lea, o le mea lilo lava ia e mafai foi ona suia: i lenei tulaga, o le mealilo fou e tatau ona kopiina i igoa uma ma igoa. Afai e tape fa'afuase'i le Secret i so'o se igoa, e tatau ona toe fa'afo'i vave e le matou fa'alapotopotoga.

O lea la ua uma ona fa'atulagaina le galuega, ua o'o i le taimi e amata ai ona fa'atino e fa'aaoga ai le atigi-operator. Ae muamua e aoga le fai atu o ni nai upu e uiga i le atigi-operator lava ia.

E fa'afefea ona galue le shell-operator

E pei o isi galuega mamafa i Kubernetes, o le shell-operator e alu i lana lava pod. I totonu o lenei pusa i totonu o le lisi /hooks faila faila e teuina. E mafai ona avea ma tusitusiga i Bash, Python, Ruby, ma isi. Matou te taʻua ia faila faila o matau (faʻamau).

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Shell-operator e lesitala i mea Kubernetes ma faʻatautaia nei matau e tali atu ai i na mea tatou te manaʻomia.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

E fa'afefea ona iloa e le tagata fai atigi le matau e tamo'e ma afea? O le manatu o matau uma e lua vaega. I le taimi o le amataga, o le shell-operator e faʻatautaia matau uma ma se finauga --config O le tulaga lea o le faatulagaga. Ma a maeʻa, e faʻalauiloa matau i le auala masani - e tali atu ai i mea na tutupu o loʻo faʻapipiʻi ai. I le tulaga mulimuli, e maua e le matau le tala fa'atatau (tala fa'atatau) - faʻamatalaga i le JSON format, lea o le a tatou talanoa atili ai i lalo.

Faia o se tagata faʻatautaia i Bash

O lea ua matou sauni mo le faʻatinoga. Ina ia faia lenei mea, e tatau ona tatou tusia ni galuega se lua (i le ala, matou te fautuaina faletusi shell_lib, lea e matua faafaigofieina ai le tusitusi matau i Bash):

  • o le mea muamua e manaʻomia mo le faʻatulagaina o tulaga - e faʻaalia ai le faʻasologa o mea;
  • o le lona lua o loʻo i ai le manatu autu o le matau.

#!/bin/bash

source /shell_lib.sh

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

function __main__() {
  # THE LOGIC
}

hook::run "$@"

O le isi laasaga o le filifili po o a mea tatou te manaʻomia. I la matou tulaga, e tatau ona matou siaki:

  • puna lilo mo suiga;
  • igoa uma i le fuifui, ina ia e iloa po'o fea o lo'o iai se fa'ailoga e fa'apipi'i i ai;
  • mealilo taula'i ina ia mautinoa o lo'o ogatasi uma ma le mealilo fa'apogai.

Fa'asoa i le puna lilo

Fuafuaga fusifusia mo ia e fai si faigofie. Matou te faʻaalia matou te fiafia i Secret ma le igoa mysecret i igoa avanoa default:

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai 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

O le i'uga, o le a fa'aoso le matau pe a suia le mealilo fa'apogai (src_secret) ma maua le tala fa'atatau o lo'o mulimuli mai:

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

E pei ona e vaʻai, o loʻo i ai le igoa ma le mea atoa.

Tausia o igoa avanoa

O lea la e tatau ona e lesitala i igoa avanoa. Ina ia faia lenei mea, matou te faʻamaonia le faʻaogaina o le faʻapipiʻiina lea:

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

E pei ona e vaʻaia, ua faʻaalia se fanua fou i le faʻatulagaga ma le igoa jqFilter. E pei ona taʻu mai e lona igoa, jqFilter fa'amama uma fa'amatalaga e le mana'omia ma faia se mea fou JSON ma fanua e fiafia i ai i tatou. O se matau e iai se fa'atulagaga fa'apena o le a maua le fa'amatalaga fa'amaufa'atasi nei:

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

O lo'o iai se fa'asologa filterResults mo igoa ta'itasi ile fuifui. Boolean fesuiaiga hasLabel e fa'ailoa mai pe fa'apipi'i se fa'ailoga i se igoa avanoa. Tagata filifilia keepFullObjectsInMemory: false o lo'o ta'u mai ai e le mana'omia le teuina o mea uma e manatua.

Su'esu'eina mealilo fa'amoemoe

Matou te lesitala i mea lilo uma e iai faʻamatalaga faʻamaonia managed-secret: "yes" (O la matou sini lea 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

I lenei mea jqFilter fa'amama uma fa'amatalaga se'i vagana le igoa avanoa ma le parakalafa resourceVersion. O le parakalafa mulimuli na pasi atu i le faʻamatalaga pe a fatuina le mealilo: e mafai ai ona e faʻatusatusa faʻamatalaga o mealilo ma faʻafou i latou.

O se matau ua fa'atulagaina i lenei auala o le a, pe a fa'atinoina, e maua ai fa'amaumauga fa'amau e tolu o lo'o fa'amatalaina i luga. E mafai ona manatu o se ituaiga ata (ata) fuifui.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Faʻavae i luga o nei faʻamatalaga uma, e mafai ona atiaʻe se algorithm autu. E fa'asolosolo i luga o igoa avanoa uma ma:

  • pe afai hasLabel mataupu true mo le igoa o lo'o iai nei:
    • fa'atusatusa le mealilo o le lalolagi ma le mea fa'apitonu'u:
      • afai e tasi i latou, e leai se aoga;
      • afai latou te eseese - executes kubectl replace poʻo create;
  • pe afai hasLabel mataupu false mo le igoa o lo'o iai nei:
    • faʻamautinoa e le o iai le Secret i le igoa avanoa:
      • afai o loʻo i ai le Secret Secret, tape faʻaaoga kubectl delete;
      • afai e le iloa le mea lilo i le lotoifale, e leai se mea e fai.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Faʻatinoina o le algorithm i Bash e mafai ona e sii maia i la matou fale teu oloa ma faʻataʻitaʻiga.

O le auala lena na mafai ai ona matou fatuina se faʻatonuga Kubernetes e faʻaaoga ai laina 35 o le YAML config ma e tusa ma le aofaʻi tutusa o le Bash code! O le galuega a le shell-operator o le faʻafesoʻotaʻi faʻatasi.

Ae ui i lea, o le kopiina o mealilo e le na o le pau lea o le vaega o le faʻaogaina o le aoga. O nisi nei o faʻataʻitaʻiga e faʻaalia ai le mea na te mafaia.

Faataitaiga 1: Faia suiga ile ConfigMap

Se'i o tatou va'ava'ai i se Fa'asoa e aofia ai ni pusa se tolu. E fa'aoga e Pod le ConfigMap e teu ai nisi fa'atulagaga. Ina ua fa'alauiloa ia pods, sa i ai le ConfigMap i se tulaga patino (tatou ta'ua v.1). E tusa ai, o pods uma e faʻaogaina lenei faʻamatalaga patino o le ConfigMap.

Ia tatou faapea ua suia le ConfigMap (f.2). Ae ui i lea, o le pods o le a faʻaogaina le lomiga muamua o ConfigMap (v.1):

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

E fa'apefea ona ou fa'afeiloa'i i latou i le ConfigMap fou (v.2)? E faigofie le tali: faʻaaoga se mamanu. Se'i fa'aopoopo se fa'amatalaga siaki i le vaega template Fa'atonuga fa'atino:

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

O se taunuuga, o lenei siaki tupe o le a lesitala i pods uma, ma o le a tutusa ma le Deployment. Ole taimi nei e te manaʻomia le faʻafouina o le faʻamatalaga pe a suia le ConfigMap. Ma o le atigi-operator e sau i le tulaga lea. Pau lava le mea e tatau ona e faia o le polokalama se matau o le a lesitala i le ConfigMap ma faʻafouina le siaki tupe.

Afai e fai e le tagata fa'aoga suiga i le ConfigMap, o le a matauina e le atigi-operator ma toe fa'atatau le siakiga. A maeʻa lea o le a faʻaalia ai le togafiti faʻataulāitu a Kubernetes: o le a faʻaumatia e le tufuga le pusa, faia se mea fou, faʻatali mo ia. Ready, ma agai atu i le isi. O le i'uga, o le a fa'amaopoopo le Fa'atonu ma sui i le fa'afou fou o le ConfigMap.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Fa'ata'ita'iga 2: Galulue fa'atasi ma Fa'amatalaga Punaoa Fa'apitoa

E pei ona e iloa, o Kubernetes e faʻatagaina oe e fatuina ituaiga masani o mea faitino. Mo se faʻataʻitaʻiga, e mafai ona e fatuina le agalelei MysqlDatabase. Fa'apea o lenei ituaiga e lua metadata parameters: name и namespace.

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

E iai a matou fa'aputuga Kubernetes ma igoa eseese e mafai ona matou fatuina ai MySQL databases. I lenei tulaga e mafai ona fa'aogaina le shell-operator e siaki ai punaoa MysqlDatabase, faʻafesoʻotaʻi i latou i le MySQL server ma faʻamaopoopoina tulaga manaʻomia ma matauina o le fuifui.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Fa'ata'ita'iga 3: Mata'ituina o Feso'otaiga

E pei ona e iloa, o le faʻaaogaina o le ping o le auala sili lea ona faigofie e mataʻituina ai se fesoʻotaiga. I lenei faʻataʻitaʻiga o le a matou faʻaalia pe faʻapefea ona faʻatinoina sea mataʻituina e faʻaaoga ai le shell-operator.

Muamua lava, e tatau ona e lesitala i nodes. E mana'omia e le atigi le igoa ma le tuatusi IP o node ta'itasi. Faatasi ai ma la latou fesoasoani, o le a ia pingina nei nodes.

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: "* * * * *"

Parakalafa executeHookOnEvent: [] taofia le matau mai le tamoe e tali atu i soʻo se mea e tupu (o lona uiga, i le tali atu i suiga, faʻaopoopo, tape nodes). Peitai, o ia o le a tamoe (ma fa'afou le lisi o nodes) Fa'atulagaina - minute uma, e pei ona faʻatonuina e le fanua schedule.

O lea la ua tula’i mai le fesili, e fa’afefea tonu ona tatou iloa fa’afitauli e pei o le leiloa o le pa’u? Sei o tatou tilotilo i le 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
}

Matou te faʻasolosolo i le lisi o nodes, maua o latou igoa ma tuatusi IP, ping i latou ma lafo iʻuga i Prometheus. E mafai e le Shell-operator ona auina atu fua faatatau i Prometheus, faʻasaoina i latou i se faila o loʻo i ai e tusa ai ma le ala o loʻo faʻamaonia i le fesuiaiga o le siosiomaga $METRICS_PATH.

O iinei e mafai ona e faia se tagata e faagaoioia mo le mataituina fesootaiga faigofie i se fuifui.

Faiga fa'atonu

O lenei tusiga o le a le atoatoa e aunoa ma le faamatalaina o se isi masini taua ua fausia i totonu o le atigi-operator. Va'ai faalemafaufau e fa'atino se ituaiga matau e tali atu ai i se mea na tupu i le fuifui.

  • O le a le mea e tupu pe afai, i le taimi lava e tasi, e tupu se mea i totonu o le fuifui? O le isi mea na tupu?
  • E fa'atautaia ea e le shell-operator se isi fa'ata'ita'iga o le matau?
  • Ae fa'apefea pe a fai, e lima mea tutupu e tutupu i le fuifui i le taimi e tasi?
  • O le a fa'agaioi tutusa e le atigi-fa'agaioiina?
  • Ae fa'afefea mea fa'aaoga e pei ole manatua ma le PPU?

O le mea e lelei ai, o le shell-operator o loʻo i ai se masini faʻapipiʻi faʻapipiʻi. O mea uma e tutupu e tu'u ma fa'agasolo fa'asolosolo.

Sei o tatou faataitaia lenei mea i ni faataitaiga. Faapea e lua a tatou matau. O le mea muamua e alu i le matau muamua. A mae'a loa ona fa'agasolo, e aga'i i luma le laina. O isi mea e tolu e sosoo ai e toe faʻafeiloaʻi i le matau lona lua - ua aveese mai le laina ma ulufale i totonu "i se vaega". O lena lava e maua ai e le matau le tele o mea tutupu - po'o, sili atu le sa'o, o se fa'asologa o fa'asalalauga fa'atasi.

E faapena foi i nei mea tutupu e mafai ona tu'ufa'atasia i se tasi tele. O le parameter e nafa ma lenei mea group i le faatulagaga fusifusia.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

E mafai ona e faia so'o se numera o laina/matau ma a latou fa'apotopotoga eseese. Mo se faʻataʻitaʻiga, e tasi le laina e mafai ona galue i ni matau se lua, poʻo le isi itu.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Pau lava le mea e tatau ona e faia o le faʻatulagaina o le fanua e tusa ai queue i le faatulagaga fusifusia. Afai e le o ta'u mai se igoa o le laina, e alu le matau i luga o le laina fa'aletonu (default). O lenei faiga fa'atonu e mafai ai e oe ona fa'ato'a uma fa'afitauli tau pulega o puna'oa pe a galue i matau.

iʻuga

Na matou faʻamatalaina le mea e taʻu o le atigi-operator, faʻaalia le auala e mafai ai ona faʻaoga vave ma faʻafaigofie le fausiaina o Kubernetes operators, ma tuʻuina atu ni faʻataʻitaʻiga o lona faʻaogaina.

O faʻamatalaga auʻiliʻili e uiga i le atigi-operator, faʻapea foʻi ma se aʻoaʻoga vave ile faʻaogaina, o loʻo maua ile tala tutusa fale teu oloa ile GitHub. Aua e te faatuai e faʻafesoʻotaʻi i matou i fesili: e mafai ona e talanoaina i se faʻapitoa Vaega Telegram (i Rusia) poʻo totonu lenei fono (i le gagana Peretania).

Ma afai e te fiafia i ai, matou te fiafia i taimi uma e vaʻai i mataupu fou / PR / fetu i GitHub, lea, i le ala, e mafai ona e mauaina isi galuega faatino manaia. Faatasi ai ma i latou e taua le faʻamaonia addon-operator, o le uso tele lea o le shell-operator. E fa'aogaina e lenei fa'aoga siata Helm e fa'apipi'i ai fa'aopoopoga, e mafai ona tu'uina atu fa'afouga ma mata'ituina fa'asologa o siata eseese/taua, fa'atonutonu le fa'apipi'iina o siata, ma e mafai fo'i ona toe fa'aleleia e tali atu ai i mea tutupu i totonu o le fuifui.

Alu? Bash! Feiloai i le atigi-operator (toe iloilo ma lipoti vitio mai KubeCon EU'2020)

Vitio ma fa'asolo

Vitio mai le faatinoga (~23 minute):

Taaalo i le vitio

Tuuina atu o le lipoti:

SALA

Faitau foi i la matou blog:

puna: www.habr.com

Faʻatau talimalo faʻatuatuaina mo nofoaga ma DDoS puipuiga, VPS VDS servers 🔥 Fa'atau le 'upega tafa'ilagi talimalo fa'atuatuaina ma le puipuiga DDoS, 'au'aunaga VPS VDS | ProHoster