【Kubernetes】EKSクラスターをAWS CloudFormationで構築したい

AWS

はじめに

今回は、EKSクラスターをCloudFormationでAWS上に構築する方法を試していきたいと思います。

EKSは、KubernetesをAWS上に構築するためのAWSサービスです。いきなり、身も蓋も無いのですが、Kubernetesは活発に開発されているOSSのようで、デプロイメントをサポートするツールも多彩に用意されています。eksctl、kube-awsやTerraform、KubernetesのDeploymentなど便利な構築方法が多数あるため、地道に一からCloudFormationを書くケースは稀なのかもしれません。。ですがEKSを理解するための足掛かりとしては良いはず!(←ただやりたいだけ)

前回に引き続き、クラスター構築をコード化して、検証環境構築を簡単に実施してみようと思います。ノードやアプリケーションは次回以降の記事にしていきます。

EKSやKubernetesをこれから勉強していきたい方の参考になれば幸いです!

参考ドキュメント

以下を参考にしました。

AWS::EKS::Cluster - AWS CloudFormation
Creates an Amazon EKS control plane.
AWS::EKS::Nodegroup - AWS CloudFormation
Creates a managed node group for an Amazon EKS cluster.

メモ

まだ理解の浅い私向けに主要機能の概要をメモしておきます。

  1. EKSクラスター (Cluster):
    • EKSクラスターは、Kubernetesのコントロールプレーンを構成する要素であり、APIサーバーやEtcdストレージサービスを含む。クラスター全体の管理とオーケストレーションを担当する。
  2. ノードグループ (Nodegroup):
    • ノードグループは、EKSクラスター内のワーカーノードのグループである。ノードグループはEC2インスタンスまたはFargateを選択して作成できる。
  3. APIサーバー (API Server):
    • Kubernetesクラスターの中心であり、Kubeletやコントローラーマネージャー、スケジューラーと連携してクラスター全体の管理を行う。
  4. OIDCコネクトURL (OIDC Connect URL):
    • EKSクラスターはOIDCプロバイダーとして機能し、AWS Identity and Access Management (IAM) ロールを使用してクラスターへのアクセスを制御する。
  5. Pod:
    • Kubernetesの最小単位であり、1つ以上のコンテナを含むアプリケーションの実行単位。
  6. ノード (Node):
    • ノードはEC2インスタンスまたはFargateタスクであり、KubeletとKube Proxyを実行してコンテナを運び、実行する。
Amazon EKS クラスター - Amazon EKS
Amazon EKS クラスターは、主要な 2 つのコンポーネントで構成されています。
マネージド型ノードグループ - Amazon EKS
Amazon EKS マネージド型ノードグループは、Amazon EKS Kubernetes クラスターのノード (Amazon EC2 インスタンス) のプロビジョニングとライフサイクル管理を自動化します。
OpenID Connect アイデンティティプロバイダーからクラスターのユーザーを認証する - Amazon EKS
Amazon EKS では、クラスターに対してユーザーを認証する方法として OpenID Connect ( OIDC ) ID プロバイダーの使用がサポートされています。 OIDC ID プロバイダーは、AWS Identity and ...

構成図

以下のような構成で構築していきます。

※いくつかのリソースは図示しないですが、Natゲートウェイ→インターネットゲートウェイ、EKSクラスター→Natゲートウェイのルートテーブルも作成します

さっそくCloudFormationで構築!

CloudFormationテンプレートは以下にございます。

ダウンロードしてデスクトップや任意の作業フォルダに保存します。

https://github.com/kosments/aws-improvement-tips/tree/main/eks-handson-cfn

※上記にアクセスするタイミングによっては、コードが更新されていて意図しない動きになることがあります。

CloudFormation:YAMLテンプレートのポイント

YAMLテンプレートのポイントを記述します。

※以下は、大阪リージョンを指定していますが、任意のリージョンを指定してください

以下に、各セクションの詳細を解説します。

  1. 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 を使用してカンマで区切られた値をリストに変換しています。
      • Tags: クラスターに関連付けられるタグ。
        • タグのキーと値を指定しています。
  2. EKS NodeGroup (EksNodegroup):
    • タイプAWS::EKS::Nodegroup
    • 依存関係EksCluster に依存しています。
    • プロパティ:
      • ClusterName: ノードグループが所属するクラスターの名前。!Join 関数を使用して環境名、プロジェクト名、および “eks-cluster” をハイフンで結合しています。
      • NodeRole: ノードグループの役割のARN。!GetAtt を使用して参照しています。
      • ScalingConfig: ノードのスケーリング設定。
        • MinSize: 最小ノード数。!Ref を使用して参照しています。
        • DesiredSize: 希望ノード数。!Ref を使用して参照しています。
        • MaxSize: 最大ノード数。!Ref を使用して参照しています。
      • Subnets: ノードが配置されるサブネットのID。!Split を使用してカンマで区切られた値をリストに変換しています。

