Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

8 April dina konférénsi éta Saint HighLoad++ 2019, salaku bagian tina bagian "DevOps and Operations", laporan "Ngalegaan sareng ngalengkepan Kubernetes" dirumuskeun, dina nyiptakeun anu tilu karyawan perusahaan Flant milu. Di jerona, urang ngobrol ngeunaan seueur kaayaan dimana urang hoyong dilegakeun sareng ngalengkepan kamampuan Kubernetes, tapi anu kami henteu mendakan solusi anu siap-siap sareng saderhana. Kami ngagaduhan solusi anu dipikabutuh dina bentuk proyék Open Source, sareng pidato ieu ogé dikhususkeun pikeun aranjeunna.

Ku tradisi, kami resep nampilkeun video laporan (50 menit, leuwih informatif ti artikel) jeung kasimpulan utama dina wangun téks. indit!

Inti jeung tambahan dina K8s

Kubernetes ngarobih industri sareng pendekatan kana administrasi anu parantos lami diadegkeun:

  • Nuhun ka anjeunna abstraksi, kami henteu deui beroperasi kalayan konsép sapertos nyetél konfigurasi atanapi ngajalankeun paréntah (Chef, Ansible ...), tapi nganggo ngagolongkeun wadah, jasa, jsb.
  • Urang tiasa nyiapkeun aplikasi tanpa mikir ngeunaan nuansa situs husus, anu bakal diluncurkeun: logam bulistir, awan salah sahiji panyadia, jsb.
  • Kalawan K8s anjeun geus pernah geus leuwih diaksés prakték pangalusna dina pangatur infrastruktur: téknik skala, penyembuhan diri, kasabaran kasalahan, jsb.

Nanging, tangtosna, sadayana henteu lancar: Kubernetes ogé ngagaduhan tantangan énggal.

Kubernetes teu mangrupakeun gabungan nu solves sagala masalah sadaya pamaké. Inti Kubernetes tanggung jawab ngan pikeun sakumpulan fungsi anu dipikabutuh minimum anu aya dina unggal klaster:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Inti Kubernetes netepkeun sakumpulan primitif dasar pikeun ngagolongkeun wadah, ngatur lalu lintas, sareng sajabana. Urang ngobrol ngeunaan aranjeunna dina leuwih jéntré dina laporan 2 sababaraha taun ka pengker.

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Di sisi séjén, K8s nawarkeun kasempetan gede pikeun dilegakeun fungsi sadia, nu mantuan nutup batur - husus - kabutuhan pamaké. Penambahan Kubernetes tanggung jawab pangurus klaster, anu kedah masang sareng ngonpigurasikeun sadayana anu dipikabutuh pikeun klusterna "dina bentuk anu leres" [pikeun ngabéréskeun masalah khususna]. Naon jenis tambahan ieu? Hayu urang nempo sababaraha conto.

Conto tambihan

Saatos dipasang Kubernetes, urang tiasa kaget yén jaringan anu dipikabutuh pikeun interaksi pods dina hiji titik sareng antara titik henteu tiasa dianggo nyalira. Kernel Kubernetes henteu ngajamin sambungan anu diperyogikeun; tibatan, éta nangtukeun jaringan panganteur (CNI) pikeun tambihan pihak katilu. Urang kedah masang salah sahiji tambihan ieu, anu bakal tanggung jawab kana konfigurasi jaringan.

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Conto anu caket nyaéta solusi panyimpen data (disk lokal, alat blok jaringan, Ceph ...). Mimitina aranjeunna dina inti, tapi ku Advent CSI kaayaan robah jadi hal sarupa anu geus dijelaskeun: panganteur dina Kubernetes, sarta palaksanaan na aya dina modul pihak katilu.

