Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Mengotomatiskan penerapan Node Termination Handler di Amazon EKS dengan menggunakan pipeline CI/CD
Sandip Gangapadhyay, Sandeep Gawande, Viyoma Sachdeva, Pragtideep Singh, dan John Vargas, Amazon Web Services
Ringkasan
Pemberitahuan: AWS CodeCommit tidak lagi tersedia untuk pelanggan baru. Pelanggan AWS yang sudah ada CodeCommit dapat terus menggunakan layanan seperti biasa. Pelajari selengkapnya
Di Amazon Web Services (AWS) Cloud, Anda dapat menggunakan AWS Node Termination Handler
Penyeimbangan ulang grup Auto Scaling di seluruh Availability Zone
EC2 penghentian instans melalui API atau AWS Management Console
Jika suatu peristiwa tidak ditangani, kode aplikasi Anda mungkin tidak berhenti dengan baik. Mungkin juga perlu waktu lebih lama untuk memulihkan ketersediaan penuh, atau mungkin secara tidak sengaja menjadwalkan pekerjaan ke node yang turun. NTH dapat beroperasi dalam dua mode yang berbeda: Instance Metadata Service (IMDS) atau Queue Processor. aws-node-termination-handler Untuk informasi lebih lanjut tentang dua mode, lihat file Readme
Pola ini menggunakan AWS CodeCommit, dan mengotomatiskan penyebaran NTH dengan menggunakan Prosesor Antrian melalui pipeline continuous integration and continuous delivery (CI/CD).
catatan
Jika Anda menggunakan grup simpul terkelola EKS, Anda tidak memerlukanaws-node-termination-handler.
Prasyarat dan batasan
Prasyarat
Akun AWS yang aktif.
Browser web yang didukung untuk digunakan dengan AWS Management Console. Lihat daftar browser yang didukung
. AWS Cloud Development Kit (AWS CDK) diinstal.
Kluster EKS yang berjalan dengan versi 1.20 atau yang lebih baru.
Grup node yang dikelola sendiri yang melekat pada cluster EKS. Untuk membuat klaster Amazon EKS dengan grup node yang dikelola sendiri, jalankan perintah berikut.
eksctl create cluster --managed=false --region <region> --name <cluster_name>Untuk informasi lebih lanjut tentang
eksctl, lihat dokumentasi eksctl. Penyedia AWS Identity and Access Management (IAM) OpenID Connect (OIDC) AWS Identity and Access Management (IAM) untuk klaster Anda. Untuk informasi selengkapnya, lihat Membuat penyedia IAM OIDC untuk klaster Anda.
Batasan
Anda harus menggunakan Wilayah AWS yang mendukung layanan Amazon EKS.
Versi produk
Kubernetes versi 1.20 atau yang lebih baru
eksctlversi 0.107.0 atau yang lebih baruAWS CDK versi 2.27.0 atau yang lebih baru
Arsitektur
Tumpukan teknologi target
Awan pribadi virtual (VPC)
Kluster EKS
Amazon Simple Queue Service (Amazon SQS)
IAM
Kubernetes
Arsitektur target
Diagram berikut menunjukkan tampilan tingkat tinggi dari end-to-end langkah-langkah ketika penghentian node dimulai.

