Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Taun iki, konferensi Kubernetes Eropa utama - KubeCon + CloudNativeCon Europe 2020 - virtual. Nanging, owah-owahan format kasebut ora ngalangi kita ngirim laporan sing wis direncanakake "Go? Bash! Ketemu Shell-operator" darmabakti kanggo proyek Open Source kita cangkang-operator.

Artikel iki, inspirasi dening Dhiskusi, presents pendekatan kanggo simplifying proses nggawe operator kanggo Kubernetes lan nuduhake carane sampeyan bisa nggawe dhewe karo minimal gaweyan nggunakake cangkang-operator.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

nepangaken video saka laporan (~ 23 menit ing basa Inggris, katon luwih informatif tinimbang artikel) lan ekstrak utama ing wangun teks. Tindak!

Ing Flant, kita terus ngoptimalake lan ngotomatisasi kabeh. Dina iki kita bakal ngomong babagan konsep liyane sing nyenengake. ketemu: skrip cangkang asli awan!

Nanging, ayo miwiti karo konteks sing kedadeyan kabeh iki: Kubernetes.

Kubernetes API lan pengontrol

API ing Kubernetes bisa diwakili minangka jinis server file kanthi direktori kanggo saben jinis obyek. Obyek (sumber daya) ing server iki diwakili dening file YAML. Kajaba iku, server duwe API dhasar sing ngidini sampeyan nindakake telung perkara:

  • kanggo nampa sumber daya miturut jinis lan jeneng;
  • pangowahan sumber daya (ing kasus iki, server mung nyimpen obyek "bener" - kabeh sing dibentuk kanthi ora bener utawa dituju kanggo direktori liyane dibuwang);
  • trek kanggo sumber daya (ing kasus iki, pangguna langsung nampa versi saiki / dianyari).

Mangkono, Kubernetes tumindak minangka jenis server file (kanggo manifests YAML) kanthi telung cara dhasar (ya, bener ana liyane, nanging kita bakal ngilangi saiki).

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Masalahe yaiku server mung bisa nyimpen informasi. Kanggo nindakake iku perlu controller - konsep paling penting lan dhasar kaloro ing donya Kubernetes.

Ana rong jinis utama pengontrol. Pisanan njupuk informasi saka Kubernetes, ngolah miturut logika nested, lan bali menyang K8s. Sing nomer loro njupuk informasi saka Kubernetes, nanging, ora kaya jinis pisanan, ngganti kahanan sawetara sumber daya eksternal.

Ayo dideleng kanthi luwih cetha babagan proses nggawe Deployment ing Kubernetes:

  • Pengontrol Penyebaran (kalebu ing kube-controller-manager) nampa informasi babagan Deployment lan nggawe ReplicaSet.
  • ReplicaSet nggawe rong replika (loro pods) adhedhasar informasi iki, nanging pods iki durung dijadwal.
  • Penjadwal jadwal pods lan nambah informasi simpul menyang YAMLs.
  • Kubelets nggawe owahan kanggo sumber daya external (ngandika Docker).

Banjur kabeh urutan iki diulang ing urutan mbalikke: kubelet mriksa kontaner, ngetung status pod lan dikirim maneh. Pengontrol ReplicaSet nampa status lan nganyari status replika. Bab sing padha kedadeyan karo Deployment Controller lan pangguna pungkasane entuk status sing dianyari (saiki).

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Shell-operator

Pranyata Kubernetes adhedhasar karya gabungan saka macem-macem pengontrol (operator Kubernetes uga pengontrol). Pitakonan muncul, carane nggawe operator dhewe kanthi gaweyan minimal? Lan ing kene sing dikembangake teka kanggo ngluwari cangkang-operator. Iki ngidini administrator sistem nggawe statement dhewe nggunakake cara sing wis dikenal.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Conto prasaja: nyalin rahasia

Ayo padha ndeleng conto prasaja.

Ayo kita duwe klompok Kubernetes. Wis papan jeneng default karo sawetara Rahasia mysecret. Kajaba iku, ana papan jeneng liyane ing kluster kasebut. Sawetara wong duwe label khusus sing ditempelake. Tujuan kita yaiku nyalin Rahasia menyang ruang jeneng kanthi label.