Conto séjén di antarana:

  • Ingress-pangendali (tingali ulasan maranéhanana di artikel panganyarna kami).
  • ménéjer-ménéjer:

    Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

  • operator mangrupakeun sakabeh kelas tina tambihan-ons (anu ngawengku disebut cert-manajer), maranéhna nangtukeun primitif (e) jeung controller (e). Logika karyana dibatesan ukur ku imajinasi urang sareng ngamungkinkeun urang ngarobih komponén prasarana anu siap-siap (contona, DBMS) kana primitif, anu langkung gampang dianggo (ti batan sakumpulan wadah sareng setélanna). Sajumlah ageung operator parantos ditulis - sanaos seueur di antarana henteu acan siap pikeun produksi, éta ngan ukur masalah waktos:

    Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

  • Métrik - ilustrasi sejen kumaha Kubernetes misahkeun panganteur (Metrics API) ti palaksanaan (pihak-katilu tambihan-ons kayaning adaptor Prometheus, agén cluster Datadog ...).
  • keur monitoring sarta statistik, dimana dina prakna teu ngan diperlukeun Prometheus sareng Grafana, tapi ogé kube-state-metrics, node-exporter, jsb.

Sareng ieu sanés daptar tambihan anu lengkep ... Contona, di perusahaan Flant ayeuna urang pasang 29 tambihan (sadayana nyiptakeun total 249 objék Kubernetes). Kantun nempatkeun, urang teu bisa ningali kahirupan klaster tanpa tambahan.

Automation

Operator dirancang pikeun ngajadikeun otomatis operasi rutin anu urang tepang unggal dinten. Ieu mangrupikeun conto kahirupan nyata anu nyerat operator bakal janten solusi anu saé:

  1. Aya pendaptaran swasta (nyaéta merlukeun login a) kalawan gambar pikeun aplikasi. Hal ieu dianggap yén unggal pod ditugaskeun rusiah husus anu ngamungkinkeun auténtikasi dina pendaptaran. Tugas kami nyaéta pikeun mastikeun yén rusiah ieu kapanggih dina rohangan ngaran supados pods tiasa ngaunduh gambar. Aya tiasa seueur aplikasi (masing-masing peryogi rusiah), sareng mangpaat pikeun ngapdet rusiah sorangan sacara rutin, ku kituna pilihan pikeun ngaluarkeun rusiah ku leungeun dileungitkeun. Ieu dimana operator datang ka nyalametkeun teh: urang nyieun hiji controller nu bakal ngadagoan namespace némbongan na, dumasar kana acara ieu, bakal nambahan rusiah ka namespace nu.
  2. Hayu sacara standar aksés ti pods ka Internet dilarang. Tapi kadang eta bisa jadi diperlukeun: éta logis pikeun mékanisme idin aksés pikeun digawé saukur, tanpa merlukeun kaahlian husus, contona, ku ayana labél tangtu dina namespace nu. Kumaha operator tiasa ngabantosan urang di dieu? A controller dijieun nu ngantosan labél ka némbongan dina namespace tur nambahkeun kawijakan luyu pikeun aksés Internét.
  3. Hiji kaayaan sarupa: anggap urang diperlukeun pikeun nambahkeun tangtu kokotor, lamun boga labél sarupa (kalawan sababaraha jenis awalan). Aksi sareng operator jelas ...

Dina sagala klaster, tugas rutin kudu direngsekeun, sarta neuleu Ieu bisa dipigawé maké operator.

Nyimpulkeun sadaya carita anu dijelaskeun, kami nyimpulkeun yén pikeun digawé nyaman di Kubernetes anjeun peryogi: A) install tambihan-ons, b) ngamekarkeun operator (pikeun ngarengsekeun tugas admin sapopoé).

Kumaha cara nyerat pernyataan pikeun Kubernetes?

Sacara umum, skéma éta saderhana:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

... tapi lajeng tétéla yén:

  • API Kubernetes mangrupikeun hal anu teu pati penting anu peryogi seueur waktos pikeun ngawasaan;
  • pemrograman ogé henteu kanggo sadayana (basa Go dipilih salaku basa anu dipikaresep kusabab aya kerangka khusus pikeun éta - Operator SDK);
  • Kaayaanana sami sareng kerangka sorangan.

Bottom line: pikeun nulis controller a (operator) kudu méakkeun sumberdaya signifikan pikeun diajar materi. Ieu bakal diyakinkeun pikeun operator "ageung" - sebutkeun, pikeun MySQL DBMS. Tapi upami urang émut conto-conto anu dijelaskeun di luhur (ngabuka rusiah, ngaksés polong kana Internét ...), anu ogé hoyong urang laksanakeun kalayan leres, maka urang bakal ngartos yén usaha anu dikaluarkeun bakal langkung ageung hasilna anu urang peryogikeun ayeuna:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Sacara umum, kantun timbul: méakkeun loba sumber jeung manggihan alat katuhu pikeun nulis pernyataan, atawa ngalakukeun eta cara baheula (tapi gancang). Pikeun ngajawabna - pikeun manggihan kompromi antara extremes ieu - urang dijieun proyék urang sorangan: cangkang-operator (tingali ogé anjeunna pengumuman panganyarna dina hub).

