Cluster APIを使ってAWSにKubernetesクラスタを作成する
まずは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は反映されません。