Pada kluster campuran yang menggabungkan node nyata dan node virtual, penjadwalan Pod ke Elastic Container Instance (ECI) serta pengaktifan fitur khusus ECI biasanya memerlukan modifikasi file YAML Pod—mengaburkan batas antara operasi platform dan konfigurasi aplikasi. eci-profile menghilangkan beban tersebut. Sebagai administrator kluster, Anda menetapkan aturan penjadwalan dan injeksi anotasi dalam satu ConfigMap tingkat kluster, sehingga Pod secara otomatis menerima konfigurasi yang tepat tanpa perubahan apa pun pada file YAML aplikasi.
Cara kerja
Saat sebuah Pod dibuat, ack-virtual-node membaca ConfigMap bernama eci-profile di namespace kube-system dan menerapkan konfigurasi pada bagian data-nya ke Pod tersebut.
eci-profile menyediakan tiga kemampuan:
-
ECI Scheduler — Mengarahkan Pod ke ECI berdasarkan label Pod atau label namespace melalui mekanisme mutating webhook, sehingga menghilangkan kebutuhan untuk menambahkan direktif penjadwalan ke setiap file YAML Pod.
-
ECI Effect — Secara otomatis menyuntikkan anotasi dan label ke Pod yang sesuai untuk mengaktifkan fitur lanjutan ECI, seperti menentukan tipe instans Elastic Compute Service (ECS), mengaktifkan cache gambar, dan mengonfigurasi layanan Network Time Protocol (NTP). Untuk daftar lengkap anotasi yang didukung, lihat ECI Pod Annotation.
-
Pembaruan panas (Hot updates) — Perubahan konfigurasi pada eci-profile (seperti alamat IP kluster, cloud hibrida, pengumpulan log, dan vSwitch) langsung berlaku untuk Pod yang baru dibuat tanpa perlu restart ack-virtual-node. Pod yang sudah ada hanya menerapkan perubahan setelah rolling update.
Prasyarat
Sebelum memulai, pastikan bahwa:
-
Add-on ack-virtual-node di kluster Anda menggunakan versi terbaru. Untuk memperbaruinya, lihat Kelola komponen.
-
Mutating webhook diaktifkan di kluster Anda (diperlukan untuk ECI Scheduler). Pada kluster ACK Serverless, Pod dijadwalkan ke ECI secara otomatis sehingga ECI Scheduler tidak diperlukan.
Catatan penggunaan
-
Setelah memperbarui eci-profile, Pod ECI yang baru dibuat langsung menggunakan konfigurasi terbaru. Pod yang sudah ada hanya menggunakan konfigurasi terbaru setelah rolling update.
-
Jika Anda tidak mengonfigurasi
namespaceSelectormaupunobjectSelectoruntuk suatu selector tetapi mengonfigurasieffect, pengaturan effect tersebut berlaku untuk semua Pod yang dijadwalkan ke ECI. -
Jika beberapa selector cocok dengan suatu Pod, mereka dievaluasi secara berurutan. Anotasi dan label dari selector yang cocok lebih awal memiliki prioritas lebih tinggi daripada yang cocok kemudian. Namun, anotasi dan label Pod yang sudah ada selalu memiliki prioritas lebih tinggi daripada yang disuntikkan oleh
effect.
Lihat eci-profile
Jalankan perintah berikut untuk melihat ConfigMap eci-profile saat ini:
kubectl get cm -n kube-system eci-profile -o yaml
Bagian data dari ConfigMap berisi dua jenis konfigurasi:
| Parameter | Deskripsi |
|---|---|
selectors |
Menentukan aturan ECI Scheduler dan ECI Effect. Lihat Konfigurasikan selector. |
Parameter lain (vpcId, vSwitchIds, dll.) |
Parameter tingkat kluster yang berlaku jika tidak ada penggantian tingkat Pod. Mendukung pembaruan panas. Lihat Perbarui parameter tingkat kluster. |
Contoh eci-profile default tampak seperti berikut:
apiVersion: v1
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
featureGates: "WaitForFirstConsumer=false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****
kind: ConfigMap
metadata:
creationTimestamp: "2023-01-11T08:28:14Z"
name: eci-profile
namespace: kube-system
resourceVersion: "356"
uid: b345fa8c-919e-41fc-a981-57864b1a****
Edit eci-profile
Gunakan salah satu metode berikut untuk mengedit eci-profile.
kubectl
kubectl edit configmap eci-profile -n kube-system
Konsol ACK
-
Masuk ke Konsol Container Service ACK.
-
Pada halaman Clusters, klik nama kluster target.
-
Di panel navigasi kiri, pilih Configurations > ConfigMaps.
-
Pilih kube-system dari daftar drop-down Namespace.
-
Temukan eci-profile dan klik Edit YAML di kolom Actions.
Konfigurasikan selector
Selector menentukan Pod mana yang diarahkan ke ECI (ECI Scheduler) dan anotasi atau label mana yang disuntikkan ke Pod tersebut (ECI Effect). Saat sebuah Pod dibuat, sistem mengevaluasi setiap selector secara berurutan dan menerapkan aturan yang sesuai.
Setiap selector mendukung bidang berikut:
-
`name` (wajib) — Nama unik untuk selector.
-
`namespaceSelector` (opsional) — Mencocokkan Pod berdasarkan label namespace. Tentukan label di bawah
matchLabels. Beberapa label menggunakan logika AND. -
`objectSelector` (opsional) — Mencocokkan Pod berdasarkan label Pod. Tentukan label di bawah
matchLabels. Beberapa label menggunakan logika AND. -
`effect` (opsional) — Anotasi dan label yang akan disuntikkan ke Pod yang cocok. Nilai yang disuntikkan tidak menimpa anotasi atau label Pod yang sudah ada.
Jika namespaceSelector dan objectSelector keduanya dikonfigurasi, Pod harus memenuhi keduanya agar cocok dengan selector. Jika keduanya tidak dikonfigurasi tetapi effect dikonfigurasi, efek tersebut berlaku untuk semua Pod yang dijadwalkan ke ECI.
Templat selector
data:
selectors: |
[
{
"name": "selector-demo1", # Wajib. Nama selector unik.
"namespaceSelector": { # Opsional. Mencocokkan berdasarkan label namespace.
"matchLabels": { # Logika AND antar beberapa label.
"eci": "true"
}
},
"objectSelector": { # Opsional. Mencocokkan berdasarkan label Pod.
"matchLabels": { # Logika AND antar beberapa label.
"eci": "true"
}
},
"effect": { # Opsional. Anotasi dan label yang akan disuntikkan.
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
},
"labels": {
"created-by-eci": "true"
}
}
},
{
"name": "selector-demo2",
"objectSelector": {
"matchLabels": {
"eci": "test"
}
}
}
]
Pada contoh di atas, selector-demo1 mencocokkan Pod yang memiliki label Pod eci: true dan berada dalam namespace dengan label eci: true. Pod yang cocok dijadwalkan ke ECI dan menerima anotasi k8s.aliyun.com/eci-use-specs: ecs.c6.xlarge serta label created-by-eci: true.
Hapus komentar inline (#) sebelum menerapkan konfigurasi. JSON tidak mendukung komentar.
Verifikasi bahwa selector berlaku
Setelah memperbarui selector, jalankan perintah berikut untuk memastikan selector telah terdaftar:
kubectl get mutatingwebhookconfigurations -o yaml vk-webhook
Jika output berisi selector yang Anda konfigurasi, konfigurasi tersebut aktif. Jika tidak, periksa apakah format JSON selector Anda benar.
Contoh konfigurasi
Contoh 1: Arahkan Pod tertentu ke ECI
Selector berikut mengarahkan Pod ke ECI jika Pod memiliki label created-by-eci: true dan namespace-nya memiliki label type: eci.
data:
selectors: |
[
{
"name": "eci-selector",
"namespaceSelector": {
"matchLabels": {
"type": "eci"
}
},
"objectSelector": {
"matchLabels": {
"created-by-eci": "true"
}
}
}
]
Contoh 2: Arahkan Pod ke ECI dengan tipe instans GPU-accelerated
Selector berikut mengarahkan Pod yang namespace-nya memiliki label gpu: true ke ECI, menggunakan tipe instans GPU-accelerated ecs.gn6v-c8g1.2xlarge, serta menambahkan label gpu: test ke Pod yang cocok.
data:
selectors: |
[
{
"name": "gpu-namespace-selector",
"namespaceSelector": {
"matchLabels": {
"gpu": "true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.gn6v-c8g1.2xlarge"
},
"labels": {
"gpu": "test"
}
}
}
]
Contoh 3: Arahkan Pod ke ECI dengan pencocokan cache gambar otomatis
Selector berikut mengarahkan Pod dengan label imc: auto ke ECI dan mengaktifkan pencocokan cache gambar otomatis.
data:
selectors: |
[
{
"name": "autoimc-object-selector",
"objectSelector": {
"matchLabels": {
"imc": "auto"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-auto-imc": "true"
}
}
}
]
Perbarui parameter tingkat kluster
Parameter berikut dalam bagian data merupakan nilai default tingkat kluster. Saat sebuah Pod dibuat tanpa penggantian tingkat Pod, nilai dari eci-profile digunakan. Semua parameter mendukung pembaruan panas—perubahan langsung berlaku tanpa perlu merestart ack-virtual-node.
Parameter ini hanya berlaku jika tidak ada konfigurasi tingkat Pod yang menggantikannya.
| Parameter | Default | Deskripsi |
|---|---|---|
enableClusterIp |
"true" |
Apakah alamat IP kluster didukung. |
enableHybridMode |
"false" |
Apakah mode cloud hibrida diaktifkan. |
enableLinuxArm64Node |
"false" |
Apakah node berbasis ARM diaktifkan. Lihat Jadwalkan Pod ke node virtual berbasis ARM. |
enableLogController |
"false" |
Apakah Custom Resource Definition (CRD) untuk Simple Log Service digunakan untuk mengumpulkan log Pod. Jika diatur ke "true", konfigurasikan juga slsMachineGroup. |
enablePVCController |
"false" |
Apakah ekstensi disk online diaktifkan. Jika diatur ke "true", sistem dapat melakukan hot-extend PersistentVolumeClaims (PVC) yang terikat ke disk. |
enablePrivateZone |
"false" |
Apakah PrivateZone digunakan untuk resolusi nama domain. |
enableReuseSSLKey |
"false" |
Apakah kunci SSL digunakan ulang di antara Pod. Secara default, ack-virtual-node menerbitkan sertifikat SSL unik untuk setiap Pod. Mengatur ini ke "true" membuat semua Pod berbagi sertifikat yang sama, yang meningkatkan throughput pembuatan Pod tetapi mengurangi keamanan. |
featureGates |
"WaitForFirstConsumer=false" |
Feature gate canary. Hanya WaitForFirstConsumer yang dapat dikonfigurasi. Lihat catatan di bawah. |
securityGroupId |
— | Grup keamanan untuk Pod ECI. Contoh: sg-2zeeyaaxlkq9sppl****. |
slsMachineGroup |
— | Kelompok mesin untuk Pod ECI. Diperlukan saat enableLogController bernilai "true". Contoh: test-mg. |
vSwitchIds |
— | ID vSwitch untuk Pod ECI. Pisahkan beberapa ID dengan koma. Contoh: vsw-2ze23nqzig8inprou**,vsw-2ze94pjtfuj9vaymf**. |
vpcId |
— | ID Virtual Private Cloud (VPC) tempat Pod ECI dideploy. Contoh: vpc-2zeghwzptn5zii0w7****. |
Tentang `featureGates: WaitForFirstConsumer`
Saat WaitForFirstConsumer diatur ke "true":
-
Add-on csi-provisioner harus menggunakan versi terbaru sebelum mengaktifkan pengaturan ini.
-
PersistentVolume (PV) dan penyimpanan backend hanya dibuat setelah Pod dijadwalkan. Zona dan wilayah yang ditentukan dalam StorageClass tidak lagi digunakan; sebagai gantinya, zona dan wilayah node tempat Pod dijadwalkan digunakan untuk membuat sumber daya penyimpanan. Hal ini memastikan sumber daya komputasi dijadwalkan secara optimal.
Untuk informasi lebih lanjut, lihat Volume binding mode.
Contoh lengkap bagian data:
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****