Mengotomatiskan penerapan Node Termination Handler di Amazon EKS dengan menggunakan pipeline CI/CD - AWS Prescriptive Guidance

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, sebuah project open-source, untuk menangani shutdown instans Amazon Elastic Compute Cloud (Amazon EC2) di Kubernetes dengan anggun. AWS Node Termination Handler membantu memastikan bahwa control plane Kubernetes merespons dengan tepat peristiwa yang dapat menyebabkan instans Anda menjadi tidak tersedia. EC2 Peristiwa tersebut meliputi:

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

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 baru

  • AWS 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.

VPC dengan grup Auto Scaling, cluster EKS dengan Node Termination Handler, dan antrean SQS.

Alur kerja yang ditunjukkan dalam diagram terdiri dari langkah-langkah tingkat tinggi berikut:

  1. Peristiwa penghentian EC2 instance penskalaan otomatis dikirim ke antrian SQS.

  2. NTH Pod memonitor pesan baru dalam antrean SQS.

  3. 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-eksrepo di GitHub .com. Kode repo berisi file dan folder berikut.

  • 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

TugasDeskripsiKeterampilan yang dibutuhkan

Kloning repo.

Untuk mengkloning repo dengan menggunakan SSH (Secure Shell), jalankan perintah berikut.

git clone git@github.com:aws-samples/deploy-nth-to-eks.git

Untuk mengkloning repo dengan menggunakan HTTPS, jalankan perintah berikut.

git clone https://github.com/aws-samples/deploy-nth-to-eks.git

Mengkloning repo membuat folder bernama. deploy-nth-to-eks

Ubah ke direktori itu.

cd deploy-nth-to-eks
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 eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN>
AWS DevOps, DevOps insinyur, Pengembang aplikasi
TugasDeskripsiKeterampilan yang dibutuhkan

Siapkan parameternya.

Dalam config/config.json file, atur parameter yang diperlukan berikut.

  • pipelineName: Nama CI/CD pipeline yang akan dibuat oleh AWS CDK (misalnya,deploy-nth-to-eks-pipeline). AWS CodePipeline akan membuat pipeline yang memiliki nama ini.

  • repositoryName: CodeCommit Repo AWS yang akan dibuat (misalnya,deploy-nth-to-eks-repo). AWS CDK akan membuat repo ini dan mengaturnya sebagai sumber untuk pipeline. CI/CD

    catatan

    Solusi ini akan membuat CodeCommit repo ini dan cabang (disediakan dalam parameter cabang berikut).

  • branch: Nama cabang di repo (misalnya,main). Komit untuk cabang ini akan memulai CI/CD pipeline.

  • cfn_scan_script: Jalur skrip yang akan digunakan untuk memindai CloudFormation template AWS untuk NTH (scan.sh). Skrip ini ada di nth folder yang akan menjadi bagian dari CodeCommit repo AWS.

  • cfn_deploy_script: Jalur skrip yang akan digunakan untuk menyebarkan CloudFormation template AWS untuk NTH ()installApp.sh.

  • stackName: Nama CloudFormation tumpukan yang akan digunakan.

  • eksClusterName: Nama cluster EKS yang ada.

  • eksClusterRole: Peran IAM yang akan digunakan untuk mengakses kluster EKS untuk semua panggilan API Kubernetes (misalnya,). clusteradmin Biasanya, peran ini ditambahkan aws-authConfigMap.

  • create_cluster_role: Untuk membuat peran eksClusterRole IAM, masukkan ya. Jika Anda ingin memberikan peran cluster yang ada dalam eksClusterRole parameter, masukkan no.

  • create_iam_oidc_provider: Untuk membuat penyedia IAM OIDC untuk klaster Anda, masukkan ya. Jika penyedia IAM OIDC sudah ada, masukkan no. Untuk informasi selengkapnya, lihat Membuat penyedia IAM OIDC untuk klaster Anda.

  • AsgGroupName: Daftar nama grup Auto Scaling yang dipisahkan koma yang merupakan bagian dari kluster EKS (misalnya,). ASG_Group_1,ASG_Group_2

  • region: Nama Wilayah AWS tempat cluster berada (misalnya,us-east-2).

  • install_cdk: Jika AWS CDK saat ini tidak diinstal pada mesin, masukkan ya. Jalankan cdk --version perintah untuk memeriksa apakah versi AWS CDK yang diinstal adalah 2.27.0 atau yang lebih baru. Dalam hal ini, masukkan no.

    Jika Anda memasukkan ya, skrip setup.sh akan menjalankan sudo npm install -g cdk@2.27.0 perintah untuk menginstal AWS CDK pada mesin. Skrip memerlukan izin sudo, jadi berikan kata sandi akun saat diminta.

Pengembang aplikasi, AWS DevOps, DevOps insinyur

Buat CI/CD pipeline untuk menyebarkan NTH.

Jalankan skrip setup.sh.

./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. config/config.json

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.

  • CodeCommit repo dengan isi folder nth

  • CodeBuild Proyek AWScfn-scan, yang akan memindai CloudFormation template untuk mencari kerentanan.

  • CodeBuild projectNth-Deploy, yang akan menerapkan CloudFormation template AWS dan bagan NTH Helm yang sesuai melalui pipeline AWS. CodePipeline

  • CodePipeline Pipa untuk menyebarkan NTH.

Setelah pipeline berjalan dengan sukses, rilis Helm aws-node-termination-handler diinstal di cluster EKS. Juga, sebuah Pod bernama aws-node-termination-handler sedang berjalan di kube-system namespace di cluster.

Pengembang aplikasi, AWS DevOps, DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Simulasikan acara skala dalam grup Auto Scaling.

Untuk mensimulasikan event scale-in penskalaan otomatis, lakukan hal berikut:

  1. Di konsol AWS, buka EC2 konsol, dan pilih Grup Auto Scaling.

  2. Pilih grup Auto Scaling yang memiliki nama yang sama dengan yang disediakanconfig/config.json, dan pilih Edit.

  3. Kurangi Kapasitas yang Diinginkan dan Minimum sebesar 1.

  4. Pilih Perbarui.

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
TugasDeskripsiKeterampilan yang dibutuhkan

Bersihkan semua sumber daya AWS.

Untuk membersihkan sumber daya yang dibuat oleh pola ini, jalankan perintah berikut.

./uninstall.sh

Ini akan membersihkan semua sumber daya yang dibuat dalam pola ini dengan menghapus CloudFormation tumpukan.

DevOps insinyur

Pemecahan Masalah

IsuSolusi

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.

npm config get registry

Untuk mengatur registri denganhttps://registry.npmjs.org/, jalankan perintah berikut.

npm config set registry https://registry.npmjs.org

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