使用 CI/CD 管道,在 Amazon EKS 中自動部署節點終止處理程式 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 CI/CD 管道,在 Amazon EKS 中自動部署節點終止處理程式

由桑迪普甘加帕迪伊 (AWS)、約翰·瓦爾加斯 (AWS)、實務迪普·辛格 (AWS)、桑迪普·加萬德 (AWS) 和維約瑪薩克德瓦 (AWS) 所建立

程式碼儲存庫:NTH 部署至 EKS

環境:生產

技術:容器和微服務; DevOps

AWS 服務:AWS CodePipeline;Amazon EKS;AWS CodeBuild

Summary

在 Amazon Web Services (AWS) 雲端上,您可以使用 AWS 節點終止處理常式 (一種開放原始碼專案),以適當的方式處理 Kubernetes 內的 Amazon 彈性運算雲端 (Amazon EC2) 執行個體關閉。AWS 節點終止處理常式可協助確保 Kubernetes 控制平面能適當回應可能導致 EC2 執行個體無法使用的事件。此類事件包括以下內容:

如果未處理事件,您的應用程式程式碼可能無法正常停止。還可能需要更長的時間才能恢復完整的可用性,或者可能會意外地將工作排程到正在關閉的節點。aws-node-termination-handler(NTH) 可以在兩種不同的模式下運作:執行個體中繼資料服務 (IMDS) 或佇列處理器。如需有關這兩種模式的詳細資訊,請參閱讀我檔案

此模式會透過持續整合和持續傳遞 (CI/CD) 管線使用佇列處理器來自動部署 NTH。

注意:如果您使用的是 EKS 受管節點群組,則不需要. aws-node-termination-handler

先決條件和限制

先決條件

限制

  • 您必須使用支援 Amazon EKS 服務的 AWS 區域。

產品版本

  • 庫伯尼特斯版本 1.20 或更新版本

  • eksctl版本 0.107.0 或更新版本

  • AWS CDK 版本 2.27.0 或更新版本

架構

目標技術堆疊

  • 虛擬私有雲 (VPC)

  • 一個 EKS 叢集

  • Amazon Simple Queue Service (Amazon SQS)

  • IAM

  • Kubernetes

目標架構

下圖顯示節點終止啟動時 end-to-end 步驟的高階檢視。

具有 Auto Scaling 群組的 VPC、具有節點終止處理常式的 EKS 叢集,以及 SQS 佇列。

圖表中顯示的工作流程包含下列高階步驟:

  1. 自動調整規模 EC2 執行個體終止事件會傳送至 SQS 佇列。

  2. 第 N 個網繭會監控 SQS 佇列中是否有新訊息。

  3. 第 N 個網繭會收到新訊息,並執行下列動作:

    • 接上節點,以便新的網繭不會在節點上執行。

    • 排空節點,以便撤除現有的網繭

    • 將生命週期掛接訊號傳送至「Auto Scaling」群組,以便終止節點。

自動化和規模

  • 程式碼由 AWS CDK 管理和部署,並由 AWS CloudFormation 巢狀堆疊提供支援。

  • Amazon EKS 控制平面可跨多個可用區域執行,以確保高可用性。

  • 對於自動擴展,Amazon EKS 支援 Kubernetes 叢集自動配置器和卡彭特器。

工具

AWS 服務

  • AWS Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。

  • AWS CodeBuild 是全受管的建置服務,可協助您編譯原始程式碼、執行單元測試,以及產生準備好部署的成品。

  • AWS CodeCommit 是一種版本控制服務,可協助您以私密方式存放和管理 Git 儲存庫,而無需管理自己的原始檔控制系統。

  • AWS 可 CodePipeline協助您快速建模和設定軟體發行的不同階段,並自動執行持續發行軟體變更所需的步驟。

  • Amazon Elastic Kubernetes Service (Amazon EKS) 可協助您在 AWS 上執行 Kubernetes,而無需安裝或維護自己的 Kubernetes 控制平面或節點。

  • Amazon EC2 Auto Scaling 可協助您維持應用程式的可用性,並允許您根據定義的條件自動新增或移除 Amazon EC2 執行個體。

  • Amazon Simple Queue Service (Amazon SQS) 提供安全、耐用且可用的託管佇列,可協助您整合和分離分散式軟體系統和元件。