Cangkang-operator

Kumaha anjeunna dianggo? Kluster ngagaduhan pod anu ngandung binér Go sareng operator cangkang. Gigireunana aya sakumpulan kait (detail langkung seueur ngeunaan aranjeunna - tingali di handap). Cangkang-operator sorangan ngalanggan tangtu acara dina API Kubernetes, nalika lumangsungna éta ngaluncurkeun kait anu saluyu.

Kumaha cangkang-operator nyaho mana kait pikeun nelepon kana acara nu? Inpo ieu dikirimkeun ka cangkang-operator ku hook sorangan, sarta maranehna ngalakukeun eta pisan basajan.

Hook mangrupikeun skrip Bash atanapi file anu tiasa dieksekusi anu sanés nampi argumen tunggal --config sarta responds kalawan JSON. Anu terakhir nangtukeun objék mana anu dipikaresep ku éta sareng acara mana (pikeun objék ieu) kedah direspon:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Kuring baris ngagambarkeun palaksanaan dina cangkang-operator tina salah sahiji conto urang - decomposing Rahasia pikeun ngakses hiji pendaptaran swasta kalawan gambar aplikasi. Ieu diwangun ku dua tahap.

Prakték: 1. Tulis cangkéng

Anu mimiti, dina hook kami bakal ngolah --config, nunjukkeun yén urang museurkeun ngaranspasi, sarta husus, momen kreasi maranéhanana:

[[ $1 == "--config" ]] ; then
  cat << EOF
{
  "onKubernetesEvent": [
    {
      "kind": "namespace",
      "event": ["add"]
    }
  ]
}
EOF
…

Naon logika bakal kasampak kawas? Ogé cukup basajan:

…
else
  createdNamespace=$(jq -r '.[0].resourceName' $BINDING_CONTEXT_PATH)
  kubectl create -n ${createdNamespace} -f - << EOF
Kind: Secret
...
EOF
fi

Léngkah munggaran nyaéta pikeun milari ngaranspasi mana anu diciptakeun, sareng anu kadua nyaéta nyiptakeunana nganggo kubectl rusiah pikeun namespace ieu.

Prakték: 2. Ngarakit gambar

Sadaya anu tetep nyaéta ngaliwat kait anu diciptakeun ka operator cangkang - kumaha ngalakukeun ieu? Cangkang-operator sorangan asalna salaku gambar Docker, jadi tugas urang pikeun nambahkeun hook ka diréktori husus dina gambar ieu:

FROM flant/shell-operator:v1.0.0-beta.1
ADD my-handler.sh /hooks

Sadaya anu tetep nyaéta ngumpul sareng nyorong:

$ docker build -t registry.example.com/my-operator:v1 .
$ docker push registry.example.com/my-operator:v1

Sentuhan ahir nyaéta nyebarkeun gambar kana kluster. Jang ngalampahkeun ieu, hayu urang nulis deployment:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-operator
spec:
  template:
    spec:
      containers:
      - name: my-operator
        image: registry.example.com/my-operator:v1 # 1
      serviceAccountName: my-operator              # 2

Aya dua poin anu kedah diperhatoskeun:

  1. indikasi gambar anyar dijieun;
  2. Ieu komponén sistem anu (minimal) perlu hak pikeun ngalanggan acara di Kubernetes sarta allocate Rahasia pikeun namespaces, sangkan nyieun ServiceAccount (jeung susunan aturan) pikeun hook nu.

Hasilna - urang ngajawab masalah urang baraya pikeun Kubernetes dina cara nu nyiptakeun operator pikeun decomposing Rahasia.

fitur cangkang-operator séjén

Pikeun ngawates objék tina jinis anu anjeun pilih anu bakal dianggo ku hook, aranjeunna tiasa disaring, milih nurutkeun labél nu tangtu (atawa ngagunakeun matchExpressions):

