メインコンテンツに移動
デベロッパーのためのクラウド活用方法

Amazon EKS Anywhere ベアメタルサポートを仮想環境 (VMware ESXi) で検証する

2024-01-04 | Author : 林 政利

はじめに

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


X ポスト » | Facebook シェア » | はてブ »

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。

今すぐ登録 »

専用の仮想ネットワークを構築する

A Japanese-language architecture diagram illustrating the components and workflow of EKS Anywhere (EKS-A) installation and operation, including AWS, EKSctl installer, agent, and Kubernetes icons.

EKS-A のベアメタルサポートでは、EKS Anywhere が提供する DHCP で PXE ブートを行い Kubernetes のノードを構築していきます。

A network architecture diagram illustrating example IP address space allocation and network components for Amazon Elastic Kubernetes Service (EKS) clusters, including floating IPs, pod IP ranges, and subnets.

ここでは、既存 DHCP の影響を避けるため、DHCP が存在しない新しい仮想ネットワークを検証環境用に用意することとします。
本記事のステップ全体で、以下の環境の構築を目指します。

ネットワークを追加

A Japanese-language architecture diagram illustrating the components and workflow of EKS Anywhere (EKS-A) installation and operation, including AWS, EKSctl installer, agent, and Kubernetes icons.

ESXi に新しいネットワークを追加します。

Screenshot of the vSphere Client interface in Japanese, highlighting a vCenter environment with EKS Anywhere Admin and several virtual machines. The Actions menu is open, displaying VM management options.

ここでは、既存 DHCP の影響を避けるため、DHCP が存在しない新しい仮想ネットワークを検証環境用に用意することとします。
本記事のステップ全体で、以下の環境の構築を目指します。

EKS Anywhere のネットワーク追加ウィザードの設定確認画面。標準スイッチ(vSwitch0)および新規ポートグループ(EKS Anywhere)、VLAN ID(2)の設定内容が日本語で表示されている。

ここでは、以下の設定でネットワークを作成しています。VLAN ID は適当なユニークなものを指定してください。

ルーターの作成

A network architecture diagram illustrating subnet and IP address allocation for Amazon EKS (Elastic Kubernetes Service) clusters, including floating IPs and segmentation of Kubernetes nodes. The diagram contains textual annotations in Japanese and visualizes CIDR blocks, Kubernetes pods IP ranges, and floating IP implementation.

この手順では、 Ubuntu でルーターを作成します。

Ubuntu Server ISO イメージを ESXi にアップロード

Screenshot of the EKS Anywhere Admin ISO directory in the VMware vCenter datastore interface. The view is in Japanese and shows folders and ISO image files, including upload options and file details.

Ubuntu 22.04 のイメージをダウンロードして、ESXi のデータストアにアップロードしておきます。

VM の作成と起動

VMwareの仮想マシン設定編集画面。router1に2つのネットワークアダプタ(ひとつはEKS Anywhere接続)、CPUやメモリ、ハードディスク、ディスクファイル、CD/DVDドライブ設定などの詳細が表示されている。

以下の設定で VM を作成します。

CD/DVD ドライブには前手順でアップロードした Ubuntu Server の iso イメージを設定してください。VM の作成が終わったら、そのまま UI から起動しましょう。

Ubuntu Server のインストール

インストーラーの指示に従い、Ubuntu Server をインストールします。この手順では、Minimized 版を選択してインストールしました。

ネットワークの設定

ネットワーク設定は 以下の netplan の設定ファイルを参考にしてください。

cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  ethernets:
    # WAN 側の設定は IPv4 を想定
    # IP アドレスを固定する
    ens33:
      addresses:
        - 192.168.1.200/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers: # WAN 側のルーターに合わせて設定
        addresses:
          - 192.168.1.1
    # LAN 側の設定
    ens34:
      addresses:
        - 10.8.0.1/16
  version: 2

ルーティング設定

/etc/sysctl.conf を以下の通り編集し、IPv4 のフォワーディングを設定します。

# コメントアウトを外す 
net.ipv4.ip_forward=1

以下コマンドで設定を適用します。

sysctl -p

さらに、IPv4 のルーターとしてパケットのルーティングを設定します。ここでは ufw を使用するので、前もってインストールしておきます。

apt install ufw

ufw allow 22
ufw enable

/etc/default/ufw の修正し、Forward ポリシーを有効にします。

DEFAULT_FORWARD_POLICY="ACCEPT"

/etc/ufw/before.rules に以下を追加し、 LAN 側のマシンがインターネットと通信できるようにします。

