はじめに
今回は、EKSクラスターをCloudFormationでAWS上に構築する方法を試していきたいと思います。
EKSは、KubernetesをAWS上に構築するためのAWSサービスです。いきなり、身も蓋も無いのですが、Kubernetesは活発に開発されているOSSのようで、デプロイメントをサポートするツールも多彩に用意されています。eksctl、kube-awsやTerraform、KubernetesのDeploymentなど便利な構築方法が多数あるため、地道に一からCloudFormationを書くケースは稀なのかもしれません。。ですがEKSを理解するための足掛かりとしては良いはず!(←ただやりたいだけ)
前回に引き続き、クラスター構築をコード化して、検証環境構築を簡単に実施してみようと思います。ノードやアプリケーションは次回以降の記事にしていきます。
EKSやKubernetesをこれから勉強していきたい方の参考になれば幸いです!
参考ドキュメント
以下を参考にしました。
メモ
まだ理解の浅い私向けに主要機能の概要をメモしておきます。
- EKSクラスター (Cluster):
- EKSクラスターは、Kubernetesのコントロールプレーンを構成する要素であり、APIサーバーやEtcdストレージサービスを含む。クラスター全体の管理とオーケストレーションを担当する。
- ノードグループ (Nodegroup):
- ノードグループは、EKSクラスター内のワーカーノードのグループである。ノードグループはEC2インスタンスまたはFargateを選択して作成できる。
- APIサーバー (API Server):
- Kubernetesクラスターの中心であり、Kubeletやコントローラーマネージャー、スケジューラーと連携してクラスター全体の管理を行う。
- OIDCコネクトURL (OIDC Connect URL):
- EKSクラスターはOIDCプロバイダーとして機能し、AWS Identity and Access Management (IAM) ロールを使用してクラスターへのアクセスを制御する。
- Pod:
- Kubernetesの最小単位であり、1つ以上のコンテナを含むアプリケーションの実行単位。
- ノード (Node):
- ノードはEC2インスタンスまたはFargateタスクであり、KubeletとKube Proxyを実行してコンテナを運び、実行する。
構成図
以下のような構成で構築していきます。
※いくつかのリソースは図示しないですが、Natゲートウェイ→インターネットゲートウェイ、EKSクラスター→Natゲートウェイのルートテーブルも作成します
さっそくCloudFormationで構築!
CloudFormationテンプレートは以下にございます。
ダウンロードしてデスクトップや任意の作業フォルダに保存します。
※上記にアクセスするタイミングによっては、コードが更新されていて意図しない動きになることがあります。
CloudFormation:YAMLテンプレートのポイント
YAMLテンプレートのポイントを記述します。
※以下は、大阪リージョンを指定していますが、任意のリージョンを指定してください
以下に、各セクションの詳細を解説します。
- EKS Cluster (EksCluster):
- タイプ:
AWS::EKS::Cluster
- プロパティ:
- Name: クラスターの名前。
!Join
関数を使用して環境名、プロジェクト名、および “eks-cluster” をハイフンで結合しています。 - Version: 使用するKubernetesバージョン。
!Ref
を使用して参照しています。 - RoleArn: EKSクラスターの役割のARN。
!GetAtt
を使用して参照しています。 - ResourcesVpcConfig: クラスターのVPC設定。
- SecurityGroupIds: セキュリティグループのID。
!ImportValue
を使用して外部スタックから参照しています。 - SubnetIds: プライベートサブネットのID。
!Split
を使用してカンマで区切られた値をリストに変換しています。
- SecurityGroupIds: セキュリティグループのID。
- Tags: クラスターに関連付けられるタグ。
- タグのキーと値を指定しています。
- Name: クラスターの名前。
- タイプ:
- EKS NodeGroup (EksNodegroup):
- タイプ:
AWS::EKS::Nodegroup
- 依存関係:
EksCluster
に依存しています。 - プロパティ:
- ClusterName: ノードグループが所属するクラスターの名前。
!Join
関数を使用して環境名、プロジェクト名、および “eks-cluster” をハイフンで結合しています。 - NodeRole: ノードグループの役割のARN。
!GetAtt
を使用して参照しています。 - ScalingConfig: ノードのスケーリング設定。
- MinSize: 最小ノード数。
!Ref
を使用して参照しています。 - DesiredSize: 希望ノード数。
!Ref
を使用して参照しています。 - MaxSize: 最大ノード数。
!Ref
を使用して参照しています。
- MinSize: 最小ノード数。
- Subnets: ノードが配置されるサブネットのID。
!Split
を使用してカンマで区切られた値をリストに変換しています。
- ClusterName: ノードグループが所属するクラスターの名前。
- タイプ:
スタックの作成_CLI
- 任意のターミナルソフトを開き、保存しておいたYAMLテンプレートをカレントディレクトリに配置します。
$ ls
eks-handson-vpc.yml eks-handson-cluster.yml
- VPC等ネットワーク系リソースの作成:以下のコマンドを実行します。
$ aws cloudformation create-stack --region ap-northeast-3 --stack-name eks-handson-vpc --template-body file://eks-handson-vpc.yml
VPC、サブネット、インターネットゲートウェイ、Natゲートウェイ等が作成されます。
- 次に以下のコマンドを実行して、EKSクラスターとノードグループを作成します。
$ aws cloudformation create-stack --region ap-northeast-3 --stack-name eks-handson-vpc --template-body file://eks-handson-vpc.yml
ノード用IAMロール、クラスター用IAMロール、EKSクラスター、EKSクラスターノードグループが作成されました。
参考
ご自身でYAMLテンプレートを書いて構築される方向けに、スタックのアップデート用コマンドを記載しておきますので、ご参考ください。
$ aws cloudformation update-stack --region ap-northeast-3 --stack-name eks-handson-cluster --template-body file://eks-handson-cluster.yml
$ aws cloudformation update-stack --region ap-northeast-3 --stack-name eks-handson-vpc --template-body file://eks-handson-vpc.yml
プロファイルを指定して複数アカウントを使い分けている方を以下のオプションを忘れずご使用ください。
スタックの作成_GUI
マネジメントコンソールからスタックの作成を行う手順も記載していますので、GUIの方がわかりやすいという方はこちらをお試しください。
手順は、以下の通りで、リンクにも詳細がございます。
- CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
- テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
- スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
- スタックオプションは特に変更せず、次へを選択
- レビュー画面を確認して送信を選択
作成されたリソースを確認
以下の通り、リソースが作成されています。
EKSのコンソールを開き、詳細を確認するため、以下の作成されたクラスター名を選択します。
ここからの内容は、EKSの仕様となるため、私自信よく分かってません。。なので、ドキュメントを確認しながらリアクション的に記述します。
(理解不足の内容が多々ありますが、ご承知おきください)
- まず、バージョン指定は、最新をKubernetesドキュメントで調べ設定しましたが、EKSも対応しているようで、問題なく指定されていました。(Kubernetesは年に何度もバージョンアップがあるようなので、実際のわークロードの運用対応は骨が折れそうですね。。)
- 次に概要タブです。
- EKSリソースがノードの参加等でアクセスするAPIサーバーのエンドポイントが作成されていることが確認できます。ほかには、OIDCのURL、認証情報も発行されています。特に指定しませんでしたが、デフォルトで設定してくれるようです。オプションで無効化設定もできるようです。
- 続いて、リソース項目です。
- ワークロード項目内に作成されたpodが確認できます。 kube-systemという名前空間に4つのpodが作成されています。これらは、特に指定して作成したわけではないです。ノード一つあたりにデフォルトで作成されるpodもあるようです。
- kube-proxy:ノードのネットワーク設定や負荷分散を行う。
- aws-node:VPCの指定、ログ設定、ネットワーク、メタデータ様々な主要な設定をしている(?)
- core-dns:EKSクラスター内のDNSサービス
- コンピューティング項目は、EKSクラスター内で複数のpodを稼働しているホストとなるインスタンスが確認できます。スペックが未指定だとインスタンスタイプはt3.midiumで、AmazonLinux2で作成されるようです。
まとめ
今回は、CloudFormationを使用して、EKSクラスターを構築しました。
次回以降でノードやアプリケーションを含めた構築、検証を進めていきたいと思います。
また、AWS CDKやTerraformを用いた構築も進めていきます!
最後までご覧いただきありがとうございました。
コメント