Tugas kasebut rumit amarga kasunyatan manawa spasi jeneng anyar bisa katon ing kluster, lan sawetara bisa uga duwe label iki. Ing tangan liyane, nalika label wis dibusak, Rahasia uga kudu dibusak. Kajaba iku, Rahasia kasebut uga bisa diganti: ing kasus iki, Rahasia anyar kudu disalin menyang kabeh ruang jeneng kanthi label. Yen Rahasia ora sengaja dibusak ing sembarang namespace, operator kita kudu langsung mulihake.

Saiki tugas wis dirumusake, wektune kanggo miwiti ngleksanakake nggunakake shell-operator. Nanging pisanan iku worth ngandika sawetara tembung bab shell-operator dhewe.

Carane shell-operator dianggo

Kaya beban kerja liyane ing Kubernetes, operator cangkang mbukak ing pod dhewe. Ing pod iki ing direktori /hooks file eksekusi disimpen. Iki bisa dadi skrip ing Bash, Python, Ruby, lsp. Kita nyebut file eksekusi kasebut minangka pancing (pancingan).

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Shell-operator langganan acara Kubernetes lan mbukak pancingan iki kanggo nanggepi acara sing kita kudu.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Carane cangkang-operator ngerti kang pancing kanggo mbukak lan nalika? Intine saben pancing duwe rong tahapan. Sajrone wiwitan, operator cangkang mbukak kabeh pancingan kanthi argumentasi --config Iki tahap konfigurasi. Lan sawise iku, pancingan diluncurake kanthi cara normal - kanggo nanggepi acara sing dilampirake. Ing kasus terakhir, pancing nampa konteks naleni (konteks mengikat) - data ing format JSON, sing bakal kita pirembagan kanthi luwih rinci ing ngisor iki.

Nggawe operator ing Bash

Saiki kita siap kanggo implementasine. Kanggo nindakake iki, kita kudu nulis rong fungsi (kanthi cara, disaranake perpustakaan shell_lib, sing ndadekake gampang nulis pancingan ing Bash):

  • pisanan dibutuhake kanggo tataran konfigurasi - nampilake konteks naleni;
  • kaloro ngandhut logika utama pancing.

#!/bin/bash

source /shell_lib.sh

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

function __main__() {
  # THE LOGIC
}

hook::run "$@"

Langkah sabanjure yaiku mutusake obyek apa sing dibutuhake. Ing kasus kita, kita kudu nglacak:

  • rahasia sumber kanggo owah-owahan;
  • kabeh namespaces ing kluster, supaya sampeyan ngerti endi sing duwe label ditempelake;
  • rahasia target kanggo mesthekake yen kabeh padha ing sync karo rahasia sumber.

Langganan sumber rahasia

Konfigurasi naleni kanggo iku cukup prasaja. We nuduhake yen kita kasengsem ing Rahasia karo jeneng mysecret ing namespace default:

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka 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

AkibatΓ©, pancing bakal micu nalika rahasia sumber diganti (src_secret) lan tampa konteks ikatan ing ngisor iki:

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Nalika sampeyan bisa ndeleng, ngemot jeneng lan kabeh obyek.

Nglacak spasi jeneng

Saiki sampeyan kudu langganan namespaces. Kanggo nindakake iki, kita nemtokake konfigurasi ikatan ing ngisor iki:

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

Nalika sampeyan bisa ndeleng, lapangan anyar wis katon ing konfigurasi karo jeneng jqFilter. Kaya jenenge, jqFilter nyaring kabeh informasi sing ora perlu lan nggawe obyek JSON anyar karo lapangan sing menarik kanggo kita. Pancing kanthi konfigurasi sing padha bakal nampa konteks ikatan ing ngisor iki:

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Isine array filterResults kanggo saben namespace ing kluster. Variabel Boolean hasLabel nuduhake apa label ditempelake ing namespace tartamtu. Pamilih keepFullObjectsInMemory: false nuduhake yen ana ora perlu kanggo nyimpen obyek lengkap ing memori.

Nelusuri rahasia target