Alur kerja yang ditunjukkan dalam diagram terdiri dari langkah-langkah tingkat tinggi berikut:
Peristiwa penghentian EC2 instance penskalaan otomatis dikirim ke antrian SQS.
NTH Pod memonitor pesan baru dalam antrean SQS.
NTH Pod menerima pesan baru dan melakukan hal berikut:
Cordons node sehingga pod baru tidak berjalan pada node.
Menguras node, sehingga pod yang ada dievakuasi
Mengirim sinyal hook siklus hidup ke grup Auto Scaling sehingga node dapat dihentikan.
Otomatisasi dan skala
Kode dikelola dan diterapkan oleh AWS CDK, didukung oleh tumpukan CloudFormation bersarang AWS.
Pesawat kontrol Amazon EKS berjalan di beberapa Availability Zone untuk memastikan ketersediaan yang tinggi.
Untuk penskalaan otomatis, Amazon EKS mendukung Kubernetes Cluster
Autoscaler dan Karpenter.
Alat
Layanan AWS
AWS Cloud Development Kit (AWS CDK) adalah kerangka kerja pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan infrastruktur AWS Cloud dalam kode.
AWS CodeBuild adalah layanan build terkelola penuh yang membantu Anda mengompilasi kode sumber, menjalankan pengujian unit, dan menghasilkan artefak yang siap digunakan.
AWS CodeCommit adalah layanan kontrol versi yang membantu Anda menyimpan dan mengelola repositori Git secara pribadi, tanpa perlu mengelola sistem kontrol sumber Anda sendiri.
AWS CodePipeline membantu Anda memodelkan dan mengonfigurasi berbagai tahapan rilis perangkat lunak dengan cepat dan mengotomatiskan langkah-langkah yang diperlukan untuk merilis perubahan perangkat lunak secara terus menerus.
Amazon Elastic Kubernetes Service (Amazon EKS) membantu Anda menjalankan Kubernetes di AWS tanpa perlu menginstal atau memelihara control plane atau node Kubernetes Anda sendiri.
EC2 Auto Scaling Amazon membantu Anda menjaga ketersediaan aplikasi dan memungkinkan Anda menambahkan atau menghapus EC2 instans Amazon secara otomatis sesuai dengan kondisi yang Anda tentukan.
Amazon Simple Queue Service (Amazon Simple Queue Service) menyediakan antrian host yang aman, tahan lama, dan tersedia yang membantu Anda mengintegrasikan dan memisahkan sistem dan komponen perangkat lunak terdistribusi.
Alat-alat lainnya
kubectl
adalah alat baris perintah Kubernetes untuk menjalankan perintah terhadap klaster Kubernetes. Anda dapat menggunakan kubectl untuk menyebarkan aplikasi, memeriksa dan mengelola sumber daya klaster, dan melihat log.
Kode
Kode untuk pola ini tersedia di deploy-nth-to-eks
nth folder— Bagan Helm, file nilai, dan skrip untuk memindai dan menerapkan CloudFormation template AWS untuk Node Termination Handler.config/config.json— File parameter konfigurasi untuk aplikasi. File ini berisi semua parameter yang diperlukan untuk CDK untuk digunakan.cdk— Kode sumber AWS CDK.setup.sh— Skrip yang digunakan untuk menyebarkan aplikasi AWS CDK untuk membuat CI/CD pipeline yang diperlukan dan sumber daya lain yang diperlukan.uninstall.sh— Skrip yang digunakan untuk membersihkan sumber daya.
Untuk menggunakan kode contoh, ikuti instruksi di bagian Epik.
Praktik terbaik
Untuk praktik terbaik saat mengotomatiskan AWS Node Termination Handler, lihat berikut ini:
Epik
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Kloning repo. | Untuk mengkloning repo dengan menggunakan SSH (Secure Shell), jalankan perintah berikut.
Untuk mengkloning repo dengan menggunakan HTTPS, jalankan perintah berikut.
Mengkloning repo membuat folder bernama. Ubah ke direktori itu.
| Pengembang aplikasi, AWS DevOps, DevOps insinyur |
Atur file kubeconfig. | Tetapkan kredensi AWS Anda di terminal dan konfirmasikan bahwa Anda memiliki hak untuk mengambil peran klaster. Anda dapat menggunakan kode contoh berikut.
| AWS DevOps, DevOps insinyur, Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Siapkan parameternya. | Dalam
| Pengembang aplikasi, AWS DevOps, DevOps insinyur |
Buat CI/CD pipeline untuk menyebarkan NTH. | Jalankan skrip setup.sh.
Skrip akan menerapkan aplikasi AWS CDK yang akan membuat CodeCommit repo dengan kode contoh, pipeline, dan CodeBuild proyek berdasarkan parameter input pengguna dalam file. Skrip ini akan meminta kata sandi saat menginstal paket npm dengan perintah sudo. | Pengembang aplikasi, AWS DevOps, DevOps insinyur |
Tinjau CI/CD pipa. | Buka AWS Management Console, dan tinjau sumber daya berikut yang dibuat di tumpukan.
Setelah pipeline berjalan dengan sukses, rilis Helm | Pengembang aplikasi, AWS DevOps, DevOps insinyur |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Simulasikan acara skala dalam grup Auto Scaling. | Untuk mensimulasikan event scale-in penskalaan otomatis, lakukan hal berikut:
| |
Tinjau log. | Selama peristiwa scale-in, Pod NTH akan mengikat dan menguras node pekerja yang sesuai ( EC2 instance yang akan dihentikan sebagai bagian dari peristiwa scale-in). Untuk memeriksa log, gunakan kode di bagian Informasi tambahan. | Pengembang aplikasi, AWS DevOps, DevOps insinyur |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Bersihkan semua sumber daya AWS. | Untuk membersihkan sumber daya yang dibuat oleh pola ini, jalankan perintah berikut.
Ini akan membersihkan semua sumber daya yang dibuat dalam pola ini dengan menghapus CloudFormation tumpukan. | DevOps insinyur |
Pemecahan Masalah
| Isu | Solusi |
|---|---|
Registri npm tidak disetel dengan benar. | Selama instalasi solusi ini, skrip menginstal npm install untuk mengunduh semua paket yang diperlukan. Jika, selama instalasi, Anda melihat pesan yang mengatakan “Tidak dapat menemukan modul,” registri npm mungkin tidak disetel dengan benar. Untuk melihat pengaturan registri saat ini, jalankan perintah berikut.
Untuk mengatur registri dengan
|
Tunda pengiriman pesan SQS. | Sebagai bagian dari pemecahan masalah Anda, jika Anda ingin menunda pengiriman pesan SQS ke NTH Pod, Anda dapat menyesuaikan parameter penundaan pengiriman SQS. Untuk informasi selengkapnya, lihat antrian penundaan Amazon SQS. |
Sumber daya terkait
Informasi tambahan
1. Temukan nama NTH Pod.
kubectl get pods -n kube-system |grep aws-node-termination-handler aws-node-termination-handler-65445555-kbqc7 1/1 Running 0 26m kubectl get pods -n kube-system |grep aws-node-termination-handler aws-node-termination-handler-65445555-kbqc7 1/1 Running 0 26m
2. Periksa log. Contoh log terlihat seperti berikut ini. Ini menunjukkan bahwa node telah dikepung dan dikeringkan sebelum mengirim sinyal penyelesaian kait siklus hidup grup Auto Scaling.
kubectl -n kube-system logs aws-node-termination-handler-65445555-kbqc7 022/07/17 20:20:43 INF Adding new event to the event store event={"AutoScalingGroupName":"eksctl-my-cluster-target-nodegroup-ng-10d99c89-NodeGroup-ZME36IGAP7O1","Description":"ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n","EndTime":"0001-01-01T00:00:00Z","EventID":"asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564","InProgress":false,"InstanceID":"i-0409f2a9d3085b80e","IsManaged":true,"Kind":"SQS_TERMINATE","NodeLabels":null,"NodeName":"ip-192-168-75-60.us-east-2.compute.internal","NodeProcessed":false,"Pods":null,"ProviderID":"aws:///us-east-2c/i-0409f2a9d3085b80e","StartTime":"2022-07-17T20:20:42.702Z","State":""} 2022/07/17 20:20:44 INF Requesting instance drain event-id=asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564 instance-id=i-0409f2a9d3085b80e kind=SQS_TERMINATE node-name=ip-192-168-75-60.us-east-2.compute.internal provider-id=aws:///us-east-2c/i-0409f2a9d3085b80e 2022/07/17 20:20:44 INF Pods on node node_name=ip-192-168-75-60.us-east-2.compute.internal pod_names=["aws-node-qchsw","aws-node-termination-handler-65445555-kbqc7","kube-proxy-mz5x5"] 2022/07/17 20:20:44 INF Draining the node 2022/07/17 20:20:44 ??? WARNING: ignoring DaemonSet-managed Pods: kube-system/aws-node-qchsw, kube-system/kube-proxy-mz5x5 2022/07/17 20:20:44 INF Node successfully cordoned and drained node_name=ip-192-168-75-60.us-east-2.compute.internal reason="ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n" 2022/07/17 20:20:44 INF Completed ASG Lifecycle Hook (NTH-K8S-TERM-HOOK) for instance i-0409f2a9d3085b80e