全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan Knative dengan instans preemptible

更新时间:Jul 06, 2025

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

  • Instans preemptible

    Instans preemptible adalah instans spot yang hemat biaya. Anda dapat menawar untuk instans komputasi idle di Alibaba Cloud dan menjalankan kontainer pada instans tersebut jika harga penawaran Anda lebih tinggi dari harga pasar. Ketika harga pasar melebihi harga penawaran Anda atau instans tidak tersedia, instans preemptible akan ditarik kembali. Untuk informasi lebih lanjut, lihat Ikhtisar.

  • Knative

    Knative adalah kerangka kerja orkestrasi aplikasi serverless open source yang dikembangkan berdasarkan Kubernetes. Knative dirancang untuk orkestrasi aplikasi serverless berbasis cloud-native dan lintas platform. Fitur utamanya meliputi penskalaan otomatis berbasis permintaan, penskalaan hingga nol, manajemen versi, rilis canary berbasis lalu lintas, penyebaran fungsi, dan eventing. Untuk informasi lebih lanjut tentang Knative, lihat Ikhtisar ACK Knative dan Ikhtisar ACK Serverless Knative.

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.

image

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

Penting

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:

  • SpotWithPriceLimit: Buat instans preemptible dengan harga maksimum per jam. Untuk mengatur harga maksimum per jam, atur anotasi k8s.aliyun.com/eci-spot-price-limit.

  • SpotAsPriceGo: Buat instans preemptible di mana sistem secara otomatis menawar berdasarkan harga pasar saat ini.

    Penting

    Jika Anda memilih SpotAsPriceGo dan instans tipe tertentu di zona tertentu tidak mencukupi, harga maksimum per jam mungkin mencapai harga bayar sesuai pemakaian instans tersebut.

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-strategy diatur ke SpotWithPriceLimit.

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: false.

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:73fbdd56

Contoh 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 pod untuk 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:73fbdd56

Langkah 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.

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel navigasi kiri, pilih Applications > Knative.

  3. 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.图片 1.png

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.

  1. Lakukan panggilan API: Ketika node virtual menerima peristiwa SpotToBeReleased, node tersebut memanggil Eviction API.

  2. Periksa PDB: Server API memeriksa PDB yang dikonfigurasi untuk pod yang akan dievakuasi.

  3. Lakukan evakuasi: Setelah server API memvalidasi permintaan evakuasi, pod dievakuasi melalui langkah-langkah berikut:

    1. Pod memperbarui timestamp penghapusan sehingga server API dapat mengenali pod yang akan diakhiri. Pod juga diberi cap dengan periode grace yang Anda konfigurasi.

    2. kubelet node virtual tempat pod berjalan mengenali pod dan memulai shutdown yang mulus untuk pod.

    3. 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.

    4. Ketika periode grace berakhir, kubelet secara paksa mengakhiri pod.

    5. Kubelet memberi tahu sistem untuk menghapus pod.

    6. Server API menghapus pod.

  4. 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.

    Penting

    Elastic 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 describe untuk 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 minutes
    • Jalankan perintah kukubectl get events untuk 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 pod untuk 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          3h5m
    • Jalankan perintah kubectl describe untuk 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.