🧑‍💻

Cluster API Provider AWS を QuickStart するための知見

2023/01/17に公開

本記事は「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 は、以下の順に従ってエンコード元のクレデンシャルを見つけます。

  1. AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 環境変数
  2. ~/.aws/credentials または ~/.aws/config の default profile
  3. AWS上で動いている場合は EC2 Instance Profile
  4. 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