ProHoster > ΠΠ»ΠΎΠ³ > Administrasi > Tindak? Bash! Ketemu shell-operator (review lan laporan video saka KubeCon EU'2020)
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.
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).
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).
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.
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).
Shell-operator langganan acara Kubernetes lan mbukak pancingan iki kanggo nanggepi acara sing kita kudu.
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:
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:
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):
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.
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;
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):
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:
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.
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.
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.
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.
Sampeyan bisa nggawe nomer antrian / pancingan lan macem-macem kombinasi. Contone, siji antrian bisa nganggo loro pancingan, utawa kosok balene.
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.