スタックの作成_CLI

  1. 任意のターミナルソフトを開き、保存しておいたYAMLテンプレートをカレントディレクトリに配置します。
$ ls
eks-handson-vpc.yml eks-handson-cluster.yml
  1. VPC等ネットワーク系リソースの作成:以下のコマンドを実行します。
$ aws cloudformation create-stack --region ap-northeast-3 --stack-name eks-handson-vpc --template-body file://eks-handson-vpc.yml

VPC、サブネット、インターネットゲートウェイ、Natゲートウェイ等が作成されます。

  1. 次に以下のコマンドを実行して、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
update-stack — AWS CLI 1.32.39 Command Reference

プロファイルを指定して複数アカウントを使い分けている方を以下のオプションを忘れずご使用ください。

コマンドラインオプション - AWS Command Line Interface
AWS CLI で、コマンドラインオプションはグローバルパラメータであり、デフォルトの設定、対応するプロファイル設定、単一のコマンドの環境変数設定を上書きできます。使用するプロファイルを指定することはできますが、コマンドラインオプションを使...

スタックの作成_GUI

マネジメントコンソールからスタックの作成を行う手順も記載していますので、GUIの方がわかりやすいという方はこちらをお試しください。

手順は、以下の通りで、リンクにも詳細がございます。

  1. CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
  2. テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
  3. スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
  4. スタックオプションは特に変更せず、次へを選択
  5. レビュー画面を確認して送信を選択

作成されたリソースを確認

以下の通り、リソースが作成されています。

EKSのコンソールを開き、詳細を確認するため、以下の作成されたクラスター名を選択します。

ここからの内容は、EKSの仕様となるため、私自信よく分かってません。。なので、ドキュメントを確認しながらリアクション的に記述します。

(理解不足の内容が多々ありますが、ご承知おきください)

  • まず、バージョン指定は、最新をKubernetesドキュメントで調べ設定しましたが、EKSも対応しているようで、問題なく指定されていました。(Kubernetesは年に何度もバージョンアップがあるようなので、実際のわークロードの運用対応は骨が折れそうですね。。)
リリース
Kubernetesプロジェクトは、最新の3つのマイナーリリース(1.29、1.28、1.27)のリリースブランチをメンテナンスしています。 Kubernetes 1.19以降のバージョンは、約1年間のパッチサポートを受け付けています。 K...
  • 次に概要タブです。
    • EKSリソースがノードの参加等でアクセスするAPIサーバーのエンドポイントが作成されていることが確認できます。ほかには、OIDCのURL、認証情報も発行されています。特に指定しませんでしたが、デフォルトで設定してくれるようです。オプションで無効化設定もできるようです。
Amazon EKS クラスターエンドポイントアクセスコントロール - Amazon EKS
このトピックは、Amazon EKS クラスターの Kubernetes API サーバーエンドポイントのプライベートアクセスを有効にし、インターネットからのパブリックアクセスを制限または完全に無効にするのに役立ちます。
  • 続いて、リソース項目です。
  • ワークロード項目内に作成されたpodが確認できます。 kube-systemという名前空間に4つのpodが作成されています。これらは、特に指定して作成したわけではないです。ノード一つあたりにデフォルトで作成されるpodもあるようです。
Kubernetesのコンポーネント
Kubernetesクラスターはコントロールプレーンのコンポーネントとノードと呼ばれるマシン群で構成されています。
  • kube-proxy:ノードのネットワーク設定や負荷分散を行う。
  • aws-node:VPCの指定、ログ設定、ネットワーク、メタデータ様々な主要な設定をしている(?)
  • core-dns:EKSクラスター内のDNSサービス
CoreDNS: DNS and Service Discovery
  • コンピューティング項目は、EKSクラスター内で複数のpodを稼働しているホストとなるインスタンスが確認できます。スペックが未指定だとインスタンスタイプはt3.midiumで、AmazonLinux2で作成されるようです。

まとめ

今回は、CloudFormationを使用して、EKSクラスターを構築しました。

次回以降でノードやアプリケーションを含めた構築、検証を進めていきたいと思います。

また、AWS CDKやTerraformを用いた構築も進めていきます!

最後までご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました