Resource kustom UnitedDeployment menyederhanakan pengelolaan beberapa workload homogen dengan mengelompokkannya ke dalam unit fleksibel yang disebut Subsets. Misalnya, ketika sebuah aplikasi perlu diterapkan di beberapa zona ketersediaan, Anda dapat mendefinisikan Subset untuk Deployment di setiap zona. UnitedDeployment kemudian mengelola pembaruan dan penerapan detail halus untuk setiap Subset, sehingga menghilangkan kebutuhan untuk mengonfigurasi dan memelihara file YAML Deployment secara terpisah secara manual.
Selain itu, Anda dapat menggunakan UnitedDeployment bersama Horizontal Pod Autoscaler (HPA) untuk mencapai penskalaan terurut di kluster yang menggunakan campuran sumber daya komputasi. Hal ini memungkinkan Pod diperluas kapasitasnya dalam urutan tertentu (misalnya dari termurah ke termahal) dan diskalakan-masuk dalam urutan terbalik, sehingga secara signifikan mengoptimalkan biaya sumber daya.
Lihat dokumentasi resmi Kruise UnitedDeployment untuk detail selengkapnya. Topik ini menjelaskan cara mengonfigurasi pengontrol UnitedDeployment menggunakan file YAML untuk memenuhi kebutuhan dalam berbagai skenario.
Jenis workload yang didukung
Pengontrol UnitedDeployment hanya mendukung jenis workload berikut: StatefulSet, Advanced StatefulSet, CloneSet, dan Deployment. Untuk informasi lebih lanjut, lihat Gunakan OpenKruise untuk menerapkan aplikasi cloud-native.
Prasyarat
Add-on ack-kruise telah diinstal. Untuk informasi lebih lanjut, lihat Kelola add-on.
Add-on ACK Virtual Node hadir secara pra-instal bersama ECI. Untuk informasi lebih lanjut, lihat Kelola add-on.
Klien kubectl telah terhubung ke kluster ACK. Untuk informasi lebih lanjut, lihat Dapatkan kubeconfig kluster dan hubungkan ke kluster menggunakan kubectl.
Skenario 1: Gunakan pengontrol UnitedDeployment bersama HPA
Jika kluster Anda berisi beberapa jenis sumber daya, konfigurasikan subset dalam file YAML UnitedDeployment untuk memilih satu jenis sumber daya. Anda juga dapat menambahkan bidang maxReplicas untuk menentukan cara penjadwalan Pod setelah jumlah Pod mencapai batas atas. Saat Anda menggunakan HPA untuk menerapkan horizontal pod autoscaling pada UnitedDeployment, Pod diskalakan berdasarkan prioritas sumber daya yang ditentukan. Saat mengonfigurasi HPA, atur bidang scaleTargetRef HPA ke UnitedDeployment dan nama UnitedDeployment tersebut.
Diperlukan OpenKruise 1.5.0. Untuk informasi lebih lanjut mengenai catatan rilis OpenKruise, lihat OpenKruise.
Dalam contoh ini, terdapat dua kelompok node di kluster. Kelompok Node A terdiri dari instans ECS langganan, sedangkan Kelompok Node B terdiri dari instans preemptible. Konfigurasikan sistem agar menjadwalkan Pod ke berbagai jenis node sesuai urutan prioritas berikut: instans ECS langganan > instans spot > ECI. Ketika node jenis tertentu kehabisan stok, sistem akan menggunakan node dengan prioritas lebih rendah untuk penjadwalan Pod.
Buat file bernama test.yaml dan salin konten berikut ke dalam file tersebut.
File test.yaml digunakan untuk mengatur UnitedDeployment. Parameter
templatedalam file tersebut mendefinisikan konfigurasi Deployment. File ini juga mendefinisikan tiga subset.Pod subset-a diterapkan pada instans ECS langganan di Kelompok Node A. Pod subset-b diterapkan pada instans preemptible di Kelompok Node B. Jumlah replika adalah
1baik pada subset-a maupun subset-b.subset-c dikonfigurasi dengan parameter
nodeSelectorTermdantolerations, yang digunakan untuk memilih ECI. Dalam kasus ini, Pod subset-c diterapkan pada ECI. Jumlah replika pada subset-c adalah3.
apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment metadata: name: ud-nginx spec: replicas: 6 revisionHistoryLimit: 10 selector: matchLabels: app: ud-nginx template: deploymentTemplate: metadata: labels: app: ud-nginx spec: selector: matchLabels: app: ud-nginx template: metadata: labels: app: ud-nginx spec: containers: - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0 name: nginx topology: subsets: - name: subset-a nodeSelectorTerm: matchExpressions: - key: alibabacloud.com/nodepool-id operator: In values: - np92019eec42004d878fcdc990fcb9**** # Ganti nilai ini dengan ID Kelompok Node A. replicas: 1 - name: subset-b nodeSelectorTerm: matchExpressions: - key: alibabacloud.com/nodepool-id operator: In values: - np011de1f2de3d48bd8a92a015fc5c**** # Ganti nilai ini dengan ID Kelompok Node B. replicas: 1 - name: subset-c nodeSelectorTerm: matchExpressions: - key: type operator: In values: - virtual-kubelet tolerations: - key: virtual-kubelet.io/provider operator: Exists replicas: 3 updateStrategy: manualUpdate: partitions: subset-a: 0 subset-b: 0 subset-c: 0 type: ManualJalankan perintah berikut untuk menerapkan UnitedDeployment:
kubectl apply -f test.yamlOutput yang diharapkan:
uniteddeployment.apps.kruise.io/ud-nginx createdJalankan perintah berikut untuk memeriksa apakah Pod telah dibuat:
kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ud-nginx-subset-a-7lbtd-5b5bd77549-5bw6l 1/1 Running 0 73s 192.XX.XX.126 cn-hangzhou.10.XX.XX.131 <none> <none> ud-nginx-subset-b-nvvfw-5c9bcd6766-lv6sp 1/1 Running 0 73s 192.XX.XX.239 cn-hangzhou.10.XX.XX.132 <none> <none> ud-nginx-subset-c-m78fd-7796b66fd8-7p52j 1/1 Running 0 73s 192.XX.XX.130 virtual-kubelet-cn-hangzhou-h <none> <none> ud-nginx-subset-c-m78fd-7796b66fd8-fd7f7 1/1 Running 0 73s 192.XX.XX.129 virtual-kubelet-cn-hangzhou-h <none> <none> ud-nginx-subset-c-m78fd-7796b66fd8-mn4qb 1/1 Running 0 73s 192.XX.XX.131 virtual-kubelet-cn-hangzhou-h <none> <none>Output tersebut menunjukkan bahwa Pod diterapkan pada subset berbeda sesuai konfigurasi UnitedDeployment.
Skenario 2: Terapkan aplikasi lintas zona
Untuk meningkatkan ketersediaan aplikasi, biasanya Anda perlu menerapkan sumber daya komputasi atau penyimpanan di beberapa zona. Anda dapat menambahkan label berbeda ke node di zona berbeda. Kemudian, konfigurasikan pemilih label dalam konfigurasi subset pada file YAML UnitedDeployment. Dengan cara ini, UnitedDeployment menjadwalkan Pod dari subset berbeda ke zona berbeda yang memiliki label yang sesuai.
Terdapat tiga node di zona berbeda. Jalankan perintah berikut untuk menambahkan label ke setiap node guna menunjukkan zona tempat node tersebut berada.
Misalnya, label
node=zone-aditambahkan ke node di Zona A, labelnode=zone-bditambahkan ke node di Zona B, dan labelnode=zone-cditambahkan ke node di Zona C.kubectl label node cn-beijing.10.XX.XX.131 node=zone-a node/cn-beijing.10.80.20.131 labeled # Tambahkan label node=zone-a ke node 10.XX.XX.131. kubectl label node cn-beijing.10.XX.XX.132 node=zone-b node/cn-beijing.10.80.20.132 labeled # Tambahkan label node=zone-b ke node 10.XX.XX.132. kubectl label node cn-beijing.10.XX.XX.133 node=zone-c node/cn-beijing.10.80.20.133 labeled # Tambahkan label node=zone-c ke node 10.XX.XX.133.Buat file bernama test.yaml dan salin konten berikut ke dalam file tersebut.
File test.yaml digunakan untuk mengatur UnitedDeployment. Parameter
templatedalam file tersebut mendefinisikan konfigurasi StatefulSet. File ini juga mendefinisikan satu subset untuk setiap zona.Bidang
statefulSetTemplatemendefinisikan templat StatefulSet. UnitedDeployment membuat StatefulSet pada setiap subset berdasarkan templat tersebut.Bagian
subsetsmendefinisikan satu subset untuk setiap zona. Pod subset-a diterapkan pada node yang memiliki labelnode=zone-a. Podsubset-bditerapkan pada node yang memiliki labelnode=zone-b. Podsubset-cditerapkan pada node yang memiliki labelnode=zone-c.
apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment metadata: name: sample-ud spec: replicas: 6 revisionHistoryLimit: 10 selector: matchLabels: app: sample template: statefulSetTemplate: metadata: labels: app: sample spec: selector: matchLabels: app: sample template: metadata: labels: app: sample spec: containers: - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0 name: nginx topology: subsets: - name: subset-a nodeSelectorTerm: matchExpressions: - key: node operator: In values: - zone-a replicas: 1 - name: subset-b nodeSelectorTerm: matchExpressions: - key: node operator: In values: - zone-b replicas: 50% - name: subset-c nodeSelectorTerm: matchExpressions: - key: node operator: In values: - zone-c updateStrategy: manualUpdate: partitions: subset-a: 0 subset-b: 0 subset-c: 0 type: ManualJalankan perintah berikut untuk menerapkan UnitedDeployment:
kubectl apply -f test.yamlOutput yang diharapkan:
uniteddeployment.apps.kruise.io/sample-ud createdJalankan perintah berikut untuk memeriksa apakah Pod dan StatefulSet telah dibuat:
kubectl get pod # Output yang diharapkan: NAME READY STATUS RESTARTS AGE sample-ud-subset-a-cplwg-0 1/1 Running 0 6m5s sample-ud-subset-b-rj7kt-0 1/1 Running 0 6m4s sample-ud-subset-b-rj7kt-1 1/1 Running 0 5m49s sample-ud-subset-b-rj7kt-2 1/1 Running 0 5m43s sample-ud-subset-c-g6jvx-0 1/1 Running 0 6m5s sample-ud-subset-c-g6jvx-1 1/1 Running 0 5m51s kubectl get statefulset # Output yang diharapkan: NAME READY AGE sample-ud-subset-a-cplwg 1/1 7m34s sample-ud-subset-b-rj7kt 3/3 7m34s sample-ud-subset-c-g6jvx 2/2 7m34sOutput tersebut menunjukkan bahwa Pod dan StatefulSet telah dibuat serta berjalan pada node di Zona A, Zona B, dan Zona C.
Skenario 3: Gunakan pengontrol UnitedDeployment untuk menempatkan aplikasi secara bersamaan pada instans ECS dan ECI
Untuk menangani lonjakan bisnis, Anda mungkin perlu memastikan ketersediaan sumber daya node kluster sekaligus mengendalikan biaya. Untuk mengatasi masalah ini, Anda dapat memprioritaskan instans ECS untuk penjadwalan Pod dan mengonfigurasi Container Service for Kubernetes (ACK) agar secara otomatis menerapkan aplikasi pada ECI ketika instans ECS kehabisan stok. Saat Pod diskalakan-masuk, ACK akan terlebih dahulu menghapus Pod yang berjalan di ECI.
Pada contoh berikut, UnitedDeployment dibuat untuk menunjukkan cara penjadwalan replika. Ketika jumlah replika tidak melebihi 4, replika tersebut dijadwalkan ke instans ECS. Ketika jumlah replika berada di antara 4 hingga 10, Pod tambahan dijadwalkan ke ECI.
Buat file bernama test.yaml dan salin konten berikut ke dalam file tersebut.
Bidang
deploymentTemplatemendefinisikan templat Deployment. UnitedDeployment membuat Deployment pada setiap subset berdasarkan templat tersebut.Bagian
subsetsmendefinisikan dua subset. Pod pada subset pertama dijadwalkan ke instans ECS. Replika pada subset kedua dijadwalkan ke ECI. Subset pertama mendukung hingga empat replika. Ketika jumlah replika yang disediakan oleh UnitedDeployment tidak melebihi 4, replika tersebut dijadwalkan ke instans ECS. Ketika jumlah replika berada di antara 4 hingga 10, Pod tambahan dijadwalkan ke ECI.
apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment metadata: name: ud-nginx spec: replicas: 6 selector: matchLabels: app: sample template: # statefulSetTemplate atau advancedStatefulSetTemplate atau cloneSetTemplate atau deploymentTemplate deploymentTemplate: metadata: labels: app: sample spec: selector: matchLabels: app: sample template: metadata: labels: app: sample spec: containers: - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0 name: nginx resources: requests: cpu: "500m" topology: subsets: - name: ecs maxReplicas: 4 - name: eci maxReplicas: null --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: united-deployment-hpa spec: scaleTargetRef: apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment name: ud-nginx # Ganti nilai ini dengan nama UnitedDeployment. minReplicas: 4 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50Jalankan perintah berikut untuk menerapkan UnitedDeployment:
kubectl apply -f test.yamlOutput yang diharapkan:
horizontalpodautoscaler.autoscaling/united-deployment-hpa createdJalankan perintah berikut untuk menanyakan status Pod:
kubectl get pod -o wide # Output yang diharapkan: NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ud-nginx-eci-dxfbz-864bdb77b-2d4t9 1/1 Running 0 3m9s 192.XX.XX.129 cn-hangzhou.192.XX.XX.120 <none> <none> ud-nginx-eci-dxfbz-864bdb77b-zppfh 1/1 Running 0 3m9s 192.XX.XX.11 cn-hangzhou.192.XX.XX.251 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-5mlgh 1/1 Running 0 3m9s 192.XX.XX.4 cn-hangzhou.192.XX.XX.251 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-6bdkz 1/1 Running 0 3m9s 192.XX.XX.145 cn-hangzhou.192.XX.XX.32 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-dnsfl 1/1 Running 0 3m9s 192.XX.XX.150 cn-hangzhou.192.XX.XX.20 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-mrzwc 1/1 Running 0 3m9s 192.XX.XX.128 cn-hangzhou.192.XX.XX.120 <none> <none>Output tersebut menunjukkan bahwa replika Deployment dijadwalkan secara dinamis berdasarkan kebijakan penjadwalan yang ditentukan oleh UnitedDeployment. Empat replika pertama dijadwalkan ke instans ECS. Dua replika sisanya dijadwalkan ke ECI.
Picu HPA untuk melakukan aktivitas skala-masuk, lalu jalankan perintah berikut untuk menanyakan status Pod:
kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ud-nginx-ecs-5lm7r-868c4ccd5d-5mlgh 1/1 Running 0 8m14s 192.168.8.4 cn-hangzhou.192.168.8.251 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-6bdkz 1/1 Running 0 8m14s 192.168.6.145 cn-hangzhou.192.168.6.32 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-dnsfl 1/1 Running 0 8m14s 192.168.6.150 cn-hangzhou.192.168.6.20 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-mrzwc 1/1 Running 0 8m14s 192.168.5.128 cn-hangzhou.192.168.5.120 <none> <none>Output tersebut menunjukkan bahwa jumlah replika diskalakan-masuk dari 6 menjadi 4. Pod pada ECI dihapus terlebih dahulu.
Referensi
Untuk informasi lebih lanjut tentang cara menambahkan node di beberapa zona selama aktivitas skala keluar, lihat Implementasikan penskalaan cepat lintas beberapa zona.
Untuk mengaktifkan penskalaan otomatis node saat kapasitas sumber daya kluster tidak memenuhi kebutuhan penjadwalan Pod, kami merekomendasikan Anda merujuk ke solusi node scaling yang disediakan oleh ACK. Untuk informasi lebih lanjut, lihat Node scaling.