

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Otomatiskan penerapan Node Termination Handler di Amazon EKS dengan menggunakan pipeline CI/CD
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline"></a>

*Sandip Gangapadhyay, Sandeep Gawande, Viyoma Sachdeva, Pragtideep Singh, dan John Vargas, Amazon Web Services*

## Ringkasan
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-summary"></a>

**Pemberitahuan**: AWS CodeCommit tidak lagi tersedia untuk pelanggan baru. Pelanggan AWS yang sudah ada CodeCommit dapat terus menggunakan layanan seperti biasa. [Pelajari selengkapnya](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider/)

Di Amazon Web Services (AWS) Cloud, Anda dapat menggunakan [AWS Node Termination Handler](https://github.com/aws/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:
+ [EC2 contoh pemeliharaan terjadwal](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
+ [Gangguan Instans EC2 Spot Amazon](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)
+ [Skala grup Auto Scaling di](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in)
+ [Penyeimbangan ulang grup Auto Scaling di seluruh Availability](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage) 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](https://github.com/aws/aws-node-termination-handler#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](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html), Anda tidak memerlukan`aws-node-termination-handler`.

## Prasyarat dan batasan
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-prereqs"></a>

**Prasyarat**
+ Akun AWS aktif.
+ Browser web yang didukung untuk digunakan dengan AWS Management Console. Lihat [daftar browser yang didukung](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/).
+ AWS Cloud Development Kit (AWS CDK) [diinstal](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install).
+ `kubectl`[, alat baris perintah Kubernetes, diinstal.](https://kubernetes.io/docs/tasks/tools/)
+ `eksctl`[AWS Command Line Interface (AWS CLI), AWS Command Line Interface (AWS CLI) untuk Amazon Elastic Kubernetes Service (Amazon EKS), diinstal.](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html)
+ 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](https://eksctl.io/usage/creating-and-managing-clusters/).
+ Penyedia AWS Identity and Access Management (IAM) OpenID Connect (OIDC) untuk klaster Anda. Untuk informasi selengkapnya, lihat [Membuat penyedia IAM OIDC untuk](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html) klaster Anda.

**Batasan**
+ Anda harus menggunakan Wilayah AWS yang mendukung layanan Amazon EKS.

**Versi produk**
+ Kubernetes versi 1.20 atau yang lebih baru
+ `eksctl`versi 0.107.0 atau yang lebih baru
+ AWS CDK versi 2.27.0 atau yang lebih baru

## Arsitektur
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-architecture"></a>

**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.](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)


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

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

1. NTH Pod memonitor pesan baru dalam antrean SQS.

1. 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](https://docs.aws.amazon.com/eks/latest/userguide/disaster-recovery-resiliency.html) berjalan di beberapa Availability Zone untuk memastikan ketersediaan yang tinggi.
+ [Untuk [penskalaan otomatis](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html), Amazon EKS mendukung Kubernetes [Cluster](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) Autoscaler dan Karpenter.](https://karpenter.sh/)

## Alat
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-tools"></a>

**Layanan AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) adalah kerangka kerja pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan infrastruktur AWS Cloud dalam kode.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) adalah layanan build terkelola penuh yang membantu Anda mengompilasi kode sumber, menjalankan pengujian unit, dan menghasilkan artefak yang siap digunakan.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) adalah layanan kontrol versi yang membantu Anda menyimpan dan mengelola repositori Git secara pribadi, tanpa perlu mengelola sistem kontrol sumber Anda sendiri.
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 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](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) EKS) membantu Anda menjalankan Kubernetes di AWS tanpa perlu menginstal atau memelihara control plane atau node Kubernetes Anda sendiri.
+ [ EC2 Auto Scaling Amazon](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) 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](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)) menyediakan antrian host yang aman, tahan lama, dan tersedia yang membantu Anda mengintegrasikan dan memisahkan sistem dan komponen perangkat lunak terdistribusi.

**Alat lainnya**
+ [kubectl](https://kubernetes.io/docs/reference/kubectl/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](https://github.com/aws-samples/deploy-nth-to-eks)repo 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`— Script yang digunakan untuk membersihkan sumber daya.

Untuk menggunakan kode contoh, ikuti instruksi di bagian *Epik*.

## Praktik terbaik
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-best-practices"></a>

Untuk praktik terbaik saat mengotomatiskan AWS Node Termination Handler, lihat berikut ini:
+ [Panduan Praktik Terbaik EKS](https://aws.github.io/aws-eks-best-practices/)
+ [Handler Terminasi Node - Konfigurasi](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler)

## Epik
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-epics"></a>

### Siapkan lingkungan Anda
<a name="set-up-your-environment"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Kloning repo. | Untuk mengkloning repo dengan menggunakan SSH (Secure Shell), jalankan perintah berikut.<pre>git clone git@github.com:aws-samples/deploy-nth-to-eks.git</pre><br />Untuk mengkloning repo dengan menggunakan HTTPS, jalankan perintah berikut.<pre>git clone https://github.com/aws-samples/deploy-nth-to-eks.git</pre><br />Mengkloning repo membuat folder bernama. `deploy-nth-to-eks`<br />Ubah ke direktori itu.<pre>cd deploy-nth-to-eks</pre> | 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.<pre>aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN></pre> | AWS DevOps, DevOps insinyur, Pengembang aplikasi | 

### Menyebarkan pipa CI/CD
<a name="deploy-the-ci-cd-pipeline"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Siapkan parameternya. | Dalam `config/config.json` file, atur parameter yang diperlukan berikut.[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) | Pengembang aplikasi, AWS DevOps, DevOps insinyur | 
| Buat CI/CD pipeline untuk menyebarkan NTH. | Jalankan skrip setup.sh.<pre>./setup.sh</pre><br />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`<br />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.[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)<br />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 | 

### Uji penyebaran NTH
<a name="test-nth-deployment"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Simulasikan acara skala dalam grup Auto Scaling. | Untuk mensimulasikan event scale-in penskalaan otomatis, lakukan hal berikut:[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) |  | 
| 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 | 

### Bersihkan
<a name="clean-up"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Bersihkan semua sumber daya AWS. | Untuk membersihkan sumber daya yang dibuat oleh pola ini, jalankan perintah berikut.<pre>./uninstall.sh</pre><br />Ini akan membersihkan semua sumber daya yang dibuat dalam pola ini dengan menghapus CloudFormation tumpukan. | DevOps insinyur | 

## Pemecahan masalah
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-troubleshooting"></a>


| 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.<pre>npm config get registry</pre><br />Untuk mengatur registri dengan`https://registry.npmjs.org/`, jalankan perintah berikut.<pre>npm config set registry https://registry.npmjs.org</pre> | 
| 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](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html). | 

## Sumber daya terkait
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-resources"></a>
+ [Kode sumber AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler)
+ [EC2 lokakarya](https://ec2spotworkshops.com/using_ec2_spot_instances_with_eks/070_selfmanagednodegroupswithspot/deployhandler.html)
+ [AWS CodePipeline](https://aws.amazon.com/codepipeline/)
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://aws.amazon.com/eks/)
+ [AWS Cloud Development Kit](https://aws.amazon.com/cdk/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)

## Informasi tambahan
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-additional"></a>

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
```