# NAT
*nat
:POSTROUTING ACCEPT [0:0]
-F
-A POSTROUTING -s 10.8.0.0/16 -o ens33 -j MASQUERADE

COMMIT

以下コマンドで設定を適用します。

ufw reload

Amazon EKS Anywhere の構築

ネットワークの設定が完了したので、いよいよ EKS-A の構築に入ります。

Admin Machine の構築

Amazon EKS Anywhere のインストールコマンドを実行する、Admin Machine を作成します。

このマシンは、前述の通り、ネットワークブートのインフラや Kubernetes 環境構築のコントロールプレーンをホストするマシンです。
EKS Anywhere ネットワークに、Ubuntu の VM を作成します。ルーター作成の手順とほぼ同じですが、今回はマシンにログインした後様々な操作を実行するので、 Minimized 版ではなく通常の Ubuntu Server を構築しています。

ネットワーク設定、ポートの開放

ネットワークの設定は、以下の netplan の情報を参考にしてください。

json
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 のインストーラーやツール類をインストールします。

インストール方法

コマンド

bash
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 を作成しましょう。

A network architecture diagram showing subnet and IP address allocation in an Amazon EKS (Elastic Kubernetes Service) environment, including floating IPs, node IP ranges, and Kubernetes pod IP ranges.

空の VM を作成

ESXi で以下の設定で空の VM を作成してください。

  • ゲスト OS

    • Linux

    • Other Linux 5.x

  • ネットワーク

    • MAC アドレス

      • 00:50:56:bd:ba:da

  • ハードディスク

    • 仮想デバイスノード

      • SCSI コントローラーから IDE へ変更

Amazon EKS Anywhereのセットアップ中に表示される仮想マシンのハードウェアカスタマイズ設定画面(日本語UI)。CPU、メモリ、ディスク、ネットワークなどの詳細設定が確認できます。

クラスター用の インベントリファイル (hardware.csv) を作成

EKS-A のインストーラーは、ノードとなるマシンのリストを CSV 形式のファイルを渡すことで設定します。
以下のファイルを Admin Machine に用意してください。

CSV ファイル

記述内容

xml
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 ファイル

コマンド

xml
export CLUSTER_NAME=expt-eksa-mgmt
eksctl anywhere generate clusterconfig $CLUSTER_NAME --provider tinkerbell > expt-eksa-mgmt-cluster.yaml

設定内容

今回は、以下の設定でクラスターの定義ファイルを作成します。

json
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 は、マシンのネットワークと重複しないプライベートアドレスを指定します。

A network architecture diagram illustrating an Amazon Elastic Kubernetes Service (EKS) deployment. It shows the use of floating IP addresses (10.8.10.20/16), Kubernetes pod IP ranges (10.20.0.0/16 and 10.30.0.0/16), and integration with network segments (192.168.x.x, 10.8.x.x). Key components such as servers, pods, and networking boundaries are visually mapped for understanding multi-subnet or hybrid EKS network setups.

クラスター作成コマンドの実行

ここまで出来たら、以下コマンドを実行し、クラスター作成フローを開始します。

コマンドを実行すると、Kind でローカルに Kubernetes クラスター (Bootstrap クラスターと呼ばれます) が作成されます。Bootstrap クラスターには EKS Anywhere クラスターを構築するためのコントロールプレーンがデプロイされます。
後述の手順でノードとなるマシンを立ち上げると、マシンはネットワークブートによりこのコントロールプレーンにアクセスしながら、ノードの OS や Kubernetes 環境を構築していきます。フローを示す図を以下に再掲します。

フローについての詳細は以下のドキュメントもご参照ください。
https://anywhere.eks.amazonaws.com/docs/getting-started/baremetal/overview/

A Japanese-language architecture diagram illustrating the components and workflow of EKS Anywhere (EKS-A) installation and operation, including AWS, EKSctl installer, agent, and Kubernetes icons.

クラスターを作成

コマンド

bash
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 から以下のコマンドで構築のログを確認出来ます。

bash
docker logs boots -f

Kubernetes クラスターへのアクセスを確認する

正常にクラスターの構築が終了すると、 Admin Machine の eksctl anywhere create cluster コマンドが完了し、クラスターへアクセスするための kubeconfig ファイルも作成されます。 以下のコマンドで、クラスターへアクセスできることを確認します。

bash
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 でのコンテナ運用や開発プロセス構築を中心にソリューションアーキテクトとして活動中。

A person smiling outdoors in a park-like setting with colorful trees in the background, wearing a jacket. Photo taken in 2023.