本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 節點終止處理常式
跨可用區域 Auto Scaling 群組重新平衡
透過 API 或 AWS 管理主控台終止 EC2 執行個體
如果未處理事件,您的應用程式程式碼可能無法正常停止。還可能需要更長的時間才能恢復完整的可用性,或者可能會意外地將工作排程到正在關閉的節點。aws-node-termination-handler
(NTH) 可以在兩種不同的模式下運作:執行個體中繼資料服務 (IMDS) 或佇列處理器。如需有關這兩種模式的詳細資訊,請參閱讀我檔案
此模式會透過持續整合和持續傳遞 (CI/CD) 管線使用佇列處理器來自動部署 NTH。
注意:如果您使用的是 EKS 受管節點群組,則不需要. aws-node-termination-handler
先決條件和限制
先決條件
作用中的 AWS 帳戶
支援與 AWS 管理主控台搭配使用的網頁瀏覽器。請參閱支援的瀏覽器清
單。 已安裝 AWS Cloud Development Kit (AWS CDK)。
kubectl
,已安裝 Kubernetes 命令列工具。eksctl
,已安裝適用於 Amazon 彈性 Kubernetes 服務 (亞馬遜 EKS) 的 AWS Command Line Interface (AWS CLI) (AWS CLI)。具有 1.20 版或更新版本的執行中 EKS 叢集。
連接至 EKS 叢集的自我管理節點群組。若要使用自我管理的節點群組建立 Amazon EKS 叢集,請執行下列命令。
eksctl create cluster --managed=false --region <region> --name <cluster_name>
如需有關的詳細資訊
eksctl
,請參閱 eksctl文件。 適用於您叢集的 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) 供應商。如需詳細資訊,請參閱為叢集建立 IAM OIDC 提供者。
限制
您必須使用支援 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 佇列。](images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)
圖表中顯示的工作流程包含下列高階步驟:
自動調整規模 EC2 執行個體終止事件會傳送至 SQS 佇列。
第 N 個網繭會監控 SQS 佇列中是否有新訊息。
第 N 個網繭會收到新訊息,並執行下列動作:
接上節點,以便新的網繭不會在節點上執行。
排空節點,以便撤除現有的網繭
將生命週期掛接訊號傳送至「Auto Scaling」群組,以便終止節點。
自動化和規模
程式碼由 AWS CDK 管理和部署,並由 AWS CloudFormation 巢狀堆疊提供支援。
Amazon EKS 控制平面可跨多個可用區域執行,以確保高可用性。
工具
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 (安全殼層) 複製存放庫,請執行下列命令。
若要使用 HTTPS 複製存放庫,請執行下列命令。
克隆回購會創建一個名為 切換到該目錄。
| 應用開發人員、AWS DevOps、 DevOps 工程師 |
設定庫貝設定檔案。 | 在終端機中設定 AWS 登入資料,並確認您有權擔任叢集角色。您可以使用下列範例程式碼。
| AWS DevOps、 DevOps 工程師、應用程式開發者 |
任務 | 描述 | 所需技能 |
---|---|---|
設定參數。 | 在
| 應用開發人員、AWS DevOps、 DevOps 工程師 |
建立要部署第 N 個的 CI/CD 管線。 | 執行 setup.sh 指令碼。
該指令碼將部署 AWS CDK 應用程式,該應用程式將根據檔案中的使用者輸入參數,使用範例程式碼、管道和 CodeBuild 專 這個腳本會要求輸入密碼,因為它使用 sudo 命令安裝 npm 軟件包。 | 應用開發人員、AWS DevOps、 DevOps 工程師 |
檢閱 CI/CD 管線。 | 開啟 AWS 管理主控台,並檢閱以下在堆疊中建立的資源。
管線成功執行之後,Helm 發行版 | 應用開發人員、AWS DevOps、 DevOps 工程師 |
任務 | 描述 | 所需技能 |
---|---|---|
模擬「Auto Scaling」群組縮放事件。 | 若要模擬自動縮放縮放事件,請執行下列操作:
| |
檢閱記錄檔。 | 在擴充事件期間,NTH Pod 將會警戒並清空對應的工作節點 (將在擴充事件中終止的 EC2 執行個體)。若要檢查記錄,請使用 [其他資訊] 區段中的程式碼。 | 應用開發人員、AWS DevOps、 DevOps 工程師 |
任務 | 描述 | 所需技能 |
---|---|---|
清理所有 AWS 資源。 | 若要清除此模式所建立的資源,請執行下列命令。
這將通過刪除 CloudFormation 堆棧來清理在此模式中創建的所有資源。 | DevOps 工程師 |
故障診斷
問題 | 解決方案 |
---|---|
npm 登錄未正確設定。 | 在安裝此解決方案期間,指令碼會安裝 npm install 以下載所有必要的套件。如果在安裝期間看到「找不到模組」的訊息,則可能未正確設定 npm 登錄。若要查看目前的登錄設定,請執行下列命令。
若要使用設定登錄
|
延遲 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