"onKubernetesEvent": [
  {
    "selector": {
      "matchLabels": {
        "foo": "bar",
       },
       "matchExpressions": [
         {
           "key": "allow",
           "operation": "In",
           "values": ["wan", "warehouse"],
         },
       ],
     }
     …
  }
]

Disadiakeun mékanisme deduplikasi, nu - ngagunakeun jq filter - ngidinan Anjeun pikeun ngarobah objék JSON badag kana leutik, dimana ukur parameter maranéhanana tetep yén urang hoyong ngawas parobahan.

Nalika hook disebut, cangkang-operator ngaliwatan eta data objék, anu tiasa dianggo pikeun kaperluan naon waé.

Kajadian anu memicu hook teu dugi ka acara Kubernetes: cangkang-operator nyadiakeun rojongan pikeun nelepon hook ku waktu (sarupa crontab dina scheduler tradisional), kitu ogé acara husus onStartup. Kabéh acara ieu bisa digabungkeun jeung ditugaskeun ka hook sarua.

Sareng dua deui fitur cangkang-operator:

  1. Éta hasil asynchronously. Kusabab acara Kubernetes (sapertos obyék anu diciptakeun) nampi, acara sanés (sapertos obyék anu sami dihapus) tiasa lumangsung dina kluster, sareng kait kedah dipertanggungjawabkeun. Upami hook dieksekusi kalayan kasalahan, maka sacara standar éta bakal nelepon deui dugi ka parantosan suksés (kabiasaan ieu tiasa dirobih).
  2. Éta ékspor métrik pikeun Prometheus, kalawan nu bisa ngarti naha cangkang-operator berpungsi, manggihan jumlah kasalahan pikeun tiap hook sarta ukuran antrian ayeuna.

Pikeun nyimpulkeun ieu bagian tina laporan:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Masang tambihan

Pikeun damel anu nyaman sareng Kubernetes, kabutuhan masang tambihan ogé disebatkeun. Kuring bakal nyarioskeun ka anjeun ngeunaan éta nganggo conto jalan perusahaan urang kumaha urang ngalakukeun ayeuna.

Urang mimitian gawé bareng Kubernetes kalawan sababaraha klaster, hijina tambahan nu éta Ingress. Ieu diperlukeun pikeun dipasang béda dina unggal klaster, sarta kami dijieun sababaraha konfigurasi YAML pikeun lingkungan béda: logam bulistir, AWS ...

Kusabab aya langkung klaster, langkung seueur konfigurasi. Salaku tambahan, urang ningkatkeun konfigurasi ieu sorangan, ku kituna aranjeunna janten rada hétérogén:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Pikeun nempatkeun sagalana dina urutan, urang mimitian ku naskah (install-ingress.sh), anu nyandak salaku argumen jinis klaster anu bakal kami sebarkeun, ngahasilkeun konfigurasi YAML anu diperyogikeun sareng ngagulung ka Kubernetes.

Pondokna, jalur salajengna urang sareng alesan anu aya hubunganana nyaéta kieu:

  • pikeun digawe sareng konfigurasi YAML, mesin template diperlukeun (dina tahap kahiji ieu sed basajan);
  • kalawan kanaékan jumlah klaster, kabutuhan pikeun ngamutahirkeun otomatis sumping (solusi pangheubeulna nya éta nempatkeun naskah dina Git, ngamutahirkeun eta ngagunakeun cron tur ngajalankeun eta);
  • skrip anu sami diperyogikeun pikeun Prometheus (install-prometheus.sh), kumaha oge, éta kasohor kanyataan yén merlukeun leuwih data input, kitu ogé gudang maranéhanana (dina cara alus - terpusat sarta dina klaster), sarta sababaraha data (sandi) bisa otomatis dihasilkeun:

    Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

  • résiko rolling kaluar lepat ka jumlah tumuwuh tina klaster ieu terus tumuwuh, sangkan sadar yén installers (nyaéta dua naskah: kanggo Ingress sareng Prometheus) pementasan diperlukeun (sababaraha cabang di Git, sababaraha crons pikeun ngapdet aranjeunna dina pakait: stabil atawa test klaster);
  • с kubectl apply geus jadi hésé pikeun digawekeun ku sabab teu déklaratif sarta ngan bisa nyieun objék, tapi teu nyieun kaputusan dina status maranéhna / ngahapus aranjeunna;
  • Kami leungit sababaraha fungsi anu teu acan kami laksanakeun dina waktos éta:
    • kontrol pinuh kana hasil apdet klaster,
    • tekad otomatis sababaraha parameter (input pikeun skrip instalasi) dumasar kana data anu tiasa didapet tina klaster (papanggihan),
    • ngembangkeun logis na dina wangun kapanggihna kontinyu.

