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

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


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

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

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

ネットワークを追加

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

クリックすると拡大します

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

クリックすると拡大します

ルーターの作成

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

クリックすると拡大します

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

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

クリックすると拡大します

VM の作成と起動

以下の設定で 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 の情報を参考にしてください。

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

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

  • ゲスト OS
    • Linux
    • Other Linux 5.x
  • ネットワーク
    • MAC アドレス
      • 00:50:56:bd:ba:da
  • ハードディスク
    • 仮想デバイスノード
      • SCSI コントローラーから IDE へ変更

クリックすると拡大します

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

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

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 ファイルで定義します。以下のコマンドで、定義ファイルを生成することができます。

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 の 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

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 で色々試してみてください。


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

林 政利 (@literalice)
アマゾン ウェブ サービス ジャパン合同会社
コンテナスペシャリスト ソリューションアーキテクト

フリーランスや Web 系企業で業務システムや Web サービスの開発、インフラ運用に従事。近年はベンダーでコンテナ技術の普及に努めており、現在、AWS Japan で Amazon ECS や Amazon EKS でのコンテナ運用や開発プロセス構築を中心にソリューションアーキテクトとして活動中。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する