はじめに
Amazon EKS Anywhere (EKS-A) は、Amazon EKS で利用されている Kubernetes ディストリビューション「Amazon EKS Distro」の環境をオンプレミスで管理できる、EKS のデプロイオプションの一つです。
GitHub で開発、公開されていて、いつでも無料でダウンロードして利用できます。
EKS-A は現在、 ベアメタル環境もサポートしていますが、いざ、検証しようとするとどこから始めるべきかとっつきにくいと感じることがあるかもしれません。
本記事では、 EKS-A の構築手順や機能を、仮想環境 (VMware ESXi) を使ってお手軽に検証してしてみます。vCenter で操作していますが、本手順は ESXi の Host Client でも実施できます。また、記事を通して、以下の仮想マシンを作成しますので、その分のマシンスペックが必要です。
ルーター
vCPU: 2, Memory: 2GB
EKS Anywhere Admin Machine
vCPU: 2, Memory: 16GB
EKS Anywhere ノード (シングルノード)
vCPU:2, Memory: 8GB
builders.flash メールメンバー登録
builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。
専用の仮想ネットワークを構築する
ネットワークを追加
Amazon EKS Anywhere の構築
ネットワークの設定が完了したので、いよいよ EKS-A の構築に入ります。
ネットワーク設定、ポートの開放
ネットワークの設定は、以下の netplan の情報を参考にしてください。
network:
ethernets:
ens192: # DHCP はないため、固定でアドレスを設定
addresses:
- 10.8.10.1/16
nameservers:
addresses: # OpenDNS
- 208.67.222.222
- 208.67.220.220
search: []
routes:
- to: default
via: 10.8.0.1
version: 2
ポートをブロックしている場合
また、図で記載されている通り、構築先 Kubernetes ノードから DHCP や TFTP などのリクエストを受信します。 ufw などでポートをブロックしている場合は、ドキュメントの仕様通りにポートを開放してください。
ツール類のインストール
ドキュメント記載の手順に従い、ツール類をインストールします。まず、以下のツールをインストールしてください。
その後、EKS-A のインストーラーやツール類をインストールします。
インストール方法
コマンド
curl "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" \
--silent --location \
| tar xz -C /tmp
sudo install -m 0755 /tmp/eksctl /usr/local/bin/eksctl
RELEASE_VERSION=$(curl https://anywhere-assets.eks.amazonaws.com/releases/eks-a/manifest.yaml --silent --location | yq ".spec.latestVersion")
EKS_ANYWHERE_TARBALL_URL=$(curl https://anywhere-assets.eks.amazonaws.com/releases/eks-a/manifest.yaml --silent --location | yq ".spec.releases[] | select(.version==\"$RELEASE_VERSION\").eksABinary.$(uname -s | tr A-Z a-z).uri")
curl $EKS_ANYWHERE_TARBALL_URL \
--silent --location \
| tar xz ./eksctl-anywhere
sudo install -m 0755 ./eksctl-anywhere /usr/local/bin/eksctl-anywhere
export OS="$(uname -s | tr A-Z a-z)" ARCH=$(test "$(uname -m)" = 'x86_64' && echo 'amd64' || echo 'arm64')
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/${OS}/${ARCH}/kubectl"
sudo install -m 0755 ./kubectl /usr/local/bin/kubectl
クラスター用の VM を作成
今回は、シングルノードで クラスターを作成します。クラスターのノードとなる VM を作成しましょう。

空の VM を作成
ESXi で以下の設定で空の VM を作成してください。
ゲスト OS
Linux
Other Linux 5.x
ネットワーク
MAC アドレス
00:50:56:bd:ba:da
ハードディスク
仮想デバイスノード
SCSI コントローラーから IDE へ変更

クラスター用の インベントリファイル (hardware.csv) を作成
EKS-A のインストーラーは、ノードとなるマシンのリストを CSV 形式のファイルを渡すことで設定します。
以下のファイルを Admin Machine に用意してください。
CSV ファイル
記述内容
hostname,bmc_ip,bmc_username,bmc_password,mac,ip_address,netmask,gateway,nameservers,labels,disk
expt-eksa-mgmt-cp01,,,,00:50:56:bd:ba:da,10.8.20.5,255.255.0.0,10.8.0.1,10.8.0.1,type=cp,/dev/sda
クラスターの設定ファイルを作成
さらに、Kubernetes のバージョンなど、構築するクラスターの設定を yaml ファイルで定義します。以下のコマンドで、定義ファイルを生成することができます。
yaml ファイル
コマンド
export CLUSTER_NAME=expt-eksa-mgmt
eksctl anywhere generate clusterconfig $CLUSTER_NAME --provider tinkerbell > expt-eksa-mgmt-cluster.yaml
設定内容
今回は、以下の設定でクラスターの定義ファイルを作成します。
apiVersion: anywhere.eks.amazonaws.com/v1alpha1
kind: Cluster
metadata:
name: expt-eksa-mgmt
spec:
clusterNetwork:
cniConfig:
cilium: {}
pods:
cidrBlocks:
- 10.20.0.0/16
services:
cidrBlocks:
- 10.30.0.0/16
controlPlaneConfiguration:
count: 1
endpoint:
host: "10.8.10.20"
machineGroupRef:
kind: TinkerbellMachineConfig
name: expt-eksa-mgmt-cp
datacenterRef:
kind: TinkerbellDatacenterConfig
name: expt-eksa-mgmt
kubernetesVersion: "1.27"
managementCluster:
name: expt-eksa-mgmt
---
apiVersion: anywhere.eks.amazonaws.com/v1alpha1
kind: TinkerbellDatacenterConfig
metadata:
name: expt-eksa-mgmt
spec:
tinkerbellIP: "10.8.10.10"
---
apiVersion: anywhere.eks.amazonaws.com/v1alpha1
kind: TinkerbellMachineConfig
metadata:
name: expt-eksa-mgmt-cp
spec:
hardwareSelector:
type: cp
osFamily: bottlerocket
templateRef: {}
users:
- name: ec2-user
Pod、Serviceの CIDR
Pod の CIDR や Kubernetes API の IP などは想定ネットワークの通りに作成しています。
Pod、Serviceの CIDR は、マシンのネットワークと重複しないプライベートアドレスを指定します。

クラスター作成コマンドの実行
ここまで出来たら、以下コマンドを実行し、クラスター作成フローを開始します。
コマンドを実行すると、Kind でローカルに Kubernetes クラスター (Bootstrap クラスターと呼ばれます) が作成されます。Bootstrap クラスターには EKS Anywhere クラスターを構築するためのコントロールプレーンがデプロイされます。
後述の手順でノードとなるマシンを立ち上げると、マシンはネットワークブートによりこのコントロールプレーンにアクセスしながら、ノードの OS や Kubernetes 環境を構築していきます。フローを示す図を以下に再掲します。
フローについての詳細は以下のドキュメントもご参照ください。
https://anywhere.eks.amazonaws.com/docs/getting-started/baremetal/overview/

クラスターを作成
コマンド
eksctl anywhere create cluster --hardware-csv expt-eksa-mgmt-hardware.csv -f expt-eksa-mgmt-cluster.yaml
Warning: The recommended number of control plane nodes is 3 or 5
Warning: No configurations provided for worker node groups, pods will be scheduled on control-plane nodes
Warning: The recommended number of control plane nodes is 3 or 5
Warning: No configurations provided for worker node groups, pods will be scheduled on control-plane nodes
Performing setup and validations
✅ Tinkerbell Provider setup is valid
✅ Validate OS is compatible with registry mirror configuration
✅ Validate certificate for registry mirror
✅ Validate authentication for git provider
✅ Validate cluster's eksaVersion matches EKS-A version
Creating new bootstrap cluster
Provider specific pre-capi-install-setup on bootstrap cluster
Installing cluster-api providers on bootstrap cluster
Provider specific post-setup
Creating new workload cluster
クラスターの VM を起動する
作成した クラスター用の VM を起動すると、PXE ブートによりクラスター構築が開始されます。
起動したノード内のフローを簡単に補足すると、PXE ブートでまず起動するのは、Hook というオンメモリで起動する小さな OS です。この Hook では Tink Worker というエージェントが稼働しています。Tink Worker が、Admin Machine で稼働しているコントロールプレーンと通信しながら構築ワークフローを実行します。ワークフローでは、ノードの OS となる Bottlerocket ( Ubuntu や RHEL もサポート) をデバイスに書き込んだり、ネットワークを設定したりします。
その後、ノードで cloud-init が起動し、クラスターの構築、設定が実行されます。
このフローは、Tinkerbell というベアメアル環境のセットアップを自動化する OSS ツールで実行されています。
構築のログを確認
Admin Machine から以下のコマンドで構築のログを確認出来ます。
docker logs boots -f
Kubernetes クラスターへのアクセスを確認する
正常にクラスターの構築が終了すると、 Admin Machine の eksctl anywhere create cluster コマンドが完了し、クラスターへアクセスするための kubeconfig ファイルも作成されます。 以下のコマンドで、クラスターへアクセスできることを確認します。
export KUBECONFIG=$(pwd)/${CLUSTER_NAME}/${CLUSTER_NAME}-eks-a-cluster.kubeconfig
kubectl get nodes
まとめ
この記事では、Amazon EKS Anywhere のベアメタルサポートについてクラスターを構築するまでの手順を ESXi で実際に体験してみました。Amazon EKS Anywhere にはベアメタルだけではなく、ネイティブの vSphere サポートもありますので、実際に ESXi でベアメタルサポートを利用することはないかもしれません。しかし、仮想環境で使うことで、実際の動作を簡単に検証することができます。ぜひ、EKS Anywhere で色々試してみてください。
筆者プロフィール
林 政利 (@literalice)
アマゾン ウェブ サービス ジャパン合同会社
コンテナスペシャリスト ソリューションアーキテクト
フリーランスや Web 系企業で業務システムや Web サービスの開発、インフラ運用に従事。近年はベンダーでコンテナ技術の普及に努めており、現在、AWS Japan で Amazon ECS や Amazon EKS でのコンテナ運用や開発プロセス構築を中心にソリューションアーキテクトとして活動中。