Kami ngalaksanakeun sadaya pangalaman akumulasi ieu dina kerangka proyék kami anu sanés - addon-operator.

Addon-operator

Ieu dumasar kana cangkang-operator geus disebutkeun. Sakabeh sistem kasampak kawas kieu:

Di handap ieu ditambahkeun kana cangkang-operator hook:

  • neundeun nilai,
  • Bagan helm,
  • komponén éta ngawas toko nilai jeung - bisi aya parobahan - miwarang Helm ulang gulung grafik.

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Ku kituna, urang tiasa ngaréaksikeun hiji acara di Kubernetes, ngajalankeun hook a, sarta ti hook ieu urang bisa nyieun parobahan gudang, nu satutasna grafik bakal ulang diundeur. Dina diagram anu dihasilkeun, urang misahkeun susunan kait jeung bagan kana hiji komponén, nu urang sebut modul:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Aya tiasa seueur modul, sareng aranjeunna nambihan kait global, toko nilai global, sareng komponén anu ngawas toko global ieu.

Ayeuna, nalika aya kajadian di Kubernetes, urang tiasa ngaréspon kana éta nganggo hook global sareng ngarobih hiji hal di toko global. Parobihan ieu bakal ditingali sareng bakal nyababkeun sadaya modul dina kluster digulung:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Skéma ieu nyugemakeun sadaya sarat pikeun masang tambihan anu dinyatakeun di luhur:

  • Helm tanggung jawab pikeun templating sareng déklaratif.
  • Isu update otomatis ieu direngsekeun maké hook global, nu mana kana pendaptaran on jadwal na, lamun eta nilik gambar sistem anyar aya, gulung kaluar (ie "sorangan").
  • Nyimpen setélan dina klaster dilaksanakeun ngagunakeun ConfigMap, nu ngandung data primér pikeun storages (dina ngamimitian aranjeunna dimuat kana storages).
  • Masalah sareng generasi sandi, kapanggihna jeung kapanggihna kontinyu direngsekeun ngagunakeun hook.
  • Pementasan kahontal berkat tag, anu dirojong Docker out of the box.
  • Hasilna diawaskeun nganggo métrik anu ku urang tiasa ngartos statusna.

Sakabéh sistem ieu dilaksanakeun dina bentuk binér tunggal di Go, anu disebut addon-operator. Ieu ngajantenkeun diagram langkung saderhana:

Ngalegaan sareng ngalengkepan Kubernetes (review sareng laporan video)

Komponén utama dina diagram ieu nyaéta sakumpulan modul (disorot abu di handap). Ayeuna urang bisa nulis modul keur diperlukeun tambihan-on kalawan saeutik usaha tur pastikeun yén éta bakal dipasang dina unggal klaster, bakal diropéa sarta ngabales acara eta perlu dina klaster.

"Flant" ngagunakeun addon-operator dina 70+ klaster Kubernetes. Status kiwari - versi alfa. Ayeuna urang nyiapkeun dokuméntasi pikeun ngaleupaskeun béta, tapi pikeun ayeuna di gudang conto sadia, dina dasar anjeun tiasa nyiptakeun addon anjeun nyalira.

Dimana abdi tiasa kéngingkeun modul pikeun addon-operator? Nyebarkeun perpustakaan kami mangrupikeun tahap salajengna pikeun kami; kami ngarencanakeun pikeun ngalakukeun ieu dina usum panas.

Video sareng slide

Video tina pagelaran (~ 50 menit):

Presentasi laporan:

PS

Laporan séjén dina blog urang:

Anjeun ogé tiasa resep kana publikasi ieu:

sumber: www.habr.com

Tambahkeun komentar