Amazon Web Services ブログ
Cluster API と Argo CD を用いた Kubernetes マルチクラスター管理
この記事は Multi-cluster management for Kubernetes with Cluster API and Argo CD (記事公開日: 2022 年 11 月 1 日) を翻訳したものです。
イントロダクション
お客様は、スケーラビリティと費用対効果を求めてクラウドに移行しています。また、中には Kubernetes を採用してワークロードをモダナイズすることで、よりアジャイルな方法で反復作業をおこない、市場投入までの時間が短いサービスや製品機能を顧客に提供しようとしている企業もあります。管理すべきクラスターの数が増えるにつれ、お客様は Kubernetes クラスターを管理するための様々なデプロイの仕組みや API (Application Programming Interface) と格闘しています。異なる形式で実行されているクラスターを作成し管理するために、別々のツールを使用するのではなく、より一元的なアプローチが求められています。この記事では、Cluster API と Argo CD を組み合わせて、複数の Kubernetes クラスターのデプロイと運用を効率化する方法を紹介します。
Cluster API とはなにか?
Cluster API は Kubernetes の宣言的な管理を実現するプロジェクトです。API を使用してクラスターの作成、設定、更新を簡単におこなうことができます。2021 年 10 月、Cloud Native Computing Foundation (CNCF) は、Cluster API v1.0 がプロダクションレディであること、その採用の拡大、機能の成熟、コミュニティと包括的なイノベーションへの強いコミットメントを発表しました。
オープンソースコミュニティによってメンテナンスされている Cluster API Provider for aws (CAPA) は、SIG Cluster Lifecycle のプロジェクトです。AWS でのインフラストラクチャのプロビジョニングをハンドリングすることで、Kubernetes クラスターのデプロイやアップグレードをおこなうことができます。CAPA を使用すると、Amazon EC2 ベース、および Amazon EKS ベースの Kubernetes クラスターをプロビジョニングできます。この記事では、Amazon EC2 上でセルフマネージドで動作する Kubernetes クラスターと Amazon EKS で動作するクラスターのどちらかを操作する必要があるという、マルチクラスターのシナリオをシミュレートするために、その両方をカバーしています。Amazon EKS Anywhere は、Kubernetes クラスターの作成、アップグレード、管理に vSphere またはベアメタルの Cluster API プロバイダーを使用します。
Amazon EKS の場合、CAPA には以下の機能があります。
- Amazon EKS クラスターのプロビジョニングと管理
- Amazon EKS クラスターの Kubernetes バージョンのアップグレード
- Amazon EKS クラスターへのセルフマネージドのマシンを Node としてアタッチします
- マシンプールを作成し、Amazon EKS クラスターにアタッチします。詳しくはマシンプールのドキュメントをご覧ください
- マネージドのマシンプール (訳注:マネージド型ノードグループを使用するリソースです) を作成し、Amazon EKS クラスターにアタッチします。詳しくはマシンプールのドキュメントをご覧ください
- EKS アドオンを管理します。詳しくは EKS アドオンのドキュメントをご覧ください
- Amazon EKS AWS Fargate プロファイルを作成します
- AWS Identity and Access management (AWS IAM) のaws-iam-authenticator の設定を管理します
Argo CD とはなにか?
Argo CD は、Kubernetes のための宣言的な GitOps 継続的デリバリーツールです。GitOps のパターンに従い、Git リポジトリを信頼できる唯一の情報源として望ましいアプリケーションの状態を定義します。Argo CD を使用すると、Git リポジトリで定義されたアプリケーションをターゲットのクラスター環境に自動でデプロイすることができます。
ソリューション概要
仕組み – ハイレベルなオーケストレーションフロー
このウォークスルーでは、Kind を使ってローカルの Docker マシンに 管理用クラスターを作成します。
注意:kind は本番環境での利用のために設計されていません。今回はデモンストレーションの目的で使用しています。本番環境では、適切なバックアップと DR ポリシーおよび手順が整備された、Amazon EKS のような専用の Kubernetes クラスターを使用することが推奨されます。Kubernetes クラスターは少なくとも v1.20.0 である必要があります。
Cluster API CLI で管理用クラスターを初期化します。クラスター全体とアプリケーションのデプロイプロセスは、Kind 管理用クラスターにインストールされた Argo CD によって管理されます。Argo CD はマルチクラスターに対応しており、Kind クラスターとこれから作成するワークロードクラスター (Amazon EC2 や Amazon EKS で動作) を、ワークロードの設定が保存された Git リポジトリと繋げるための Application を定義することができます。ワークロードクラスターを作成した後に、管理対象のクラスターとして Argo CD に登録し、さらにサンプルアプリケーションをデプロイしていきます。
セットアップの前提条件
- Amazon EKS、Argo CD、Kubernetes を理解していること
- kubectl、kind、clusterctl、clusterawsadm、argocd cli、aws cli、jq、docker がインストールしてあること
- AWS アカウントと管理者権限のあるプロファイルが設定されていること
必要な CLI ツールのインストールについては、以下のリンクを参照してください。
ウォークスルー
Git リポジトリをフォークし、ローカルのワークステーションにクローンする
この記事では、環境を設定するためのサンプルマニフェストを提供しています。アクセスするには、以下の GitHub リポジトリをフォークし、クローンする必要があります。
クローンしたディレクトリに移動します。
管理用クラスターの初期化
Kind はローカル環境に Kubernetes クラスターを作成するために使用されます。このクラスターは、Cluster API Provider AWS を用いてターゲットとなる管理用クラスターをプロビジョニングするために、一時的なブートストラップクラスターとして使用します。
では、Kind クラスターを作成し、成功することを確認します。
Kind クラスターが正常に作成されると、以下のように表示されるはずです。
Kind Kubernetes クラスターは、Cluster API Provider コンポーネントをインストールすることで、管理用クラスターになります。Kind Kubernetes クラスターは、アプリケーションのワークロードから分離することが推奨されます。
Cluster API Provider AWS には、このプロジェクトの IAM オブジェクトを管理するためのユーテリティツールである clusterawsadm
が同梱されています。clusterawsadm
バイナリは、ワークロードクラスターを作成するために必要な権限を取得するために、環境変数を読み取り、Kind クラスターの Kubernetes Secret に格納する値としてその環境変数をエンコードします。
では、必要なパラメータをあらかじめ定義しておきましょう。
EKS クラスターの起動に Cluster API を使用するため、以下のフィーチャーゲートを有効化する必要があります。
AWS の Cluster API コンポーネントをインストールするために、kubeadm bootstrap provider とkubeadm
control-plane provider を使用し、clusterctl init
コマンドで Kind クラスターを管理クラスターにします。
以下の出力が表示されたら、Kind クラスターを管理用クラスターとして初期化することに成功したことを意味します。
Amazon EKS と Amazon EC2 用の Kubernetes クラスターマニフェストを生成する
このステップでは、Amazon EC2 上の Kubernetes クラスターと Amazon EKS クラスターを、それぞれ us-east-1 リージョンと ap-southeast-2 リージョンに 1 つずつプロビジョニングします。Argo CD でワークロードクラスターをプロビジョニングする必要があり、そのための最初のステップは、各クラスター用のマニフェストファイルを準備することです。これをおこなう手っ取り早い方法は、clusterctl generate cluster
とコマンドラインを使用して、定義した環境変数を読み取り、マニフェストを生成することです。
次に、定義しておくべき環境変数の一覧を示します。
クラスターのワーカーノードにリモートアクセスするための SSH (secure shell) キーが作成されていないので、作成します。
以下のコマンドを実行することで、ワークロードクラスターのマニフェストを作成することができます。Git リポジトリをクローンした場合は、capi-cluster
フォルダにマニフェストが存在するはずです。
Amazon EC2 上でセルフマネージドで動作する Kubernetes クラスターの場合、提供されているクラスターテンプレートを使用せずに新しくクラスターテンプレートを生成したい場合は、以下のコマンドを実行します。
Amazon EKS の場合、提供されているクラスターテンプレートを使用せずに新しいクラスターテンプレートを生成したい場合は、以下のコマンドを実行します。(eks-managedmachinepool
は、Amazon EKS クラスターのワーカーノードを作成する時にマネージド型ノードグループを使用することを指定します。)
管理用 Kubernetes クラスターに Argo CD をインストールする
Cluster API のドキュメントによると、Amazon EKS / k8s クラスターを新しくデプロイする方法として、生成されたマニフェストを kubectl apply を実行して Kind 管理用クラスターに適用する方法があります。しかし、今回は Argo CD を使用して、Git リポジトリに格納された生成されたマニフェストを元に、ワークロードクラスターのデプロイを効率化します。
まず、Argo CD を Kind 管理用クラスターにインストールしましょう。
では、ポートフォワーディングを利用して、Argo CD の Web ポータルにログインしてみましょう。
Argo CD にログインし、インストールが正しく行われたことを確認します。
Amazon EC2 上で動作する k8s クラスターと Amazon EKS クラスターをデプロイするために、Argo CD で Application を 作成する
Argo CD は、指定された Git リポジトリのコードを Kubernetes namespace にマッピングする、Application CRD を提供しています。Argo CD Application を管理用クラスターにデプロイする前に、Argo CD と Git の認証を確認する必要があります。これをおこなうには、Argo CD の Web UI にログインし、左側のメニューバーにある Setting ページに移動し、CONNECT REPO USING HTTPS をクリックします。Git リポジトリに接続するための適切な設定を入力します。
https://github.com/aws-samples/eks-ec2-clusterapi-gitops (fork した Git リポジトリの URL に置き換える必要があります)
Argo CD に Cluster API オブジェクトを管理する権限を与えるために、ClusterRoleBinding
を作成して、Argo CD が引き受ける ServiceAccount に必要な権限を関連付けます。シンプルにするために、Argo CD が使用する argocd-application-controller
ServiceAccount に、cluster-admin
Roleを追加しましょう。
新しくAmazon EC2 上で動作する k8s クラスター またはAmazon EKS クラスターを作成するために、宣言的なアプローチで Application を定義します。これは、新しいクラスターをデプロイするための全ての部品を構成する Kubernetes マニフェストの集合を表します。このガイドでは、追加する Argo CD Application の設定は、クローンされたリポジトリの management
フォルダに格納されています。例えば、以下は Amazon EC2 上で動作する k8s クラスターを作成するための Application マニフェストです。
Argo CD Application の YAML ファイルを上記のように修正したあと、更新をコミットしてソースリポジトリにプッシュします。
以下のコマンドを実行して、Amazon EC2 上で動作する k8s クラスターを作成するための新しい Application を作成します。
同様に、Argo CD Application を使用して、Amazon EKS クラスターの起動をサポートします。この例では Application を作成しました。repoURL
が自身の Git リポジトリを指すように yaml
ファイルを修正し、更新をコミットしてソースリポジトリにプッシュすることを忘れないでください。
Argo CD Application を適用して、Amazon EKS クラスターを起動します。
Argo CD に 2 つの Application をデプロイすると、以下の図のように、Argo CD の Web UI で作成された Application を確認できるようになるはずです。
プロビジョニング中のすべてのクラスターをリストアップします。
クラスターの状態を確認します。
Amazon EC2 上で動作しているクラスターで、ワーカーノードの READY
ステータスが False
のままであることに気づくはずです。クラスターに CNI が導入されていないため、ワーカーノードが正常にクラスターに参加できていません。Argo CD を使って CNI のデプロイを自動化することもできますが、ここではデモンストレーションを目的として、Calico CNI を Amazon EC2 クラスターにデプロイしてみましょう。
Amazon EC2 上に新しく構築したクラスターの kubeconfig ファイルを取得する
Calico CNI をデプロイする
Calico CNI が正常にデプロイされたので、再度クラスターの状態を確認します。
AWS Management Console で Amazon EC2 サービスに移動し、us-east-1 リージョン
を選択します。すべてのコントロールプレーンとワーカーノードが起動していることが確認できます。
Amazon EKS クラスターが正常にデプロイされたことを確認しましょう。
AWS Management Console で Amazon EKS サービスに移動し、ap-southeast-2 リージョン
を選択すると、クラスターが作成されているのが確認できるはずです。
Amazon EKS クラスターを作成する際に、kubeconfigs
が生成され、管理用クラスターの Secret として保存されることがあります。これは AWS Provider を使用して非管理用クラスターを作成する場合とは異なります。kubeconfig
を含む Secret の名前は [cluster-name]-user-kubeconfig
です。[cluster-name] は自身のクラスター名に置き換える必要があります。
capi-eks
という名前のクラスターのユーザーのkubeconfig
を取得するには、以下のようなコマンドを実行します。
新しく作成された Amazon EKS クラスターのワーカーノードをすべてリストアップします。
新しく作成されたクラスターにサンプルアプリケーションをデプロイする
Argo CD を使ってサンプルアプリケーションをワークロードクラスターにデプロイするには、Amazon EC2 / Amazon EKS クラスターをマネージドクラスターとして Argo CD に追加する必要があります。ここではデモンストレーションののため、サンプル Nginx
アプリケーションを Amazon EKS クラスターにデプロイする手順のみ紹介します。Amazon EC2 クラスターにデプロイする手順もほぼ同様です。まず、Amazon EKS クラスターをマネージドクラスターとして Argo CD に登録する必要があります。
ポートフォワーディングを有効にした状態で、Argo CD インスタンスにログインします。argocd
CLI を使って、Argo CD サーバーに対して認証します。
argocd login localhost:8080
(安全でない接続を続けるかどうか尋ねられたら「はい」と答えてください。)
新しく作成された Amazon EKS クラスターのコンテキスト名を取得します。
以下のコマンドを実行し、新しく作成した Amazon EKS クラスターを、Argo CD のマネージドクラスターとして追加します。
以下の WARNING を確認し yes
と入力してください。
次に、Argo CD で新しい Application を作成し、Amazon EKS クラスターへのサンプルアプリケーションのデプロイを効率化できるようにします。以下のコマンドを実行する前に、repoURL
が Git リポジトリを指すように上記のマニフェストファイルを修正し、更新をコミットしてプッシュしてください。
以下のコマンドを実行して、サンプル nginx
アプリケーションをデプロイします。
Argo CD の Web ポータルで、サンプル nginx
アプリが Amazon EKS クラスターに正常にデプロイされたことが確認できます。
クリーンアップ
不要なクラウドのコストを発生させないためにも、環境をクリーンアップしてください。
Argo CD Application を削除する
作成したクラスターを削除する
各リージョンで作成した Amazon EC2 SSH キーを削除します。
必要な IAM リソースを作成するために実行した clusterawsadm bootstrap コマンドによって作成された CloudFormation Stack を削除する
管理用クラスターを削除する
結論
この記事では、Cluster API とは何かを紹介し、複数の Kubernetes クラスターを管理する際に異なる API やツールセットと格闘するのではなく、この便利なツールを使用できる理由を説明しました。Argo CD という GitOps ツールと組み合わせることで、信頼できる唯一の情報源として Git を利用し、クラスターとワークロードのマニフェストファイルを保存できます。それによって、新しいワークロードやワークロードの設定の更新を、ターゲットとなる環境に継続的にデリバリーさせることができます。
翻訳はソリューションアーキテクトの後藤が担当しました。原文はこちらです。