Jika bisnis Anda tidak memerlukan waktu operasi lama, seperti permintaan layanan web jangka pendek, toleran terhadap gangguan, dan dapat dilepaskan ketika tidak diperlukan lagi, Anda dapat mengonfigurasi Layanan Knative untuk menggunakan instans preemptible. Instans ini lebih hemat biaya dibandingkan instans Elastic Compute Service (ECS) dengan model bayar sesuai pemakaian. Menggunakan Knative dengan instans preemptible memastikan elastisitas dan kecepatan respons layanan, meningkatkan efisiensi biaya sumber daya komputasi cloud secara maksimal, serta mendukung pengembangan aplikasi di atas kerangka kerja serverless yang lebih efisien dan hemat biaya.
Prasyarat
Knative telah diterapkan di kluster Anda. Untuk informasi lebih lanjut, lihat atau Deploy dan kelola Knative.
Istilah
Pelaksanaan, fitur, dan manfaat
Dalam Knative, beban kerja serverless dikelola melalui Layanan Knative. Layanan Knative dapat secara otomatis menskalakan pod berdasarkan permintaan. Untuk menggunakan instans preemptible, cukup tambahkan anotasi pod yang sesuai. Node virtual kemudian secara otomatis mengajukan instans kontainer elastis berdasarkan spesifikasi dalam anotasi pod. Node virtual juga mendukung penggantian otomatis instans preemptible untuk mengotomatiskan penggunaannya.

