Open1

Cluster APIを使ってAWSにKubernetesクラスタを作成する

reoringreoring

まずはcluterctlコマンドをインストールする。環境によってダウンロードするバイナリが異なるので注意。

curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.3.3/clusterctl-darwin-arm64 -o clusterctl
chmod +x ./clusterctl
sudo mv ./clusterctl /usr/local/bin/

管理クラスタを初期化

clusterctl init

個別のプロバイダ設定をせずにinitとすると、cluster-api というプロバイダしか設定されない。この状態では個別のクラウドプロバイダを指定してクラスタ構築することはできない。下記手順のプロバイダの初期設定を実行してからinitするとよい。

Your management cluster has been initialized successfully!

とでたらOK

clusterctl initでは、下記のリソースがセットアップされる。

Namespace: capi-kubeadm-bootstrap-system
Deployment: capi-kubeadm-bootstrap-controller-manager

Namespace: capi-kubeadm-control-plane-system
Deployment: capi-kubeadm-control-plane-controller-manager

Namespace: capi-system
Deployment: capi-controller-manager

各種CRD

  • clusterclasses.cluster.x-k8s.io
  • clusterresourcesetbindings.addons.cluster.x-k8s.io
  • clusterresourcesets.addons.cluster.x-k8s.io
  • clusters.cluster.x-k8s.io
  • extensionconfigs.runtime.cluster.x-k8s.io
  • ipaddressclaims.ipam.cluster.x-k8s.io
  • ipaddresses.ipam.cluster.x-k8s.io
  • kubeadmconfigs.bootstrap.cluster.x-k8s.io
  • kubeadmconfigtemplates.bootstrap.cluster.x-k8s.io
  • kubeadmcontrolplanes.controlplane.cluster.x-k8s.io
  • kubeadmcontrolplanetemplates.controlplane.cluster.x-k8s.io
  • machinedeployments.cluster.x-k8s.io
  • machinehealthchecks.cluster.x-k8s.io
  • machinepools.cluster.x-k8s.io
  • machines.cluster.x-k8s.io
  • machinesets.cluster.x-k8s.io
  • providers.clusterctl.cluster.x-k8s.io

プロバイダの初期設定

クラスタ管理のコマンドは別で提供されている。今回はAWSを対象にする。

curl -L https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/download/v2.0.2/clusterawsadm-darwin-arm64 -o clusterawsadm
chmod +x clusterawsadm
sudo mv clusterawsadm /usr/local/bin
export AWS_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=<your-access-key>
export AWS_SECRET_ACCESS_KEY=<your-secret-access-key>

CloudFormationスタックの生成 ここでは必要なIAM RoleやPolicyを生成してくれます。

clusterawsadm bootstrap iam create-cloudformation-stack
Resource                  |Type                                                                                  |Status
AWS::IAM::InstanceProfile |control-plane.cluster-api-provider-aws.sigs.k8s.io                                    |CREATE_COMPLETE
AWS::IAM::InstanceProfile |controllers.cluster-api-provider-aws.sigs.k8s.io                                      |CREATE_COMPLETE
AWS::IAM::InstanceProfile |nodes.cluster-api-provider-aws.sigs.k8s.io                                            |CREATE_COMPLETE
AWS::IAM::ManagedPolicy   |arn:aws:iam::812720240251:policy/control-plane.cluster-api-provider-aws.sigs.k8s.io   |CREATE_COMPLETE
AWS::IAM::ManagedPolicy   |arn:aws:iam::812720240251:policy/nodes.cluster-api-provider-aws.sigs.k8s.io           |CREATE_COMPLETE
AWS::IAM::ManagedPolicy   |arn:aws:iam::812720240251:policy/controllers.cluster-api-provider-aws.sigs.k8s.io     |CREATE_COMPLETE
AWS::IAM::ManagedPolicy   |arn:aws:iam::812720240251:policy/controllers-eks.cluster-api-provider-aws.sigs.k8s.io |CREATE_COMPLETE
AWS::IAM::Role            |control-plane.cluster-api-provider-aws.sigs.k8s.io                                    |CREATE_COMPLETE
AWS::IAM::Role            |controllers.cluster-api-provider-aws.sigs.k8s.io                                      |CREATE_COMPLETE
AWS::IAM::Role            |eks-controlplane.cluster-api-provider-aws.sigs.k8s.io                                 |CREATE_COMPLETE
AWS::IAM::Role            |nodes.cluster-api-provider-aws.sigs.k8s.io                                            |CREATE_COMPLETE

次にclusterawsadmが使うクレデンシャルの取得

export AWS_B64ENCODED_CREDENTIALS=$(clusterawsadm bootstrap credentials encode-as-profile)

これは普通に下記のような内容のAWSアクセスキーをBase64エンコードしたものです。

[default]
aws_access_key_id = ******
aws_secret_access_key = ********
region = ap-northeast-1

EKSを利用するためにいくつかのFeature Gateを有効にする

export EKS=true
export EXP_MACHINE_POOL=true
export CAPA_EKS_IAM=true

最後にマネジメントクラスタにこれらの情報を入れます。

clusterctl init --infrastructure aws

ワークロードクラスタの作成

export AWS_REGION=ap-northeast-1
export AWS_SSH_KEY_NAME=default

export AWS_CONTROL_PLANE_MACHINE_TYPE=t3.large
export AWS_NODE_MACHINE_TYPE=t3.large
aws ec2 create-key-pair --key-name capi-eks --region ap-northeast-1 --query 'KeyMaterial' --output text > capi-eks.pem

下記コマンドでClusterリソースを生成してくれます。

export AWS_SSH_KEY_NAME=capi-eks
export AWS_REGION=ap-northeast-1

clusterctl generate cluster testing \
  --flavor eks-managedmachinepool \
  --kubernetes-version v1.22.6 \
  --worker-machine-count=2

生成されたYAMLの内容がよさそうなら、次のコマンドで管理クラスタにClusterリソースを作成します。

clusterctl generate cluster testing \
  --flavor eks-managedmachinepool \
  --kubernetes-version v1.22.6 \
  --worker-machine-count=2 | kubectl apply -f -

クラスタ作成の状況を確認してみます。

kubectl get cluster

ここのPHASEがProvisioningになっていればクラスタ作成中です。

もうちょっと詳しく状態を見るには、

clusterctl describe cluster testing

のようにしてみます。

正常にクラスタが作成されると、出力は下記のようになります。

clusterctl describe cluster testing
NAME                                                             READY  SEVERITY  REASON  SINCE  MESSAGE
Cluster/testing                                                  True                     2m8s
├─ClusterInfrastructure - AWSManagedCluster/testing
├─ControlPlane - AWSManagedControlPlane/testing-control-plane  True                     2m8s
└─Workers
  └─MachinePool/testing-pool-0                                 True                     5s

クラスタ作成にはだいたい10分程度時間がかかります。

削除

Feature Toggleの指定失敗などはclusterctl delete --allで最初からやりなおせば反映されます。delete --infrastructureだけだとFeature Toggleは反映されません。