Kita langganan kabeh Rahasia sing duwe anotasi sing ditemtokake managed-secret: "yes" (iki target kita 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

Ing kasus iki jqFilter nyaring kabeh informasi kajaba namespace lan parameter resourceVersion. Parameter pungkasan dikirim menyang anotasi nalika nggawe rahasia: ngidini sampeyan mbandhingake versi rahasia lan tetep anyar.

Pancing sing dikonfigurasi kanthi cara iki bakal, nalika dieksekusi, bakal nampa telung konteks naleni sing kasebut ing ndhuwur. Padha bisa dianggep minangka jenis snapshot (gambar asli seko) kluster.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Adhedhasar kabeh informasi kasebut, algoritma dhasar bisa dikembangake. Iku iterates kabeh namespaces lan:

  • yen hasLabel prakara true kanggo ruang jeneng saiki:
    • mbandhingake rahasia global karo sing lokal:
      • yen padha, ora apa-apa;
      • yen padha beda - executes kubectl replace utawa create;
  • yen hasLabel prakara false kanggo ruang jeneng saiki:
    • nggawe manawa Rahasia ora ana ing ruang jeneng sing diwenehake:
      • yen Rahasia lokal saiki, mbusak nggunakake kubectl delete;
      • yen Rahasia lokal ora dideteksi, ora apa-apa.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Implementasi algoritma ing Bash sampeyan bisa download ing kita repositori karo conto.

Mangkene carane kita bisa nggawe kontroler Kubernetes sing prasaja nggunakake 35 baris konfigurasi YAML lan jumlah kode Bash sing padha! Tugas operator cangkang yaiku nyambungake.

Nanging, nyalin rahasia ora mung area aplikasi sarana kasebut. Ing ngisor iki sawetara conto liyane kanggo nuduhake apa sing bisa ditindakake.

Conto 1: Nggawe owahan menyang ConfigMap

Ayo goleki Deployment sing dumadi saka telung pod. Pods nggunakake ConfigMap kanggo nyimpen sawetara konfigurasi. Nalika pods dibukak, ConfigMap ing negara tartamtu (ayo nelpon v.1). Mulane, kabeh pod nggunakake versi ConfigMap tartamtu iki.

Saiki ayo nganggep yen ConfigMap wis diganti (v.2). Nanging, pod bakal nggunakake versi ConfigMap sadurunge (v.1):

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Carane aku bisa njaluk wong ngalih menyang ConfigMap anyar (v.2)? Jawaban iki prasaja: nggunakake cithakan. Ayo ditambahake anotasi checksum menyang bagean kasebut template Konfigurasi panyebaran:

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

AkibatΓ©, checksum iki bakal didaftar ing kabeh pods, lan bakal padha karo Deployment. Saiki sampeyan mung kudu nganyari anotasi nalika ConfigMap diganti. Lan cangkang-operator teka ing Handy ing kasus iki. Kabeh sing perlu dilakoni yaiku program pancing sing bakal langganan ConfigMap lan nganyari checksum.

Yen pangguna nggawe owahan ing ConfigMap, shell-operator bakal sok dong mirsani lan ngitung maneh checksum. Sawise iku keajaiban Kubernetes bakal dimainake: orkestra bakal mateni pod, nggawe sing anyar, ngenteni dadi. Ready, lan pindhah menyang sabanjure. AkibatΓ©, Deployment bakal nyinkronake lan ngalih menyang versi anyar saka ConfigMap.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Conto 2: Nggarap Definisi Sumber Daya Khusus

Kaya sing sampeyan ngerteni, Kubernetes ngidini sampeyan nggawe jinis obyek khusus. Contone, sampeyan bisa nggawe jenis MysqlDatabase. Contone, jinis iki duwe rong parameter metadata: name ΠΈ namespace.

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

Kita duwe kluster Kubernetes kanthi ruang jeneng sing beda kanggo nggawe database MySQL. Ing kasus iki shell-operator bisa digunakake kanggo trek sumber daya MysqlDatabase, nyambungake menyang server MySQL lan nyinkronake negara sing dikarepake lan diamati saka kluster.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Tuladha 3: Pemantauan Jaringan Kluster

Kaya sing sampeyan ngerteni, nggunakake ping minangka cara paling gampang kanggo ngawasi jaringan. Ing conto iki kita bakal nuduhake carane ngleksanakake ngawasi kuwi nggunakake shell-operator.

Kaping pisanan, sampeyan kudu langganan node. Operator cangkang mbutuhake jeneng lan alamat IP saben simpul. Kanthi bantuan, dheweke bakal ping simpul kasebut.

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: [] nyegah pancing saka mlaku kanggo nanggepi acara apa wae (yaiku, kanggo nanggepi owah-owahan, nambah, mbusak kelenjar). Nanging, dheweke bakal mlaku (lan nganyari dhaptar simpul) dijadwal - saben menit, kaya sing diwenehake dening lapangan schedule.

Saiki muncul pitakonan, kepiye carane ngerti babagan masalah kaya packet loss? Ayo ndeleng kode kasebut:

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
}