其他工具

  • kubectl 是一種 Kubernetes 命令列工具,可針對 Kubernetes 叢集執行命令。您可以使用 kubectl 部署應用程式、檢查和管理叢集資源,以及檢視記錄。

Code

此模式的代碼可在 GitHub .com 上的deploy-nth-to-eks回購中獲得。代碼存儲庫包含以下文件和文件夾。

  • nth folder— Helm 圖表、值檔案和用於掃描和部署節點終止處理常式 AWS CloudFormation 範本的指令碼。

  • config/config.json— 應用程式的組態參數檔案。此檔案包含要部署的 CDK 所需的所有參數。

  • cdk— AWS CDK 原始程式碼。

  • setup.sh— 用於部署 AWS CDK 應用程式以建立所需 CI/CD 管道和其他必要資源的指令碼。

  • uninstall.sh— 用於清理資源的指令碼。

要使用示例代碼,請按照 Epics 部分中的說明進行操作。

最佳實務

如需自動化 AWS 節點終止處理常式時的最佳實務,請參閱下列內容:

史诗

任務描述所需技能

克隆回購。

若要使用 SSH (安全殼層) 複製存放庫,請執行下列命令。

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

若要使用 HTTPS 複製存放庫,請執行下列命令。

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

克隆回購會創建一個名為deploy-nth-to-eks.

切換到該目錄。

cd deploy-nth-to-eks
應用開發人員、AWS DevOps、 DevOps 工程師

設定庫貝設定檔案。

在終端機中設定 AWS 登入資料,並確認您有權擔任叢集角色。您可以使用下列範例程式碼。

aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN>
AWS DevOps、 DevOps 工程師、應用程式開發者
任務描述所需技能

設定參數。

config/config.json檔案中,設定下列必要參數。

  • pipelineName:要由 AWS CDK 建立的 CI/CD 管線名稱 (例如,)。deploy-nth-to-eks-pipelineAWS CodePipeline 將建立具有此名稱的管道。

  • repositoryName:要建立的 AWS CodeCommit 存放庫 (例如,deploy-nth-to-eks-repo)。AWS CDK 會建立此存放庫,並將其設定為 CI/CD 管道的來源。

    注意:此解決方案將創建此 CodeCommit 回購和分支(在以下 branch 參數中提供)。

  • branch:存儲庫中的分支名稱(例如,main)。對此分支的提交將啟動 CI/CD 管線。

  • cfn_scan_script:用來掃描 AWS CloudFormation 範本是否有 NTH (scan.sh) 的指令碼路徑。此指令碼存在於將成為 AWS 存 CodeCommit 放庫一部分的nth資料夾中。

  • cfn_deploy_script:用於部署 NTH 之 AWS CloudFormation 範本的指令碼路徑 (installApp.sh)。

  • stackName:要部署的 CloudFormation 堆疊名稱。

  • eksClusterName:現有 EKS 叢集的名稱。

  • eksClusterRole:將用來存取所有 Kubernetes API 呼叫之 EKS 叢集的 IAM 角色 (例如,)。clusteradmin通常會在中新增此角色aws-authConfigMap

  • create_cluster_role:若要建立 eksClusterRole IAM 角色,請輸入 yes。如果您要在eksClusterRole參數中提供現有的叢集角色,請輸入 no

  • create_iam_oidc_provider:若要為您的叢集建立 IAM OIDC 提供者,請輸入 yes。如果 IAM OIDC 提供者已存在,請輸入否。如需詳細資訊,請參閱為叢集建立 IAM OIDC 提供者

  • AsgGroupName: 屬於 EKS 叢集一部分的「Auto Scaling 例」群組名稱的逗號分隔清單 (例如)。ASG_Group_1,ASG_Group_2

  • region:叢集所在的 AWS 區域名稱 (例如,us-east-2)。

  • install_cdk:如果機器上目前未安裝 AWS CDK,請輸入 yes。執行命cdk --version令以檢查已安裝的 AWS CDK 版本是否為 2.27.0 或更新版本。在這種情況下,請輸入 no

    如果您輸入 yes,setup.sh 指令碼會執行命sudo npm install -g cdk@2.27.0令,在機器上安裝 AWS CDK。該腳本需要 sudo 權限,因此請在出現提示時提供帳戶密碼。