Manfaat menggunakan Knative dengan instans preemptible:
Skenario serverless: Sumber daya dapat dibuat dan dilepaskan sesuai kebutuhan untuk layanan web jangka pendek.
Adaptif terhadap shutdown yang mulus: Selama penggantian otomatis instans preemptible, kontroler beban kerja perlu menghapus pod saat ini dan membuat instans preemptible baru. Ini memerlukan kontainer aplikasi untuk mendukung shutdown yang mulus. Di Knative, setiap pod berisi kontainer sidecar queue-proxy. Ketika kontroler beban kerja menghapus pod, ia harus menunggu hingga kontainer sidecar queue-proxy selesai memproses semua permintaan sebelum menghapus semua kontainer aplikasi.
Pengguna sensitif terhadap biaya: Instans preemptible lebih cocok untuk pengguna Knative yang sensitif terhadap biaya.
Contoh penggunaan Knative dengan instans preemptible
Konfigurasikan instans preemptible
Untuk menggunakan instans kontainer elastis, Anda harus menambahkan anotasi berikut ke pod berbasis Elastic Container Instance saat membuat pod. Jika Anda menambahkan anotasi ke pod berbasis Elastic Container Instance yang sudah ada atau langsung memodifikasi anotasi pod berbasis Elastic Container Instance, anotasi tersebut tidak akan berlaku.
Anda dapat menambahkan anotasi dalam tabel berikut ke Layanan untuk mengonfigurasi instans preemptible.
Anotasi | Contoh | Diperlukan | Deskripsi |
k8s.aliyun.com/eci-spot-strategy | SpotAsPriceGo | Ya | Menentukan kebijakan penawaran untuk instans preemptible. Nilai valid:
|
k8s.aliyun.com/eci-spot-price-limit | "0.5" | Tidak | Harga maksimum per jam instans preemptible. Nilai ini dapat akurat hingga tiga tempat desimal. Anotasi ini hanya berlaku ketika |
k8s.aliyun.com/eci-spot-duration | "1" | Tidak | Menentukan periode perlindungan instans preemptible. Nilai default: 1. Anda dapat mengatur nilai menjadi 0. Nilai 0 menunjukkan tidak ada periode perlindungan yang ditentukan. |
k8s.aliyun.com/eci-spot-fallback | "true" | Tidak | Menentukan apakah akan secara otomatis membuat instans bayar sesuai pemakaian ketika instans preemptible tipe tertentu tidak tersedia. Nilai default: |
Contoh 1: Tentukan tipe instans ECS dan gunakan kebijakan SpotWithPriceLimit.
Template YAML berikut membuat instans preemptible tipe ecs.c6.
Jika instans yang memenuhi persyaratan tipe instans dan harga maksimum per jam tidak tersedia, tidak ada instans preemptible yang dibuat.
Setelah instans preemptible dibuat, Anda dijamin dapat menggunakannya selama periode perlindungan (1 jam). Setelah periode perlindungan berakhir, jika harga pasar melebihi harga penawaran Anda atau instans tipe tertentu menjadi tidak mencukupi, instans preemptible akan dilepaskan.
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 Elastic Compute Service (ECS).
k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit" # Gunakan kebijakan SpotWithPriceLimit untuk mengatur harga maksimum per jam.
k8s.aliyun.com/eci-spot-price-limit: "0.250" # Tentukan harga maksimum per jam.
spec:
containers:
- env:
- name: TARGET
value: "Knative"
image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56Contoh 2: Secara otomatis buat instans bayar sesuai pemakaian ketika inventaris tidak mencukupi
Template YAML berikut membuat instans preemptible tipe ecs.c6.
Instans preemptible dibuat jika persyaratan tipe instans dan harga maksimum per jam terpenuhi. Setelah instans preemptible dibuat, Anda dijamin dapat menggunakannya selama periode perlindungan (1 jam). Setelah periode perlindungan berakhir, jika harga pasar melebihi harga penawaran Anda atau instans tipe tertentu menjadi tidak mencukupi, instans preemptible akan dilepaskan.
Instans bayar sesuai pemakaian dibuat jika instans yang memenuhi persyaratan tipe instans dan harga maksimum per jam tidak tersedia. Sistem tidak secara otomatis melepaskan instans bayar sesuai pemakaian. Setelah instans bayar sesuai pemakaian dibuat, Anda dapat menjalankan perintah
kubectl describe poduntuk melihat peristiwa pod dan memeriksa apakah instans bayar sesuai pemakaian dibuat. Jika peristiwa SpotDegraded dihasilkan, instans bayar sesuai pemakaian dibuat.
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 kebijakan SpotWithPriceLimit untuk mengatur harga maksimum per jam.
k8s.aliyun.com/eci-spot-price-limit: "0.05" # Atur harga maksimum per jam.
k8s.aliyun.com/eci-spot-fallback: "true" # Buat instans bayar sesuai pemakaian ketika instans preemptible tidak tersedia.
spec:
containers:
- env:
- name: TARGET
value: "Knative"
image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56Langkah 1: Konfigurasikan instans preemptible untuk Layanan Knative
Untuk meminimalkan biaya komputasi, Anda dapat menambahkan anotasi k8s.aliyun.com/eci-spot-strategy ke Layanan Knative Anda. Dengan cara ini, Layanan memprioritaskan instans kontainer elastis preemptible. Instans preemptible lebih hemat biaya dibandingkan instans bayar sesuai pemakaian.
Namun, instans preemptible ditarik kembali ketika harga pasar melebihi harga penawaran atau instans tipe tertentu tidak tersedia. Ini menyebabkan gangguan layanan. Untuk memastikan kontinuitas dan stabilitas bisnis, atur anotasi k8s.aliyun.com/eci-spot-fallback: "true" untuk mengizinkan Layanan Knative membuat instans bayar sesuai pemakaian ketika instans preemptible tidak mencukupi. Ini membantu Anda menyeimbangkan biaya dan stabilitas layanan.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel navigasi kiri, pilih .
Di tab Services halaman Knative, atur Namespace ke default dan klik Create from Template. Pilih Custom dari daftar drop-down Sample Template, salin konten berikut ke template, dan klik Create untuk membuat Layanan Knative 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 kebijakan SpotAsPriceGo. k8s.aliyun.com/eci-spot-duration: "1" # Atur periode perlindungan. Nilai default: 1. Unit: jam. Anda dapat menentukan periode perlindungan sesuai kebutuhan. k8s.aliyun.com/eci-spot-fallback: "true" # Buat instans bayar sesuai pemakaian ketika instans preemptible tidak tersedia. spec: containers: - env: - name: TARGET value: "Knative" image: registry-vpc.{REGION-ID}.aliyuncs.com/knative-samples/helloworld-go:160e4dc8 # {REGION-ID} menunjukkan wilayah kluster, seperti cn-hangzhou.File YAML di atas membuat instans preemptible tipe ecs.c6.
Ketika instans tipe tertentu tidak tersedia, tidak ada instans preemptible yang dibuat.
Setelah instans preemptible dibuat, Anda dijamin dapat menggunakannya selama 1 jam. Instans tidak dilepaskan dalam periode perlindungan meskipun harga pasar melebihi harga penawaran. Setelah periode perlindungan berakhir, jika harga pasar melebihi harga penawaran atau instans tipe tertentu tidak tersedia, Alibaba Cloud mungkin melepaskan instans preemptible. Untuk menghindari masalah ini, atur anotasi
k8s.aliyun.com/eci-spot-fallback: "true"untuk mengizinkan sistem membuat instans bayar sesuai pemakaian demi memastikan kontinuitas bisnis ketika instans preemptible tidak mencukupi atau dilepaskan.
(Opsional) Langkah 2: Konfigurasikan shutdown yang mulus untuk instans preemptible
Batasan
Untuk mengaktifkan notifikasi pada gangguan instans preemptible dengan menggunakan kondisi pod dan mengevakuasi instans preemptible dengan menggunakan Eviction API, Anda harus memperbarui ack-virtual-node ke versi 2.11.0 atau lebih baru. Untuk informasi lebih lanjut tentang ack-virtual-node, lihat ack-virtual-node.
Notifikasi pada gangguan instans preemptible
Alibaba Cloud memberi tahu Anda 3 menit sebelum interupsi instans preemptible dengan mengirimkan event SpotToBeReleased dan mengubah nilai dari ContainerInstanceExpired dalam kondisi pod menjadi true.
Gambar berikut adalah contoh notifikasi.
Konfigurasikan shutdown yang mulus untuk instans preemptible yang kedaluwarsa
Untuk menghindari gangguan bisnis yang disebabkan oleh penarikan kembali instans kontainer elastis preemptible, node virtual memungkinkan Anda mengonfigurasi shutdown yang mulus untuk instans tersebut. Untuk melakukannya, tambahkan anotasi k8s.aliyun.com/eci-spot-release-strategy: api-evict ke pod yang dijadwalkan ke instans preemptible. Ketika node virtual menerima peristiwa SpotToBeReleased event, ia memanggil Eviction API untuk mengevakuasi instans preemptible. Evakuasi mematuhi pengaturan PodDisruptionBudgets dan terminationGracePeriodSeconds. Membuat objek Eviction dengan memanggil API serupa dengan tindakan DELETE dalam kebijakan kontrol pod.
Lakukan panggilan API: Ketika node virtual menerima peristiwa SpotToBeReleased, node tersebut memanggil Eviction API.
Periksa PDB: Server API memeriksa PDB yang dikonfigurasi untuk pod yang akan dievakuasi.
Lakukan evakuasi: Setelah server API memvalidasi permintaan evakuasi, pod dievakuasi melalui langkah-langkah berikut:
Pod memperbarui timestamp penghapusan sehingga server API dapat mengenali pod yang akan diakhiri. Pod juga diberi cap dengan periode grace yang Anda konfigurasi.
kubelet node virtual tempat pod berjalan mengenali pod dan memulai shutdown yang mulus untuk pod.
Ketika kubelet mengakhiri pod, bidang kontrol kluster memisahkan pod dari Titik akhir dan Endpointslices terkait. Dalam hal ini, kontroler pod tidak lagi mengenali pod sebagai valid.
Ketika periode grace berakhir, kubelet secara paksa mengakhiri pod.
Kubelet memberi tahu sistem untuk menghapus pod.
Server API menghapus pod.
Dalam skenario Knative, setiap pod Layanan berisi kontainer sidecar queue-proxy. Untuk memastikan kontinuitas bisnis dan integritas data, ketika sistem menghapus pod, ia menunggu hingga kontainer sidecar queue-proxy selesai memproses semua permintaan yang sedang berlangsung sebelum dapat mengakhiri semua kontainer aplikasi. Ini memungkinkan penskalaan dan pembaruan pod yang mulus.
Pelepasan instans preemptible
Setelah instans preemptible dibuat, ia dapat berjalan normal selama periode perlindungan. Setelah periode perlindungan berakhir, instans preemptible dilepaskan jika harga pasar lebih tinggi dari harga penawaran Anda atau sumber daya inventaris tidak mencukupi. Anda dapat memahami status pelepasan instans preemptible dengan melakukan operasi berikut:
Peristiwa SpotToBeReleased
Peristiwa SpotToBeReleased dihasilkan sekitar 3 menit sebelum instans preemptible dilepaskan.
PentingElastic Container Instance mengirimkan peristiwa ke daftar peristiwa Kubernetes. Selama periode tiga menit, Anda dapat mengambil tindakan untuk memastikan bahwa bisnis Anda tidak terpengaruh oleh pelepasan instans preemptible. Untuk informasi lebih lanjut, lihat Penghentian yang mulus.
Jalankan perintah
kubectl describeuntuk melihat detail instans preemptible. Peristiwa SpotToBeReleased ditampilkan di bagian Peristiwa output perintah. Contoh:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning SpotToBeReleased 3m32s kubelet, eci Spot ECI will be released in 3 minutesJalankan perintah
kukubectl get eventsuntuk melihat informasi peristiwa. Peristiwa SpotToBeReleased ditampilkan dalam 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 dilepaskan
Setelah instans preemptible dilepaskan, informasi instans masih dipertahankan. Status instans berubah menjadi Gagal dan penyebab kegagalan adalah BidFailed.
Jalankan perintah
kubectl get poduntuk melihat informasi instans. Status instans yang ditampilkan dalam 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. Kemudian, lihat detail tentang status instans dalam output perintah. Contoh:Status: Failed Reason: BidFailed Message: The pod is spot instance, and have been released at 2020-04-08T12:36Z
Referensi
Untuk menghindari latensi cold start, kami sarankan Anda menggunakan fitur instans cadangan untuk memesan instans burstable dengan spesifikasi rendah. Ini membantu Anda menyeimbangkan biaya dan efisiensi. Untuk informasi lebih lanjut, lihat Konfigurasikan instans cadangan.