Salah satu keuntungan menggunakan alat orkestrasi kontainer tingkat lanjut seperti Kubernetes adalah penjadwalannya sangat fleksibel. Ini memberi pengguna berbagai opsi, yang dapat digunakan untuk menentukan lingkungan tempat Pod dialokasikan ke node workstation tertentu yang memenuhi kondisi, tidak hanya berdasarkan resource yang tersedia di node. Untuk menjelaskan bagaimana Kubernetes memutuskan untuk menempatkan pod pada host yang benar, kita dapat melihat diagram yang disederhanakan dari master Kubernetes dan beberapa komponen:
API utama (kube-apiserver) adalah alat yang menyediakan baca / tulis persyaratan cluster dan status saat ini. Komponen seperti penjadwal dapat menggunakan API utama untuk mengambil informasi status saat ini, menerapkan beberapa logika dan penghitungan, dan memperbarui API dengan informasi baru tentang status yang diinginkan (misalnya, menentukan node mana yang akan dijadwalkan untuk pod baru, atau menentukan pod mana yang harus Pindah ke node lain). Selain itu, pengguna dan administrator cluster dapat memperbarui status cluster atau melihatnya melalui dasbor Kubernetes, yang menyediakan API secara eksternal. Pipeline CI / CD juga dapat menggunakan API untuk membuat resource baru atau mengubah resource yang ada.
Peran utama lain yang memanggil api adalah node agen yang disebut "kubelet", yang mengelola status berjalan dari container di node pekerja (biasanya Docker). Ketika Kubelet menentukan bahwa ada perbedaan antara keadaan host yang diharapkan untuk dilaporkan dan keadaan sebenarnya, itu akan memulai atau menghentikan penampung yang diperlukan untuk mencapai keadaan target yang dijelaskan oleh API utama. Kubelet sering menanyakan API atau mengamati perubahannya, itulah sebabnya Kubernetes merespons pembaruan dan perubahan hampir secara instan. (Beberapa detik).
Seperti yang telah kita lihat, Kubernetes menggunakan mode pengontrol untuk memelihara dan memperbarui status kluster, dan pengontrol penjadwal hanya bertanggung jawab untuk keputusan penjadwalan pod. Penjadwal terus-menerus memantau Kubernetes API untuk menemukan pod yang tidak dijadwalkan, dan ketika pod tersebut ditemukan, mereka memutuskan node mana yang harus dijadwalkan / ditempatkan.
Ada tiga tahapan untuk memulai pod baru:
-
Pemfilteran node
-
Perhitungan prioritas node
-
Operasi penjadwalan yang sebenarnya
Pada tahap pertama, penjadwal akan memeriksa node mana yang kompatibel dengan beban kerja ini. Ini menggunakan satu set filter untuk menghapus node yang tidak kompatibel tersebut. Ini akan menggunakan filter berikut:
Filter volume
Melalui pemeriksaan ini, penjadwal mengetahui sebelumnya node mana yang tidak dapat menjalankan pod, sehingga ia menghapus node ini dari daftar target. Misalnya, apakah volume data yang dibutuhkan oleh pod di zona ketersediaan yang sama dengan node? Bisakah itu terhubung dan tidak bertentangan dengan aturan penyedia layanan cloud yang mendasarinya? (Misalnya, di AWS, tidak mungkin menambahkan volume EBS dari satu zona ketersediaan ke node di zona lain). Selain itu, batasan topologi yang ditentukan oleh volume harus dipenuhi (volume yang diminta oleh pod mungkin memiliki batasan "afinitas node", yang hanya memungkinkannya untuk ditambahkan ke kumpulan node tertentu, atau secara khusus melarangnya untuk ditambahkan ke node lain).
Berikut adalah filter sumber daya:
Filter ini sangat sederhana. Penjadwal akan memeriksa apakah sumber daya yang diminta oleh pod tersedia, memastikan bahwa tidak ada tekanan pada node, seperti memori yang tidak mencukupi atau ruang disk yang tidak mencukupi, dan memastikan apakah port yang diminta dapat dibuka pada node. Misalnya, jika sebuah pod menetapkan bahwa ia harus terikat ke port 8080, tetapi pod lain dengan persyaratan serupa telah menempati port tersebut, node tersebut akan dihapus dari target.
Kumpulan filter terakhir adalah pemilih asosiatif:
Dalam contoh ini, Anda dapat melihat bahwa scheduler memverifikasi apakah pod secara eksplisit menyatakan bahwa ia perlu dijalankan pada node tertentu, atau apakah ia menentukan pod-afinitas (jika perlu dijalankan hanya ketika pod lain ada atau menghindari berada di node yang sama dengan node tertentu. Pod berjalan bersama) Selain itu, filter ini juga akan memeriksa apakah pod dapat mentolerir beberapa kondisi node yang buruk, seperti dedicated_gpu / maintenance / staging_only (atau kondisi yang ditentukan pengguna) atau tekanan memori / tidak dapat dijangkau / tekanan disk (pigmen aplikasi sampel sistem ). Toleransi ditentukan dalam definisi toleransi dan memungkinkan penampung dijadwalkan pada node dengan kondisi ini. Dengan kata lain, kecuali pod yang secara eksplisit diizinkan untuk dijalankan, semua pod lainnya akan ditolak penjadwalan atau eksekusi pada node. Ini adalah mekanisme penting untuk menyesuaikan perilaku penjadwalan Kubernetes.
Setelah menyelesaikan langkah-langkah pemfilteran ini, mungkin tidak ada node yang tersedia untuk Pod ini. Dalam kasus ini, pod akan tetap tidak teratur dan akan terlihat di dasbor, termasuk alasan kegagalan menjalankan pod (misalnya, "tidak dapat menemukan node yang dapat memenuhi batasan pod ini" atau "tidak cukup memori untuk menjadwalkan pod" ). Jika lolos filter dan memungkinkan Anda memilih beberapa node, penjadwal akan menjalankan pemeriksaan prioritas berdasarkan parameter berikut:
Setelah pemeriksaan ini selesai, penjadwal akan menghitung skor setiap node, dan node skor tertinggi akan menjalankan penampung.
Berikut ini adalah daftar metode untuk mengontrol penempatan pod selama definisi pod, diurutkan berdasarkan kompleksitas metode lanjutan dari persyaratan sumber daya dasar hingga menggunakan pengontrol penjadwal khusus:
Cara dasar pertama untuk membantu penjadwal membuat keputusan yang tepat adalah dengan menyetel permintaan dan batas memori / CPU. Permintaan digunakan dalam fase penjadwalan, dan batasan digunakan di pod yang sudah berjalan.
Kami dapat menghindari masalah kompatibilitas volume sesuai dengan aturan dasar berikut:
-
Pastikan volume yang diminta berada di zona ketersediaan yang sama dengan node yang diperlukan. Misalnya, jika Anda ingin menjalankan pod di area "A" dengan sekelompok node dan perlu menggunakan volume di area pod "B", pastikan untuk mengkloning volume ini ke area yang benar, atau dalam volume khusus Putar beberapa node baru di area tersebut agar dapat terhubung ke node tersebut.
-
Pastikan node belum mencapai batas kapasitasnya (misalnya, di awan Azure, ada batasan berapa banyak volume yang dapat disambungkan).
-
Jangan tentukan volume yang sudah terhubung ke node terpisah. Jika suatu container membutuhkan beberapa volume, tetapi kapasitas tersebut telah diatur untuk disambungkan ke host lain, maka container tersebut tidak akan dapat berjalan karena kondisi ini tidak dapat dipenuhi.
-
Gunakan batasan topologi volume dengan menentukan daftar node yang dapat atau tidak dapat dihubungkan oleh volume.
Selain itu, kami memiliki beberapa opsi batasan yang harus ditentukan dalam definisi pod:
-
Setel nodeName tempat pod ini harus dijalankan secara langsung.
-
Gunakan nodeSelector untuk menentukan label yang harus dimiliki node agar dapat menjalankan pod.
-
Taint (pada node) dan Toleransi (pada Pod) -Seperti disebutkan di atas, Taints adalah indikasi status node; kecuali jika mereka menentukan "toleransi" untuk jenis taint ini, tidak ada pod yang akan diatur pada node yang tercemar . Sebuah node dapat memiliki beberapa taint, dan sebuah container dapat memiliki beberapa toleransi.
Gambar berikut menunjukkan jenis noda dan contoh definisi toleransi:
Mekanisme pembatas berikutnya adalah preferensi terkait yang dapat disetel dalam definisi pod. Afinitas saat ini memiliki dua cakupan dan masih dalam pengembangan. Sekarang hanya asosiasi fase penjadwalan yang tersedia, seperti yang ditunjukkan pada gambar berikut:
Saat Anda menggunakan opsi "disukai selama penjadwalan", Kubernetes akan melakukan yang terbaik untuk menjadwalkan pod sesuai dengan setelan itu. Jika Anda menggunakan "wajib selama penjadwalan", ini akan memaksa kondisi, dan jika kondisi tidak terpenuhi, pod tidak akan berjalan di node.
Ada beberapa cara berbeda untuk menentukan preferensi pod pada node yang ingin Anda jalankan. Preferensi sederhana yang diketahui banyak orang adalah "pemilih node" (tentukan label tertentu secara langsung), yang akan menyebabkan penampung dijadwalkan hanya pada node dengan nilai label yang tepat. Cara lain untuk menentukan preferensi node adalah dengan menggunakan hubungan node dan "istilah pemilih node", yang memungkinkan penggunaan operator seperti yang ditunjukkan pada gambar di bawah. Ini memungkinkan pengguna untuk menentukan sekumpulan aturan yang fleksibel, yang sesuai untuk menjadwalkan atau menghindari penjadwalan.
Tidak seperti pencocokan label yang ketat dari pemilih node, ekspresi pencocokan yang lebih fleksibel dapat digunakan dalam istilah pemilih node dari aturan kesamaan. Anda dapat menggunakan operator ekspresi pencocokan untuk membandingkan nilai tag dengan daftar kemungkinan perubahan (operator "Dalam"), atau memeriksa apakah nilai tag bukan salah satu nilai dalam daftar yang ditentukan ("NotIn"). Selain itu, mereka dapat menentukan apakah label tersebut ada atau tidak ada pada node, terlepas dari nilainya. Akhirnya, mereka dapat membandingkan nilai label dengan operator "Gt" (lebih besar dari) dan "Lt" (kurang dari). Berikut adalah contoh lain dari aturan afinitas node:
Seperti yang Anda lihat, kumpulan aturan ini memerlukan node untuk menunjukkan nilai label "kubernetes.io/e2e-az-name" untuk menunjukkan zona yang tersedia sebagai "e2e-az1" atau "e2e-az2". Aturan tersebut juga mencakup pemilihan node preferensial dengan label kustom "another-node-label-key" dengan nilai "another-node-label-value", yang berarti jika ada node yang memenuhi dua batasan tersebut, maka akan berjalan Polongnya.
Selain pengaturan asosiasi node, ada juga pengaturan asosiasi antar-pod dan anti-asosiasi yang ditentukan sebagai berikut:
Dengan menggunakan aturan ini, Anda dapat mengontrol posisi pod yang bersebelahan. Beberapa pod mungkin dapat diterima untuk ditempatkan bersama dengan jenis pod lain, sementara pod lain mungkin perlu menghindari penempatan di mesin yang sama dengan jenis pod tertentu (misalnya, pod intensif CPU, yang akan menyebabkan Kubernetes menjadwalkan pekerjaan pada node yang sama) Beban terlalu tinggi, mengakibatkan kinerja yang buruk).
Berikut adalah contoh aturan asosiasi pod:
-
Pod "B" harus berjalan di node untuk menjadwalkan pod "A" di sini.
-
Pod yang menjalankan node "B" lebih disukai, jika tidak, tidak masalah pada node mana pun.
Dan contoh ini menunjukkan aturan anti-asosiasi pod:
-
Jika pod "B" berjalan di node ini, jangan diatur
-
Node di mana pod "B" tidak berjalan lebih disukai, jika tidak maka dapat dijalankan di node manapun.
Berikut ini adalah contoh pengenalan topologyKey, yang merupakan pemilih label, dan mendefinisikan kata kunci label sebagai "indikator lokasi bersama". Untuk mendistribusikan Pod secara merata di seluruh cluster, scheduler akan mencoba memilih node dengan nilai label topologyKey yang berbeda pada node-node ini. Untuk "menumpuk pod sedekat mungkin dengan satu sama lain" (preferensi penjadwalan ini juga ada dan dijelaskan di langkah berikutnya), ini dapat membuat penilaian berdasarkan tag topologyKey lagi, dan kali ini secara istimewa memilih node dengan nilai tag yang sama.
Selain metode yang dijelaskan, ada cara lain untuk mengubah perilaku Kubernetes scheduler, seperti menggunakan flag yang diteruskan ke komponen "kube-scheduler" (yang merupakan salah satu komponen utama yang menjalankan Kubernetes) untuk menyetel algoritme penjadwalan yang berbeda. Dua opsi yang tersedia untuk tanda "-algorithm-provider" adalah: "DefaultProvider" dan "ClusterAutoscalerProvider". "DefaultProvider" mencoba mengalokasikan container di cluster untuk menyeimbangkan beban semua node. Dan "ClusterAutoscalerProvider" akan mencoba mencegah sebagian besar pod pada setiap node untuk mendapatkan pemanfaatan sumber daya yang lebih baik (biasanya digunakan ketika node pekerja yang mendasarinya secara otomatis diskalakan berdasarkan sumber daya konsumsi seperti CPU dan memori).
Selain memberikan modifikasi pada algoritme, Anda juga dapat menggunakan strategi yang ditentukan di ConfigMap atau file untuk memberikan "logika" penjadwalan Anda sendiri:
Ini memungkinkan Anda untuk meneruskan kebijakan khusus ke penjadwal dan merupakan fitur yang sangat canggih yang hanya didokumentasikan di GitHub (bahkan tidak di dokumentasi resmi Kubernetes). Namun, jika Anda ingin menjadi "peretas" Kubernetes, Anda dapat menemukan informasi lebih lanjut di halaman link GitHub dan membaca contoh file kebijakan di sini. Setiap parameter strategi yang tersedia menentukan aliran algoritma dan aturan untuk menempatkan Pod. Itu dijelaskan dalam dokumen ini. Untuk memasukkan kebijakan Anda ke dalam file, tentukan "-use-legacy-policy-config = true" + "-policy-config-file". Jika tidak, gunakan peta konfigurasi dan tanda namespace peta konfigurasi untuk menetapkan peta konfigurasi target sebagai strategi.
Cara lain untuk menyesuaikan penjadwalan adalah dengan menggunakan penjadwal Anda sendiri untuk pod atau cluster tertentu. Anda dapat menulis penjadwal dalam bahasa apa pun. Yang perlu Anda lakukan adalah menggunakan API sebagai berikut:
Pada contoh di atas, penjadwal khusus perlu mendapatkan node dan pod melalui API yang ditentukan, lalu memilih pod dengan "phase = Pending" dan "schedulerName = your-scheduler-name". Setelah menghitung di mana setiap pod perlu ditempatkan, penjadwal akan membuat objek Binding (digunakan untuk menghitung node target yang paling sesuai, Anda dapat menggunakan semua informasi yang ditemukan dalam definisi pod dan definisi node, seperti komentar, label, gambar Docker Nama, volume atau informasi apa pun yang membantu menentukan lokasi yang benar dari pod berdasarkan kebutuhan Anda).
Untuk menerapkan penjadwal khusus dengan lebih baik, Anda harus mengamati node dan menyimpan informasi dalam cache untuk mempercepat penghitungan. Titik awal yang baik adalah bercabang dengan penjadwal saat ini, karena ini menyediakan titik awal yang baik untuk logika dan fungsi tambahan khusus.
- langka! "Saudara Hewan" di Zaman Kapur, ilmuwan China dan asing menemukan burung pseudoscorpion yang menumpang di amber
- Pertandingan pemanasan-Kane mencetak gol Inggris 2-1, Ozil mencetak gol Jerman 1-2 C Ronaldo absen imbang Portugal
- Ingin bereksperimen di Stasiun Luar Angkasa Internasional? Anda dapat melakukannya EmTech China 2019
- Di rumah kaca yang penuh dengan musim semi, dokter dari Akademi Ilmu Pertanian Provinsi menjelma sebagai pembawa pesan "bunga"
- Perpanjangan selatan Jalur 2 dibuka, dan 200.000 ruang parkir ditambahkan ... Gelombang besar kesejahteraan di Wuhan menunggu Anda untuk diperiksa
- Kata pengantar oleh Feng Jicai, Penasihat Umum Liushahe Sichuan Folk Customs membangkitkan kenangan yang jelas tentang masa itu
- Bush diam-diam mendanai seorang anak laki-laki Filipina selama 10 tahun dan berulang kali mengisyaratkan identitasnya dalam surat itu