翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
CI/CD パイプラインを使用して Amazon EKS へのノード終了ハンドラーのデプロイを自動化する
Sandip Gangapadhyay (AWS)、John Vargas (AWS)、Pragtideep Singh (AWS)、Sandeep Gawande (AWS)、Viyoma Sachdeva (AWS) によって作成されました
コードリポジトリ: NTH を EKS にデプロイ | 環境:本稼働 | テクノロジー: コンテナとマイクロサービス DevOps |
AWS サービス: AWS CodePipeline、Amazon EKS、AWS CodeBuild |
[概要]
Amazon Web Services (AWS) クラウドでは、オープンソースプロジェクトの「AWS Node Termination Handler
アベイラビリティーゾーン間の 「Auto Scaling グループのリバランシング」
API または AWS マネジメントコンソールによる EC2 インスタンスの終了
イベントが処理されないと、アプリケーションコードが正常に停止しない可能性があります。また、完全な可用性を回復するまでに時間がかかったり、ダウンしているノードに誤って作業をスケジューリングしてしまうこともあります。aws-node-termination-handler
(NTH) は、インスタンスメタデータサービス (IMDS) とキュープロセッサの 2 つの異なるモードで動作できます。二つのノードについての詳細情報については、「Readme ファイル
このパターンでは、継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインを通じてキュープロセッサを使用して、NTHのデプロイを自動化します。
注:「EKS マネージドノードグループ」を使用している場合は、aws-node-termination-handler
は必要ありません。
前提条件と制限
前提条件
アクティブな AWS アカウント。
AWS マネジメントコンソールでの使用がサポートされているウェブブラウザ。「サポートされるブラウザのリスト
」を参照してください。 「インストール済み」の AWS Cloud Development Kit (AWS CDK)
kubectl
、Kubernetes コマンドラインツールが 「インストール」されています。 eksctl
、Amazon Elastic Kubernetes Service (Amazon EKS) の AWS コマンドラインインターフェイス (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 プロバイダーを作成する」を参照してください。
制約事項
Amazon EKS サービスをサポートする AWS リージョンを使用する必要があります。
製品バージョン
Kubernetes バージョン 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 キューに送信されます。
NTH ポッドは SQS キュー内の新しいメッセージを監視します。
NTH ポッドは新しいメッセージを受信し、以下を実行します。
新しいポッドがノード上で実行されないように、ノードをコード化します。
ノードをドレインし、既存のポッドを退避させます。
ライフサイクルフックシグナルを 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 を使用して、アプリケーションのデプロイ、クラスターリソースの検査と管理、ログの表示を行うことができます。
コード
このパターンのコードは、.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
— リソースをクリーンアップするために使用されるスクリプト。
例のコードを使用するには、エピックセクションの指示に従います。
ベストプラクティス
AWS ノード終了ハンドラーを自動化する際のベストプラクティスについては、以下を参照してください。
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
リポジトリを変更します。 | SSH (セキュアシェル) を使用してリポジトリをクローンするには、以下のコマンドを実行します。
HTTPSを使用して、リポジトリを複製して、以下のコマンドを実行します。
リポジトリを複製すると、 そのディレクトリに変更します。
| アプリ開発者、AWS DevOps、 DevOps エンジニア |
kubeconfig ファイルを設定します。 | ターミナルで AWS 認証情報を設定し、クラスターロールを引き受ける権限があることを確認します。次の例のコードを使用できます。
| AWS DevOps、 DevOps エンジニア、アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
パラメータをセットアップします。 |
| アプリ開発者、AWS DevOps、 DevOps エンジニア |
NTH をデプロイする CI/CD パイプラインを作成します。 | setup.sh スクリプトを実行します。
このスクリプトは AWS CDK アプリケーションをデプロイし、 このスクリプトは sudo コマンドで npm パッケージをインストールする際にパスワードを要求します。 | アプリ開発者、AWS DevOps、 DevOps エンジニア |
CI/CD パイプラインを確認します。 | AWS マネジメントコンソールを開き、スタックに作成された以下のリソースを確認します。
パイプラインが正常に実行された後、Helm release | アプリ開発者、AWS DevOps、 DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
Auto Scaling グループのスケールインイベントをシミュレートします。 | 自動スケーリングスケールインイベントをシミュレートするには、以下を実行します。
| |
ログを見直します。 | スケールインイベント中、NTH ポッドは対応するワーカーノード (スケールインイベントの一部として終了する EC2 インスタンス) をコードオンしてドレインします。ログを確認するには、追加情報セクションのコードを使用してください。 | アプリ開発者、AWS DevOps、 DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
すべての AWS リソースをクリーンアップします。 | このパターンで作成されたリソースをクリーンアップするには、以下のコマンドを実行します。
これにより、 CloudFormation スタックを削除することで、このパターンで作成されたすべてのリソースがクリーンアップされます。 | DevOps エンジニア |
トラブルシューティング
問題 | ソリューション |
---|---|
npm レジストリが正しく設定されていません。 | このソリューションのインストール中、スクリプトは npm install をインストールして、必要なパッケージをすべてダウンロードします。インストール中に「モジュールが見つかりません」というメッセージが表示された場合は、npm レジストリが正しく設定されていない可能性があります。以下のコマンドを実行して、現在のレジストリ設定を確認します。
以下のコマンドを実行して、
|
SQS メッセージの配信を遅らせる。 | トラブルシューティングの一環として、NTH ポッドへの SQS メッセージ配信を遅延させたい場合は、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