Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

8 April ing konferensi Saint HighLoad++ 2019, minangka bagéan saka bagean "DevOps lan Operasi", laporan "Nggedhekake lan nglengkapi Kubernetes" diwenehi, ing nggawe telung karyawan perusahaan Flant melu. Ing kono, kita ngomong babagan akeh kahanan sing kita pengin nggedhekake lan nglengkapi kemampuan Kubernetes, nanging ora nemokake solusi sing siap lan gampang. Kita duwe solusi sing dibutuhake ing wangun proyek Open Source, lan pidato iki uga darmabakti kanggo wong-wong mau.

Miturut tradisi, kita seneng menehi video saka laporan (50 menit, luwih informatif tinimbang artikel) lan ringkesan utama ing wangun teks. Tindak!

Inti lan tambahan ing K8s

Kubernetes ngganti industri lan pendekatan administrasi sing wis suwe diadegake:

  • Matur suwun marang dheweke abstraksi, kita ora maneh operate karo konsep kayata nyetel config utawa mbukak printah (Chef, Ansible ...), nanging nggunakake klompok wadhah, layanan, etc.
  • Kita bisa nyiyapake aplikasi tanpa mikir babagan nuansa situs tartamtu, sing bakal diluncurake: bare metal, awan saka salah sawijining panyedhiya, lsp.
  • Kanthi K8s sampeyan wis tau wis luwih diakses laku paling apik babagan infrastruktur organisasi: teknik skala, penyembuhan diri, toleransi kesalahan, lsp.

Nanging, mesthine, kabeh ora lancar: Kubernetes uga nggawa tantangan anyar dhewe.

Kubernetes ora minangka gabungan sing ngrampungake kabeh masalah kabeh pangguna. Inti Kubernetes tanggung jawab mung kanggo pesawat saka fungsi perlu minimal sing ana ing saben kluster:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Inti Kubernetes nemtokake sakumpulan primitif dhasar kanggo ngelompokake wadhah, ngatur lalu lintas, lan liya-liyane. Kita ngedika bab mau ing liyane rinci ing laporan 2 taun ago.

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Ing sisih liya, K8 nawakake kesempatan sing apik kanggo nggedhekake fungsi sing kasedhiya, sing mbantu nutup wong liya - spesifik - kabutuhan pangguna. Penambahan Kubernetes minangka tanggung jawab administrator kluster, sing kudu nginstal lan ngatur kabeh sing dibutuhake supaya kluster kasebut "ing wangun sing bener" [kanggo ngatasi masalah tartamtu]. Apa jenis tambahan iki? Ayo katon ing sawetara conto.

Conto tambahan

Sawise nginstal Kubernetes, kita bisa uga kaget yen jaringan sing perlu banget kanggo interaksi pods ing simpul lan ing antarane simpul ora bisa digunakake dhewe. Kernel Kubernetes ora njamin sambungan sing dibutuhake, nanging nemtokake jaringan antarmuka (CNI) kanggo tambahan pihak katelu. Kita kudu nginstal salah siji saka tambahan iki, sing bakal tanggung jawab kanggo konfigurasi jaringan.

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Conto sing cedhak yaiku solusi panyimpenan data (disk lokal, piranti pamblokiran jaringan, Ceph...). Wiwitane padha ana ing inti, nanging kanthi tekane CSI kahanan diganti soko padha sing wis diterangake: antarmuka ing Kubernetes, lan implementasine ing modul pihak katelu.

Conto liyane kalebu:

  • Ingress- pengontrol (ndeleng review ing artikel anyar kita).
  • manager sertifikat:

    Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

  • Operator iku kabèh kelas nambah-ons (sing kalebu cert-manager kasebut), padha nemtokake primitif (e) lan controller (e). Logika karya kasebut diwatesi mung dening imajinasi kita lan ngidini kita ngowahi komponen infrastruktur sing wis siap (contone, DBMS) dadi primitif, sing luwih gampang digarap (saka karo set kontaner lan setelane). Akeh operator sing wis ditulis - sanajan akeh sing durung siyap kanggo produksi, mung sawetara wektu:

    Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

  • Metrik - ilustrasi liyane babagan carane Kubernetes misahake antarmuka (Metrics API) saka implementasine (tambahan pihak katelu kayata adaptor Prometheus, agen cluster Datadog...).
  • Kanggo ngawasi lan statistik, ngendi ing laku ora mung dibutuhake Prometheus lan Grafana, nanging uga kube-state-metrics, node-exporter, etc.

