Jika aplikasi Anda melibatkan layanan berdurasi pendek, seperti permintaan web, dan dapat mentolerir gangguan, Anda dapat mengonfigurasi Knative Service untuk menggunakan spot instance. Instans ini segera dilepas setelah digunakan dan jauh lebih hemat biaya dibandingkan instans sesuai permintaan (on-demand). Dengan menggabungkan Knative dan spot instance, Anda dapat mengoptimalkan biaya sumber daya cloud serta membangun arsitektur Serverless yang sangat hemat biaya sekaligus mempertahankan elastisitas dan responsivitas layanan.
Prasyarat
Konsep utama
Cara kerja
Di Knative, beban kerja Serverless dikelola terutama melalui Knative Services, yang secara otomatis menskalakan Pod berdasarkan permintaan masuk. Untuk menggunakan spot instance, Anda hanya perlu mengonfigurasi anotasi Pod tertentu. Node virtual secara otomatis menyediakan spesifikasi sumber daya Elastic Container Instance (ECI) yang sesuai berdasarkan anotasi Pod tersebut. Node virtual juga menyediakan penggantian otomatis untuk spot instance, yang semakin mengotomatiskan penggunaannya.

Keuntungan menggunakan Knative dengan spot instance meliputi:
-
Ideal untuk skenario Serverless: Sangat cocok untuk permintaan web berdurasi pendek dan tugas lain yang menggunakan sumber daya sesuai kebutuhan lalu melepasnya setelah selesai, sehingga menghindari alokasi sumber daya jangka panjang.
-
Selaras dengan shutdown yang mulus (graceful shutdown): Proses ini mengharuskan aplikasi mendukung graceful shutdown, yang difasilitasi Knative dengan menyisipkan kontainer sidecar
queue-proxyke setiap Pod. Saat sebuah Pod dihentikan, kontainerqueue-proxyterlebih dahulu menunggu semua permintaan aktif selesai sebelum kontainer aplikasi dimatikan. -
Hemat biaya: Bagi pengguna Knative yang peka terhadap biaya, penggunaan spot instance memberikan penghematan signifikan.
Konfigurasi dan contoh
Konfigurasi spot instance
Anotasi berikut hanya berlaku saat Anda membuat Pod ECI. Menambahkan atau mengubah anotasi ini pada Pod ECI yang sudah ada tidak akan berpengaruh.
Tambahkan anotasi berikut ke templat Pod Knative Service Anda untuk mengonfigurasi spot instance.
|
Anotasi |
Nilai contoh |
Wajib |
Deskripsi |
|
k8s.aliyun.com/eci-spot-strategy |
SpotAsPriceGo |
Ya |
Strategi penawaran untuk spot instance. Nilai yang valid:
|
|
k8s.aliyun.com/eci-spot-price-limit |
"0.5" |
Tidak |
Harga maksimum per jam untuk spot instance. Nilainya dapat memiliki hingga tiga tempat desimal. Anotasi ini hanya berlaku ketika |
|
k8s.aliyun.com/eci-spot-duration |
"1" |
Tidak |
Periode perlindungan untuk spot instance, dalam satuan jam. Nilai default-nya adalah 1. Nilai 0 menonaktifkan periode perlindungan. |
|
k8s.aliyun.com/eci-spot-fallback |
"true" |
Tidak |
Menentukan apakah akan secara otomatis membuat instans sesuai permintaan jika stok spot tidak tersedia. Ini membantu memastikan pembuatan instans berhasil. Nilai default-nya adalah |
Contoh 1: Gunakan strategi SpotWithPriceLimit
Contoh YAML berikut membuat spot instance dengan tipe instans ecs.c6.
-
Saat pembuatan, jika tidak tersedia stok yang memenuhi tipe instans dan batas harga yang ditentukan, pembuatan gagal.
-
Setelah dibuat, instans berjalan selama periode perlindungan 1 jam yang dijamin. Setelah periode ini, spot instance akan ditarik kembali jika harga pasar melebihi penawaran Anda atau jika stok untuk tipe instans yang ditentukan tidak mencukupi.
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
spec:
template:
metadata:
labels:
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/eci-use-specs : "ecs.c6.large" # Tentukan tipe instans ECS.
k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit" # Gunakan strategi yang menetapkan batas harga kustom.
k8s.aliyun.com/eci-spot-price-limit: "0.25" # Tetapkan harga maksimum per jam.
spec:
containers:
- env:
- name: TARGET
value: "Knative"
image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
Contoh 2: Aktifkan fallback otomatis ke instans sesuai permintaan
Contoh YAML berikut membuat spot instance dengan tipe instans ecs.c6.
-
Saat pembuatan, jika tersedia stok yang memenuhi tipe instans dan batas harga yang ditentukan, spot instance dibuat. Instans berjalan selama periode perlindungan 1 jam yang dijamin. Setelah periode ini, spot instance akan ditarik kembali jika harga pasar melebihi penawaran Anda atau jika stok untuk tipe instans yang ditentukan tidak mencukupi.
-
Saat pembuatan, jika tidak tersedia stok yang memenuhi tipe instans dan batas harga yang ditentukan, instans sesuai permintaan dibuat sebagai gantinya. Instans ini tidak akan ditarik kembali secara otomatis oleh sistem. Setelah instans dibuat, Anda dapat menjalankan perintah
kubectl describe poduntuk memeriksa Events Pod tersebut. Jika Anda melihat EventSpotDegraded, artinya Pod tersebut telah diturunkan ke instans sesuai permintaan.
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
spec:
template:
metadata:
labels:
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/eci-use-specs : "ecs.c6.large" # Tentukan tipe instans ECS.
k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit" # Gunakan strategi yang menetapkan batas harga kustom.
k8s.aliyun.com/eci-spot-price-limit: "0.05" # Tetapkan harga maksimum per jam.
k8s.aliyun.com/eci-spot-fallback: "true" # Secara otomatis fallback ke instans sesuai permintaan jika stok spot tidak tersedia.
spec:
containers:
- env:
- name: TARGET
value: "Knative"
image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
Langkah 1: Konfigurasi spot instance
Untuk meminimalkan biaya sumber daya komputasi, Anda dapat menambahkan anotasi k8s.aliyun.com/eci-spot-strategy ke Knative Service Anda. Konfigurasi ini memprioritaskan penggunaan instans ECI Spot, yang ditawarkan dengan harga lebih rendah dibandingkan instans sesuai permintaan.
Namun, spot instance dapat ditarik kembali saat harga pasar melebihi penawaran Anda atau saat stok tidak mencukupi, yang dapat menyebabkan gangguan layanan. Untuk menjaga kelangsungan bisnis, Anda juga dapat menambahkan anotasi k8s.aliyun.com/eci-spot-fallback: "true". Dengan pengaturan ini, jika spot instance tidak tersedia karena kekurangan sumber daya, Knative Service secara otomatis fallback ke penggunaan instans sesuai permintaan, sehingga memastikan stabilitas dan keandalan layanan. Pendekatan ini menyeimbangkan penghematan biaya dengan ketersediaan tinggi.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Pada halaman Knative, klik tab Services. Pilih default dari daftar drop-down Namespace lalu klik Buat dengan Template. Di daftar drop-down Sampel Template, pilih custom. Tempel kode contoh berikut ke editor lalu klik Create untuk membuat Knative Service bernama
helloworld-go.apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go spec: template: metadata: labels: alibabacloud.com/eci: "true" annotations: k8s.aliyun.com/eci-use-specs : "ecs.c6.large" # Tentukan tipe instans ECS. k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo" # Gunakan strategi yang mengikuti harga pasar. k8s.aliyun.com/eci-spot-duration: "1" # Tetapkan periode perlindungan. Default-nya 1 jam. Anda dapat menentukan durasi berbeda saat membuat instans. k8s.aliyun.com/eci-spot-fallback: "true" # Secara otomatis fallback ke instans sesuai permintaan jika stok spot tidak tersedia. spec: containers: - env: - name: TARGET value: "Knative" image: registry-vpc.{REGION-ID}.aliyuncs.com/knative-samples/helloworld-go:160e4dc8 # Ganti {REGION-ID} dengan ID wilayah tempat kluster Anda ditempatkan, misalnya cn-hangzhou.Contoh YAML di atas membuat spot instance dengan tipe instans ecs.c6.
-
Saat pembuatan, jika stok spot untuk tipe instans yang ditentukan tidak tersedia, instans sesuai permintaan dibuat sebagai gantinya.
-
Setelah dibuat, instans berjalan selama periode perlindungan 1 jam yang dijamin. Selama periode ini, instans tidak akan ditarik kembali meskipun harga pasar melebihi penawaran Anda. Setelah periode perlindungan berakhir, spot instance dapat ditarik kembali secara otomatis oleh Alibaba Cloud jika harga pasar melebihi penawaran Anda atau karena stok tidak mencukupi. Saat controller mengganti Pod yang ditarik kembali, pengaturan
k8s.aliyun.com/eci-spot-fallback: "true"memastikan bahwa instans sesuai permintaan baru dibuat jika stok spot tidak tersedia, sehingga menjaga ketersediaan layanan.
-
(Opsional) Langkah 2: Konfigurasi graceful shutdown untuk spot instance
Batasan
Untuk mengaktifkan notifikasi gangguan instans preemptible menggunakan kondisi pod dan mengeluarkan instans preemptible menggunakan Eviction API, Anda harus memperbarui ack-virtual-node ke versi 2.11.0 atau lebih baru. Untuk informasi selengkapnya tentang ack-virtual-node, lihat ack-virtual-node.
Notifikasi gangguan instans preemptible
Alibaba Cloud memberi tahu Anda 3 menit sebelum gangguan instans preemptible dengan mengirimkan event SpotToBeReleased dan mengubah nilai ContainerInstanceExpired dalam kondisi pod menjadi true.
Gambar berikut adalah contoh notifikasi tersebut.
Konfigurasi penanganan mulus untuk spot instance yang akan kedaluwarsa
Untuk meminimalkan gangguan bisnis akibat penarikan kembali instans ECI Spot, node virtual menyediakan fitur graceful shutdown yang dapat dikonfigurasi. Anda dapat menambahkan anotasi k8s.aliyun.com/eci-spot-release-strategy: api-evict ke Pod spot Anda. Saat node virtual menerima event SpotToBeReleased, node tersebut akan memanggil Eviction API untuk mengeluarkan instans spot tersebut. Pengeluaran yang diinisiasi API menghormati pengaturan PodDisruptionBudgets dan terminationGracePeriodSeconds Anda. Membuat objek Eviction melalui API mirip dengan melakukan operasi DELETE yang dikontrol kebijakan pada Pod.
Lakukan panggilan API: Saat node virtual menerima event SpotToBeReleased, node tersebut memanggil Eviction API.
Periksa PDB: Server API memeriksa PDB yang dikonfigurasi untuk pod yang akan dikeluarkan.
Lakukan pengeluaran: Setelah server API memvalidasi permintaan pengeluaran, pod dikeluarkan melalui langkah-langkah berikut:
Pod memperbarui timestamp penghapusannya agar server API dapat mengenali pod yang akan dihentikan. Pod juga diberi cap periode tenggang yang Anda konfigurasi.
kubelet dari node virtual tempat pod berjalan mengenali pod tersebut dan memulai proses graceful shutdown untuk pod tersebut.
Saat kubelet menghentikan pod, lapisan kontrol kluster memutuskan asosiasi pod dari Endpoints dan EndpointSlices terkait. Dalam hal ini, controller pod tidak lagi mengenali pod tersebut sebagai valid.
Saat periode tenggang berakhir, kubelet secara paksa menghentikan pod tersebut.
kubelet memberi tahu sistem untuk menghapus pod tersebut.
Server API menghapus pod tersebut.
-
Dalam lingkungan Knative, setiap Pod yang dikelola oleh Knative Service mencakup kontainer sidecar
queue-proxy. Saat sebuah Pod dihapus,queue-proxymenunggu semua permintaan yang sedang berjalan selesai sebelum kontainer aplikasi dihentikan. Proses ini memungkinkan skala turun atau pembaruan yang mulus.
Pelepasan instans preemptible
Setelah instans preemptible dibuat, instans tersebut dapat berjalan normal selama periode perlindungan. Setelah periode perlindungan berakhir, instans preemptible dilepas jika harga pasar lebih tinggi daripada harga penawaran Anda atau sumber daya stok tidak mencukupi. Anda dapat memahami status pelepasan instans preemptible dengan melakukan operasi berikut:
Event SpotToBeReleased
Event SpotToBeReleased dihasilkan sekitar 3 menit sebelum instans preemptible dilepas.
PentingElastic Container Instance mengirimkan event tersebut ke daftar event Kubernetes. Selama periode tiga menit tersebut, Anda dapat mengambil langkah-langkah untuk memastikan bisnis Anda tidak terganggu oleh pelepasan instans preemptible. Untuk informasi selengkapnya, lihat Graceful termination.
Jalankan perintah
kubectl describeuntuk melihat detail instans preemptible. Event SpotToBeReleased ditampilkan di bagian Events pada output perintah. Contoh:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning SpotToBeReleased 3m32s kubelet, eci Spot ECI will be released in 3 minutesJalankan perintah
kubectl get eventsuntuk melihat informasi event. Event SpotToBeReleased ditampilkan pada output perintah. Contoh:LAST SEEN TYPE REASON OBJECT MESSAGE 3m39s Warning SpotToBeReleased pod/pi-frmr8 Spot ECI will be released in 3 minutes
Status instans preemptible setelah dilepas
Setelah instans preemptible dilepas, informasi instans tersebut tetap disimpan. Status instans berubah menjadi Failed dan penyebab kegagalannya adalah BidFailed.
Jalankan perintah
kubectl get poduntuk melihat informasi instans. Status instans yang ditampilkan pada output perintah berubah menjadi BidFailed. Contoh:NAME READY STATUS RESTARTS AGE pi-frmr8 1/1 BidFailed 0 3h5mJalankan perintah
kubectl describeuntuk melihat detail instans preemptible. Lalu, lihat detail status instans pada output perintah. Contoh:Status: Failed Reason: BidFailed Message: The pod is spot instance, and have been released at 2020-04-08T12:36Z
Dokumen terkait
Jika aplikasi Anda sensitif terhadap latensi cold-start, pertimbangkan untuk menggunakan fitur instans terjadwal. Fitur ini memungkinkan Anda mempertahankan instans berperforma burstable dengan spesifikasi rendah untuk menyeimbangkan biaya dan waktu startup. Untuk informasi selengkapnya, lihat Konfigurasi instans terjadwal.