應用開發人員、AWS DevOps、 DevOps 工程師

建立要部署第 N 個的 CI/CD 管線。

執行 setup.sh 指令碼。

./setup.sh

該指令碼將部署 AWS CDK 應用程式,該應用程式將根據檔案中的使用者輸入參數,使用範例程式碼、管道和 CodeBuild 專config/config.json案來建立 CodeCommit 存放庫。

這個腳本會要求輸入密碼,因為它使用 sudo 命令安裝 npm 軟件包。

應用開發人員、AWS DevOps、 DevOps 工程師

檢閱 CI/CD 管線。

開啟 AWS 管理主控台,並檢閱以下在堆疊中建立的資源。

  • CodeCommit 回購與文nth件夾的內容

  • AWS CodeBuild 專案cfn-scan,將掃描 CloudFormation 範本中是否有漏洞。

  • CodeBuild 專案Nth-Deploy,該專案將透過 AWS CodePipeline 管道部署 AWS CloudFormation 範本和對應的 NTH Helm 圖表。

  • 部署 NTH 的 CodePipeline 管道。

管線成功執行之後,Helm 發行版aws-node-termination-handler本會安裝在 EKS 叢集中。此外,名為的 Pod aws-node-termination-handler 正在叢集的kube-system命名空間中執行。

應用開發人員、AWS DevOps、 DevOps 工程師
任務描述所需技能

模擬「Auto Scaling」群組縮放事件。

若要模擬自動縮放縮放事件,請執行下列操作:

  1. 在 AWS 主控台上,開啟 EC2 主控台,然後選擇 Auto Scaling 群組。

  2. 選取與中提供的名稱相同的「Auto Scaling」群組config/config.json,然後選擇「編輯」。

  3. 所需容量和最小容量減少 1。

  4. 選擇更新

檢閱記錄檔。

在擴充事件期間,NTH Pod 將會警戒並清空對應的工作節點 (將在擴充事件中終止的 EC2 執行個體)。若要檢查記錄,請使用 [其他資訊] 區段中的程式碼。

應用開發人員、AWS DevOps、 DevOps 工程師
任務描述所需技能

清理所有 AWS 資源。

若要清除此模式所建立的資源,請執行下列命令。

./uninstall.sh

這將通過刪除 CloudFormation 堆棧來清理在此模式中創建的所有資源。

DevOps 工程師

故障診斷

問題解決方案

npm 登錄未正確設定。

在安裝此解決方案期間,指令碼會安裝 npm install 以下載所有必要的套件。如果在安裝期間看到「找不到模組」的訊息,則可能未正確設定 npm 登錄。若要查看目前的登錄設定,請執行下列命令。

npm config get registry

若要使用設定登錄https://registry.npmjs.org/,請執行下列命令。

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

延遲 SQS 訊息傳遞。

做為疑難排解的一部分,如果您想要延遲 SQS 郵件傳遞至 NTH Pod,您可以調整 SQS 傳遞延遲參數。如需詳細資訊,請參閱 Amazon SQS 延遲佇列

相關資源

其他資訊

1. 找到第 N 個網繭名稱。

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. 檢查日誌。範例記錄檔如下所示。這表明節點在發送 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