Lan iki dudu dhaptar lengkap tambahan ... Contone, ing perusahaan Flant sing saiki kita pasang 29 tambahan (kabeh sing nggawe total 249 obyek Kubernetes). Cukup, kita ora bisa ndeleng urip kluster tanpa tambahan.

Otomasi

Operator dirancang kanggo ngotomatisasi operasi rutin sing kita temoni saben dina. Ing ngisor iki conto nyata sing nulis operator bakal dadi solusi sing apik:

  1. Ana registri pribadi (yaiku sing mbutuhake login) kanthi gambar kanggo aplikasi kasebut. Dianggep saben pod diwenehi rahasia khusus sing ngidini otentikasi ing registri. Tugas kita yaiku kanggo mesthekake yen rahasia iki ditemokake ing ruang jeneng supaya pod bisa ndownload gambar. Bisa uga ana akeh aplikasi (saben mbutuhake rahasia), lan migunani kanggo nganyari rahasia kasebut kanthi rutin, saengga pilihan kanggo mbukak rahasia kanthi tangan diilangi. Iki ngendi operator teka kanggo ngluwari: kita nggawe controller sing bakal ngenteni namespace katon lan, adhedhasar acara iki, bakal nambah rahasia kanggo namespace.
  2. Ayo kanthi standar akses saka pods menyang Internet dilarang. Nanging kadhangkala bisa uga dibutuhake: logis kanggo mekanisme ijin akses bisa digunakake kanthi gampang, tanpa mbutuhake katrampilan khusus, umpamane, kanthi anané label tartamtu ing ruang jeneng. Kepiye operator bisa nulungi kita ing kene? A controller digawe sing ngenteni label katon ing namespace lan nambah kabijakan cocok kanggo akses Internet.
  3. Kahanan sing padha: umpamane kita kudu nambah tartamtu rereged, yen nduweni label sing padha (kanthi sawetara jinis awalan). Tumindak karo operator jelas ...

Ing sembarang cluster, tugas rutin kudu ditanggulangi, lan tengen iki bisa rampung nggunakake operator.

Summing munggah kabeh crita diterangake, kita teka menyang kesimpulan sing kanggo karya nyaman ing Kubernetes sampeyan kudu: A) nginstal add-ons, b) ngembangake operator (kanggo ngrampungake tugas admin saben dina).

Kepiye carane nulis pernyataan kanggo Kubernetes?

Umumé, skema kasebut gampang:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

... nanging banjur dadi:

  • API Kubernetes minangka barang sing ora pati penting sing mbutuhake wektu akeh kanggo nguasai;
  • pemrograman uga ora kanggo kabeh wong (basa Go dipilih minangka basa sing disenengi amarga ana kerangka khusus - Operator SDK);
  • Kahanan iku padha karo kerangka dhewe.

Ngisor garis: kanggo nulis controller (operator) kudu nglampahi sumber daya wujud kanggo sinau materi. Iki bakal ditrapake kanggo operator "gedhe" - umpamane, kanggo DBMS MySQL. Nanging yen kita ngelingi conto sing diterangake ing ndhuwur (rahasia mbukak, ngakses polong menyang Internet ...), sing uga pengin ditindakake kanthi bener, mula kita bakal ngerti manawa usaha sing ditindakake bakal luwih gedhe tinimbang asil sing dibutuhake saiki:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Umumé, ana dilema: nglampahi akeh sumber daya lan golek alat sing tepat kanggo nulis statement, utawa nindakake cara lawas (nanging cepet). Kanggo ngatasi - kanggo nemokake kompromi ing antarane ekstrem kasebut - kita nggawe proyek kita dhewe: cangkang-operator (deleng uga dheweke woro-woro anyar ing hub).

Shell-operator

Piye cara kerjane? Kluster kasebut duwe pod sing ngemot binar Go kanthi operator cangkang. Ing jejere dheweke ana set pancingan (rincian liyane babagan - deleng ing ngisor iki). Shell-operator dhewe langganan tartamtu acara ing API Kubernetes, nalika kedadeyan kasebut ngluncurake pancing sing cocog.

Carane cangkang-operator ngerti kang pancingan kanggo nelpon ing acara kang? Informasi iki ditularaké kanggo cangkang-operator dening pancingan piyambak, lan padha nindakake iku banget prasaja.

Pancing minangka skrip Bash utawa file eksekusi liyane sing nampa argumen siji --config lan nanggapi karo JSON. Sing terakhir nemtokake obyek sing menarik lan acara apa (kanggo obyek kasebut) kudu ditanggapi:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Aku bakal nggambarake implementasine ing cangkang-operator saka salah sawijining conto - rahasia decomposing kanggo ngakses registri pribadi kanthi gambar aplikasi. Iku kasusun saka rong tahapan.

Praktek: 1. Nulis pancing

Kaping pisanan, ing pancing kita bakal proses --config, nuduhake yen kita kasengsem ing namespaces, lan khusus, wayahe nggawe:

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

Apa logika katon kaya? Uga cukup prasaja:

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

Langkah kapisan yaiku kanggo mangerteni spasi jeneng sing digawe, lan sing kapindho yaiku nggawe nggunakake kubectl rahasia kanggo namespace iki.

Praktek: 2. Ngrakit gambar

Kabeh sing isih ana yaiku ngliwati pancing sing digawe menyang operator cangkang - kepiye carane? Shell-operator kasebut dhewe minangka gambar Docker, dadi tugas kita yaiku nambah pancing menyang direktori khusus ing gambar iki:

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

Kabeh sing isih ana yaiku ngumpulake lan push:

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

Sentuhan pungkasan yaiku nyebarake gambar menyang kluster. Kanggo nindakake iki, ayo nulis penyebaran prajurit:

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

Ana rong titik sing kudu digatekake:

  1. indikasi gambar sing mentas digawe;
  2. Iki minangka komponen sistem sing (minimal) mbutuhake hak kanggo langganan acara ing Kubernetes lan nyedhiakke rahasia kanggo spasi jeneng, supaya kita nggawe ServiceAccount (lan sakumpulan aturan) kanggo pancing.

Asil - kita ngatasi masalah kita sederek kanggo Kubernetes ing cara sing nggawe operator kanggo decomposing Rahasia.

Fitur shell-operator liyane

Kanggo matesi obyek saka jinis sing dipilih sing bakal digunakake pancing, padha bisa disaring, milih miturut label tartamtu (utawa nggunakake matchExpressions):

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

Kasedhiya mekanisme deduplikasi, sing - nggunakake filter jq - ngidini sampeyan ngowahi obyek JSON gedhe dadi cilik, ing ngendi mung paramèter kasebut tetep kita pengin ngawasi owah-owahan.

Nalika pancing disebut, shell-operator liwat iku data obyek, sing bisa digunakake kanggo kabutuhan apa wae.

Acara sing micu pancingan ora winates kanggo acara Kubernetes: shell-operator menehi support kanggo nelpon pancingan dening wektu (padha karo crontab ing panjadwal tradisional), uga acara khusus onStartup. Kabeh acara iki bisa digabungake lan diutus kanggo pancing padha.

Lan rong fitur liyane saka shell-operator:

  1. dheweke kerja asynchronously. Wiwit acara Kubernetes (kayata obyek sing digawe) wis ditampa, acara liyane (kayata obyek sing padha dibusak) bisa uga kedadeyan ing kluster, lan pancingan kudu nyathet iki. Yen pancing dieksekusi kanthi kesalahan, mula kanthi standar bakal nelpon maneh nganti rampung sukses (prilaku iki bisa diganti).
  2. Iku ekspor metrik kanggo Prometheus, karo sing bisa ngerti apa Nihan-operator apa, mangerteni nomer kasalahan kanggo saben pancing lan ukuran antrian saiki.

Kanggo ngringkes bagean laporan iki:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Nginstal tambahan

Kanggo karya nyaman karo Kubernetes, perlu kanggo nginstal add-ons uga kasebut. Aku bakal pitutur marang kowe bab iku nggunakake conto path perusahaan kita carane saiki.

Kita miwiti nggarap Kubernetes kanthi sawetara kluster, sing mung tambahan yaiku Ingress. Sampeyan kudu diinstal kanthi beda ing saben kluster, lan kita nggawe sawetara konfigurasi YAML kanggo lingkungan sing beda: logam kosong, AWS ...

Amarga luwih akeh klompok, luwih akeh konfigurasi. Kajaba iku, kita nambah konfigurasi kasebut dhewe, minangka asil dadi cukup heterogen:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Kanggo ngatur kabeh, kita miwiti nganggo skrip (install-ingress.sh), sing njupuk minangka argumentasi jinis kluster sing bakal kita pasang, nggawe konfigurasi YAML sing dibutuhake lan diluncurake menyang Kubernetes.

