Cluster API Provider AWS を QuickStart するための知見
本記事は「Cluster API と Argo CD を用いた Kubernetes マルチクラスター管理」を元に Cluster API に入門するにあたって、概念的な部分やコマンドの詳細について補足しているものになります。
Cluster API とは
Cluster API とは、Cluster Lifecycle SIGsで開発されているOSSです。できることを端的にいうならKubernetesクラスター上で別のKubernetesクラスターの構築・更新・削除といった一連の操作を実現する機能と言えます。
作成するクラスターが必要とするマシンリソース(VMやクラウドプロバイダー固有のリソースなど)といった特定の環境に対する操作は、Cluster API 本体ではなく Provider として別に実装することで、環境ごとの差分を吸収しています。例えば AWS の場合は、Cluster API Provider AWS という Provider が存在します。(ちなみに Cluster API Provider AWS は CAPA と略します。本記事でも以降は CPAPA と表記します。)
実際に Cluster API を使って Kubernetes クラスターを構築する際には、Cluster/ControlPlane/MachimeDeployment/Machine といったカスタムリソースを作成することになります。
カスタムリソースを作成するクラスターを管理クラスター(management cluster)、Cluster API によって作成されるクラスターをワークロードクラスター(workload cluster)と呼びます。
ref: The Cluster API Book: Concepts
代表的なカスタムリソース
Cluster API では、様々なカスタムリソースが用意されています。ここでは代表的なカスタムリソースについて紹介します。
Cluster
Cluster API によって作成されるワークロードクラスターを抽象化したリソースです。
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: capi-eks
namespace: default
spec:
clusterNetwork:
pods:
cidrBlocks:
- 192.168.0.0/16
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: AWSManagedControlPlane
name: capi-eks-control-plane
infrastructureRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: AWSManagedControlPlane
name: capi-eks-control-plane
Machine/MachineSet/MachineDeployment
Machine は、Kubernetes の Node をホストするインフラストラクチャコンポーネント(例えばVMなど)を抽象化したリソースになります。MachineSet は、任意の時点で実行されている Machine を維持するリソースで、ReplicaSet のような立ち位置のリソースです。
MachineDeployment は Machine と MachineSets のアップデートを責務に持つリソースで、名前からわかるとおり、Deployment のような立ち位置のリソースです。
各種ツールとコマンド
ここからは Cluster API 周辺のツールについて、QuickStart するために必要な部分について簡単にまとめます。
clusterctl
Cluster API 管理クラスターのライフサイクルを管理する CLI ツールです。インストール手順は The Cluster API Book: Quick Start を参照してください。
clusterctl init
Cluster API 関連のコンポーネントをインストールして、Kubernetes クラスターを management cluster に変換します。
clusterctl init
コマンドはインストールする Provider のリストを受け取ります。例えば CAPA の場合は、以下のようなコマンドを実行することになります。
clusterctl init --infrastructure aws
--target-namespace
フラグを使うことで、コンポーネントをインストールする Namespace を指定できます。また cert-manager がすでにインストールされているかどうかをチェックし、インストールされていないようであればインストールされます。
clusterctl describe cluster
Cluster API で作成された Cluster の状態を "at a glance" で参照するコマンドです。
> clusterctl describe cluster capi-ec2
NAME READY SEVERITY REASON SINCE MESSAGE
Cluster/capi-ec2 True 101m
├─ClusterInfrastructure - AWSCluster/capi-ec2 True 137m
├─ControlPlane - KubeadmControlPlane/capi-ec2-control-plane True 101m
│ └─3 Machines... True 137m See capi-ec2-control-plane-XXXXXX, capi-ec2-control-plane-XXXXXX, ...
└─Workers
└─MachineDeployment/capi-ec2-md-0 True 102m
└─3 Machines... True 112m See capi-ec2-md-0-XXXXXX-XXXXXX, capi-ec2-md-0-XXXXXX-XXXXXX, ...
Machines...
に注目していただくと、Machine がグルーピングされた状態で表示しているのがわかるかと思います。--disable-grouping
フラグと共にコマンドを実行することで、省略された Machine の状態が展開されて表示されます。また --show-conditions Workers,ClusterInfrastructure
といった指定をすることで、特定のオブジェクトを指定して全て表示することもできます。
clusterctl get kubeconfig capi-ec2
workload cluster の kubeconfig を標準出力に出力します。
clusterctl get kubeconfig capi-ec2
clusterawsadm
CAPA のヘルパー CLI ツールです。必要な IAM ポリシーを表示したり、CloudFormation を使って IAM ロールを生成したりします。インストール手順はThe Cluster API Book: Quick Startを参照してください。
以下のコマンドを実行すると、CAPA が使用する IAM ロールを CloudFormation で生成します。
clusterawsadm bootstrap iam create-cloudformation-stack
以下のコマンドを実行すると、CAPA が使用するクレデンシャルを Base64 でエンコードして出力します。
clusteraws adm bootstrap credentials encode-as-profile
clusteraws は、以下の順に従ってエンコード元のクレデンシャルを見つけます。
-
AWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
環境変数 -
~/.aws/credentials
または~/.aws/config
の default profile - AWS上で動いている場合は EC2 Instance Profile
- ECS クレデンシャル
前述した clusterctl init --infrastructure aws
は、本コマンドを実行して得られたクレデンシャルを入れた環境変数をもとに、Kubernetes Secret リソースを作成し、CAPA はそのクレデンシャルをもとにワークロードクラスターを作成します。作成された Secret の詳細は以下のコマンドで表示できます。
kubectl get secrets capa-manager-bootstrap-credentials -o yaml -n capa-system
おわりに
Cluster API Provider AWS を QuickStart する時の知見をまとめました。Cluster API は 2021 年に Production Ready に到達しているプロジェクトです。AWS 上で マルチクラスターを管理する際に CAPA が適用できるユースケースも出てくると思うので、今後も継続的にウォッチしていこうと思います。
Discussion