Penskalaan node Kubernetes ketika node kekurangan sumber daya

Aug 21 2020

Jelas dari dokumentasi bahwa setiap kali pod berada dalam status Tertunda karena tidak ada node yang memiliki sumber daya gratis yang cukup untuk mematuhi permintaan resource pod - autoscaler cluster akan membuat node lain dalam waktu 30 detik setelah pembuatan pod (untuk cluster berukuran wajar) .

Namun, pertimbangkan kasus di mana sebuah node cukup padat. Misalkan node memiliki 2 inti CPU dan berisi 4 pod yang menentukan 0,5 permintaan CPU dan batas 1,0 CPU. Tiba-tiba ada beban, dan keempat pod tersebut tiba-tiba meminta tambahan 0,5 CPU yang tidak dapat diberikan oleh node tersebut karena semua CPU-nya sudah diambil oleh 4 pod yang sedang berjalan.

Dalam situasi ini, saya mengharapkan Kubernetes untuk 'memahami' bahwa ada permintaan sumber daya yang menunggu keputusan dengan menjalankan pod yang tidak dapat dilayani dan 'memindahkan' (menghancurkan dan membuat) pod tersebut ke node lain yang dapat memenuhi permintaan mereka (ditambah sumber daya yang dimilikinya). sedang menggunakan). Jika tidak ada node seperti itu - Saya berharap Kubernetes membuat node tambahan dan memindahkan pod ke sana.

Namun, saya tidak melihat ini terjadi. Saya melihat bahwa pod-pod tersebut berjalan pada node yang sama (saya kira node tersebut dapat disebut over-provisioned) terlepas dari permintaan resource yang tidak dapat dipatuhi dan akibatnya performa akan terganggu.

Pertanyaan saya adalah apakah perilaku ini dapat dihindari dengan cara apa pun selain dari mengatur rasio antara permintaan sumber daya pod dan batas menjadi 1: 1 (di mana sebuah pod tidak dapat meminta lebih banyak sumber daya daripada yang dialokasikan semula). Jelas saya akan menghindari pengaturan permintaan dan batasan menjadi sama untuk menghindari kekurangan penyediaan dan membayar lebih dari yang saya butuhkan.

Jawaban

4 MikeBryant Aug 21 2020 at 00:36

Penting untuk mengenali perbedaan di sini antara CPU requestdalam PodSpec, dan jumlah cpu yang coba digunakan suatu proses. Penyediaan Kubernetes dan penskalaan otomatis cluster hanya didasarkan pada requestdi dalam PodSpec. Penggunaan sebenarnya tidak relevan untuk keputusan tersebut.

Dalam kasus yang Anda jelaskan, Pod masih hanya meminta 0,5 CPU - kolom tersebut tidak dapat diubah. Prosesnya sekarang mencoba menggunakan 1 CPU - tetapi ini tidak dilihat.

Batas CPU yang lebih tinggi daripada permintaan memungkinkan upaya terbaik untuk menggunakan kapasitas itu, tetapi itu bukan jaminan, seperti yang Anda lihat.

Dalam skenario ini, sepertinya Anda ingin menggunakan Horizontal Pod Autoscaler dan cluster autoscaler. Dalam situasi dengan peningkatan beban ( requestkatakanlah Pod mulai menggunakan> 80% CPU ), HPA akan meningkatkan jumlah Pod untuk layanan tersebut, untuk menangani permintaan. Jika kemudian Pod tersebut tidak memiliki tempat yang bisa mereka muat, autoscaler cluster akan menyediakan lebih banyak Node. Dengan cara ini, Pod Anda masih dapat menggunakan hingga nilai yang diminta, dan hanya ketika mereka mulai mendekatinya, lebih banyak Node yang disediakan, jadi Anda tidak akan menyediakan sumber daya secara berlebihan di awal.