Ing cendhak, dalan kita luwih lan pertimbangan sing ana gandhengane yaiku:

  • kanggo nggarap konfigurasi YAML, mesin cithakan dibutuhake (ing tahap pisanan iki prasaja sed);
  • kanthi nambah jumlah kluster, perlu nganyari otomatis (solusi paling awal yaiku masang skrip ing Git, nganyari nggunakake cron lan mbukak);
  • skrip sing padha dibutuhake kanggo Prometheus (install-prometheus.sh), Nanging, penting amarga mbutuhake data input luwih akeh, uga panyimpenan (kanthi cara sing apik - terpusat lan ing kluster), lan sawetara data (sandi) bisa digawe kanthi otomatis:

    Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

  • risiko Rolling metu soko salah kanggo nomer akeh kluster saya akeh, supaya kita temen maujud sing installers (yaiku rong skrip: kanggo Ingress lan Prometheus) pementasan dibutuhake (sawetara cabang ing Git, sawetara crons kanggo nganyari ing cocog: kluster stabil utawa test);
  • с kubectl apply wis dadi angel digarap amarga ora deklaratif lan mung bisa nggawe obyek, nanging ora nggawe keputusan babagan status / mbusak;
  • Kita ilang sawetara fungsi sing durung ditindakake ing wektu kasebut:
    • kontrol lengkap babagan asil nganyari kluster,
    • netepake otomatis sawetara paramèter (input kanggo skrip instalasi) adhedhasar data sing bisa dipikolehi saka kluster (penemuan),
    • pangembangan logis ing wangun penemuan terus-terusan.

Kita ngetrapake kabeh pengalaman akumulasi iki ing kerangka proyek liyane - operator addon.

Addon-operator

Iku adhedhasar shell-operator wis kasebut. Kabeh sistem katon kaya iki:

Ing ngisor iki ditambahake menyang cangkang operator cangkang:

  • panyimpenan nilai,
  • Bagan helm,
  • komponen sing ngawasi toko nilai lan - yen ana owah-owahan - takon Helm kanggo muter maneh grafik.

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Mangkono, kita bisa nanggepi acara ing Kubernetes, miwiti pancing, lan saka pancing iki kita bisa nggawe owah-owahan ing panyimpenan, lan banjur grafik bakal diundhuh maneh. Ing diagram sing diasilake, kita misahake set pancingan lan grafik dadi siji komponen, sing diarani modul:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Bisa uga ana akeh modul, lan kita nambahake pancing global, toko nilai global, lan komponen sing ngawasi toko global iki.

Saiki, yen ana kedadeyan ing Kubernetes, kita bisa nanggepi nggunakake pancing global lan ngganti soko ing toko global. Owah-owahan iki bakal katon lan bakal nyebabake kabeh modul ing kluster diluncurake:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Skema iki nyukupi kabeh syarat kanggo nginstal add-on sing kasebut ing ndhuwur:

  • Helm tanggung jawab kanggo templating lan declarativeness.
  • Masalah nganyari otomatis ditanggulangi kanthi nggunakake pancing global, sing menyang pendaptaran kanthi jadwal lan, yen ndeleng gambar sistem anyar ing kana, gulung (yaiku "dhewe").
  • Nyimpen setelan ing kluster dileksanakake nggunakake ConfigMap, sing ngemot data utami kanggo panyimpenan (ing wiwitan dimuat ing panyimpenan).
  • Masalah karo generasi sandi, panemuan lan panemuan terus-terusan ditanggulangi nggunakake pancingan.
  • Pementasan digayuh amarga tag, sing didhukung Docker metu saka kothak.
  • Asil dipantau nggunakake metrik sing bisa dingerteni status kasebut.

Kabeh sistem iki dileksanakake ing wangun binar tunggal ing Go, sing diarani addon-operator. Iki nggawe diagram katon luwih gampang:

Ngembangake lan nambahi Kubernetes (ringkesan lan laporan video)

Komponen utama ing diagram iki yaiku sakumpulan modul (disorot werna abu-abu ing ngisor iki). Saiki kita bisa nulis modul kanggo tambahan dibutuhake karo sethitik efforts lan manawa iku bakal diinstal ing saben kluster, bakal dianyari lan nanggapi ing acara perlu ing kluster.

"Flant" nggunakake operator addon ing 70+ kluster Kubernetes. Status saiki - versi alpha. Saiki kita nyiapake dokumentasi kanggo ngeculake beta, nanging saiki ing repositori conto kasedhiya, kanthi basis sampeyan bisa nggawe addon sampeyan dhewe.

Ngendi aku bisa njaluk modul kanggo addon-operator? Nerbitake perpustakaan minangka tahap sabanjure kanggo kita; kita rencana nindakake iki ing musim panas.

Video lan minger

Video saka pagelaran (~50 menit):

Presentasi laporan:

PS

Laporan liyane ing blog kita:

Sampeyan bisa uga kasengsem ing publikasi ing ngisor iki:

Source: www.habr.com

Add a comment