We iterate liwat dhaptar simpul, njaluk jeneng lan alamat IP, ping lan ngirim asil kanggo Prometheus. Shell-operator bisa ngekspor metrik menyang Prometheus, nyimpen menyang file sing ana miturut path sing ditemtokake ing variabel lingkungan $METRICS_PATH.

Kene mangkono sampeyan bisa nggawe operator kanggo ngawasi jaringan prasaja ing kluster.

Mekanisme antrian

Artikel iki bakal pepak tanpa njlèntrèhaké mekanisme penting liyane dibangun ing cangkang-operator. Mbayangno sing executes sawetara jenis pancing kanggo nanggepi acara ing kluster.

  • Apa sing kedadeyan yen, ing wektu sing padha, ana kedadeyan ing kluster? siji maneh acara?
  • Bakal Nihan-operator mbukak Kayata liyane pancing?
  • Apa yen, ngomong, limang acara kelakon ing kluster bebarengan?
  • Bakal shell-operator proses mau ing podo karo?
  • Kepiye babagan sumber daya sing digunakake kayata memori lan CPU?

Untunge, shell-operator duwe mekanisme antrian sing dibangun. Kabeh acara diantrekake lan diproses kanthi urutan.

Ayo digambarake nganggo conto. Ayo dadi ngomong kita duwe loro pancingan. Acara pisanan menyang pancing pisanan. Sawise pangolahan rampung, antrian maju. Telung acara sabanjure dialihake menyang pancing kapindho - dicopot saka antrian lan dilebokake ing "bundel". Iku pancing nampa Uploaded acara - utawa, luwih tepat, macem-macem konteks naleni.

Uga iki acara bisa digabung dadi siji gedhe. Parameter kasebut tanggung jawab kanggo iki group ing konfigurasi naleni.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Sampeyan bisa nggawe nomer antrian / pancingan lan macem-macem kombinasi. Contone, siji antrian bisa nganggo loro pancingan, utawa kosok balene.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Sampeyan mung kudu ngatur lapangan sing cocog queue ing konfigurasi naleni. Yen jeneng antrian ora ditemtokake, pancing kasebut mlaku ing antrian standar (default). Mekanisme antrian iki ngidini sampeyan ngrampungake kabeh masalah manajemen sumber daya nalika nggarap pancing.

kesimpulan

Kita nerangake apa shell-operator, nuduhake carane bisa digunakake kanggo nggawe operator Kubernetes cepet lan effortlessly, lan menehi sawetara conto panggunaan.

Informasi rinci babagan shell-operator, uga tutorial cepet babagan carane nggunakake, kasedhiya ing cocog repositori ing GitHub. Aja ragu-ragu kanggo hubungi kita karo pitakonan: sampeyan bisa ngrembug ing khusus Grup telegram (ing basa Rusia) utawa ing forum iki (ing basa Inggris).

Lan yen sampeyan seneng, kita mesthi seneng ndeleng masalah anyar / PR / lintang ing GitHub, ing ngendi sampeyan bisa nemokake liyane proyek menarik. Antarane wong-wong mau iku worth nyorot operator addon, kang sadulur amba saka shell-operator. Utilitas iki nggunakake grafik Helm kanggo nginstal tambahan, bisa ngirim nganyari lan ngawasi macem-macem paramèter / nilai grafik, ngontrol proses instalasi grafik, lan uga bisa ngowahi kanggo nanggepi acara ing kluster.

Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)

Video lan minger

Video saka pagelaran (~23 menit):


Presentasi laporan:

PS

Waca uga ing blog kita:

Source: www.habr.com

Add a comment