Amazon EKS Anywhere は、プライベートのオンプレミス環境でKubernetesクラスターを作成および運用できるようにする、AWS がサポート可能なAmazon EKSのための新しいデプロイオプションです。名前が示すように「どこでも、EKSのような環境を」を目指して開発されているOSSのソフトウェアです。
現在はDockerとvSphere環境に対して、EKSのようなコンテナクラスターを作成して利用できます。特にvSphereをバックエンドに利用することで、実運用にも耐えうるKubernetesクラスター環境を導入できます。将来はベアメタルサポートや他のデプロイターゲットへの対応も予定されているようで、非常に楽しみなプロジェクトになっています。
Amazon EKS AnywhereのDockerでの実行は非常に簡単で、EKS Anywhereに必要なパッケージをインストールした後、ローカルクラスターの作成を行うだけで、あっという間に作成できます。
今回は、公式サイトの「Production cluster」として想定されている、vSphereプロバイダーベースでセットアップしてみます。
テスト環境
現在のEKS AnywhereのvSphereモードはvSphere 7.0以降のバージョンが必須要件とのことで、以下を用意しました。
- VMware ESXi, 7.0.3, 19482537
- VMware vCenter Server (vCSA), 7.0.3 19480866
- EKS Anywhere CLIを実行するマシン(Dockerベースで動かしたときに使ったUbuntu Serverを利用)
セットアップの流れ
- それぞれインストール
- vCenterにESXiホストを追加
- 以下を参考に、フォルダ、リソースグループなど作成
- 以下のドキュメントに従いクラスタ作成
コンフィグ例
こんな感じで定義ファイルを作成します。
$ CLUSTER_NAME=mgmt $ eksctl anywhere generate clusterconfig $CLUSTER_NAME \ --provider vsphere > eksa-cluster.yaml
定義ファイルを以下の内容に合わせて、各自設定を書き加えます。
インフラのIPアドレスを確認しておきます。
- vCenter: 172.16.214.226
- ESXi: 172.17.28.69
インフラの各種設定を確認しておきます。
- DC: Datacenter
- datastore: datastore2
特にネットワークについてはDHCPサーバーが動いている必要があるようです。
- network: vmpg (ポートグループ)
EKS Anywhereのリソースを格納するための仮想マシンフォルダーとリソースプールを作成しておきます。
- Folder: eksa
- Resoucepool: eksa
そのほか、YAMLにsshキーペアも公開鍵を入力します。これはSSHアクセスする場合に使うものなので、自分の公開鍵を入力しておきます。
クラスタ作成
クラスタ作成前にvSphete環境へのアクセス情報を設定しておきます。ユーザー名はvCenter Serverをセットアップしたときに設定したドメイン名を入力します。デフォルトのユーザー名はadministratorです。
export EKSA_VSPHERE_USERNAME='administrator@vsphere.local' export EKSA_VSPHERE_PASSWORD='hogehuga5656#'
コマンド履歴にパスワードなどが残るのが嫌であれば、シェルスクリプトなどにしてsourceコマンドで読み込むと良いでしょう。
#!/bin/bash export EKSA_VSPHERE_USERNAME='administrator@vsphere.local' export EKSA_VSPHERE_PASSWORD='hogehuga5656#' $ source eksa-env.sh
先に作っておいた定義ファイルを使って、クラスターを作成します。実行には30分から45分程度、時間を要します。
$ eksctl anywhere create cluster -f eksa-cluster.yaml ... 5967 kind create cluster --name prod-eks-a-cluster --kubeconfig prod/generated/prod.kind.kubeconfig --image public.ecr.aws/eks-anywhere/kubernetes-sigs/kind/node:v1.22.6-eks-d-1-22-4-eks-a-8 --config prod/generated/kind_tmp.yaml"} Creating cluster "prod-eks-a-cluster" ... • Ensuring node image (public.ecr.aws/eks-anywhere/kubernetes-sigs/kind/node:v1.22.6-eks-d-1-22-4-eks-a-8) 🖼 ... ✓ Ensuring node image (public.ecr.aws/eks-anywhere/kubernetes-sigs/kind/node:v1.22.6-eks-d-1-22-4-eks-a-8) 🖼 • Preparing nodes 📦 ... ✓ Preparing nodes 📦 • Writing configuration 📜 ... ✓ Writing configuration 📜 • Starting control-plane 🕹️ ... ✓ Starting control-plane 🕹️ • Installing CNI 🔌 ... ✓ Installing CNI 🔌 • Installing StorageClass 💾 ... ✓ Installing StorageClass 💾 Set kubectl context to "kind-prod-eks-a-cluster" You can now use your cluster with: kubectl cluster-info --context kind-prod-eks-a-cluster --kubeconfig prod/generated/prod.kind.kubeconfig ... 2022-04-26T08:10:19.059Z V0 🎉 Cluster created! 2022-04-26T08:10:19.059Z V4 Task finished {"task_name": "delete-kind-cluster", "duration": "2.973199312s"} 2022-04-26T08:10:19.059Z V4 ---------------------------------- 2022-04-26T08:10:19.059Z V4 Tasks completed {"duration": "17m29.859655637s"} 2022-04-26T08:10:19.059Z V3 Logging out from current govc session 2022-04-26T08:10:19.059Z V6 Executing command {"cmd": "/usr/bin/docker exec -i -e GOVC_PASSWORD=***** -e GOVC_URL=172.16.214.226 -e GOVC_INSECURE=true -e GOVC_USERNAME=***** eksa_1650959566562915967 govc session.logout"} 2022-04-26T08:10:19.304Z V6 Executing command {"cmd": "/usr/bin/docker exec -i -e GOVC_USERNAME=***** -e GOVC_PASSWORD=***** -e GOVC_URL=172.16.214.226 -e GOVC_INSECURE=true eksa_1650959566562915967 govc session.logout -k"} 2022-04-26T08:10:19.601Z V3 Cleaning up long running container {"name": "eksa_1650959566562915967"} 2022-04-26T08:10:19.601Z V6 Executing command {"cmd": "/usr/bin/docker rm -f -v eksa_1650959566562915967"}
Cluster created!
と表示されることを願っていましょう。
動作確認
クラスターが作成されたら、kubeconfigを使ってクラスターにアクセスしてみましょう。定義ファイルを開くとmetadata nameでprod
が指定されているはずです。このディレクトリーが作られていると思います。その中にkubeconfigがコピーされています。
$ export KUBECONFIG=~/prod/prod-eks-a-cluster.kubeconfig (kubeconfigを読み込む) $ kubectl get no NAME STATUS ROLES AGE VERSION 172-16-5-123.local.virtualtech.jp Ready control-plane,master 26m v1.22.6-eks-b18cdc9 172-16-5-195.local.virtualtech.jp Ready control-plane,master 22m v1.22.6-eks-b18cdc9 172-16-6-13.local.virtualtech.jp Ready <none> 22m v1.22.6-eks-b18cdc9 172-16-6-67.local.virtualtech.jp Ready <none> 22m v1.22.6-eks-b18cdc9 (ノードを確認) $ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE standard (default) csi.vsphere.vmware.com Delete Immediate false 22m (ストレージドライバがセットアップ済み。ストレージクラスで永続ボリュームを利用可能) $ kubectl get machines -A NAMESPACE NAME CLUSTER NODENAME PROVIDERID PHASE AGE VERSION eksa-system prod-7sxr9 prod 172-16-5-195.local.virtualtech.jp vsphere://4204198a-91ab-eb6f-6eca-e42397b34a2b Running 22m v1.22.6-eks-1-22-4 eksa-system prod-9lcqd prod 172-16-5-123.local.virtualtech.jp vsphere://42043573-9118-799f-fe5f-a809735c3614 Running 22m v1.22.6-eks-1-22-4 eksa-system prod-etcd-dpgcq prod vsphere://42042ddc-9696-ee32-aa2b-e5357b9e39bf Running 22m eksa-system prod-etcd-jkq4v prod vsphere://4204913b-747e-199e-ce10-7818be5d40b9 Running 22m eksa-system prod-etcd-t626w prod vsphere://4204acd7-339d-c607-f1a0-334293e44ee1 Running 22m eksa-system prod-md-0-577fbdbf7c-dgll5 prod 172-16-6-67.local.virtualtech.jp vsphere://42045a05-e0f1-486b-5efd-b0ae2b245689 Running 22m v1.22.6-eks-1-22-4 eksa-system prod-md-0-577fbdbf7c-rvcbt prod 172-16-6-13.local.virtualtech.jp vsphere://420411ed-3cc0-ac18-d55c-ec5151b9afb9 Running 22m v1.22.6-eks-1-22-4 (マシンの確認)
テストアプリの起動
いつものテストアプリを動かしてみましょう。NGINX Serverを起動するだけのものです。
$ cat nginx-demo-deployment.yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: nginxapp1 spec: replicas: 1 selector: matchLabels: app: nginxapp1 template: metadata: labels: app: nginxapp1 spec: containers: - name: nginxapp1 image: docker.io/library/nginx:alpine ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginxapp1-nodeport labels: app: nginxapp1 spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 selector: app: nginxapp1 $ kubectl apply -f nginx-demo-deployment.yaml $ kubectl get no -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME 172-16-5-123.local.virtualtech.jp Ready control-plane,master 39m v1.22.6-eks-b18cdc9 172.16.5.123 172.16.5.123 Bottlerocket OS 1.6.2 (vmware-k8s-1.22) 5.10.102 containerd://1.5.9+bottlerocket 172-16-5-195.local.virtualtech.jp Ready control-plane,master 35m v1.22.6-eks-b18cdc9 172.16.5.195 172.16.5.195 Bottlerocket OS 1.6.2 (vmware-k8s-1.22) 5.10.102 containerd://1.5.9+bottlerocket 172-16-6-13.local.virtualtech.jp Ready <none> 35m v1.22.6-eks-b18cdc9 172.16.6.13 172.16.6.13 Bottlerocket OS 1.6.2 (vmware-k8s-1.22) 5.10.102 containerd://1.5.9+bottlerocket 172-16-6-67.local.virtualtech.jp Ready <none> 36m v1.22.6-eks-b18cdc9 172.16.6.67 172.16.6.67 Bottlerocket OS 1.6.2 (vmware-k8s-1.22) 5.10.102 containerd://1.5.9+bottlerocket (ノード一覧を確認) $ kubectl get po NAME READY STATUS RESTARTS AGE nginxapp1-7579cccdf9-hm42w 1/1 Running 0 2m22s $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40m nginxapp1-nodeport NodePort 10.96.34.137 <none> 80:30080/TCP 2m25s (NGINX Podとサービスを確認) (ノードポート経由でアクセスしてみます) $ curl 172.16.6.13:30080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> $ curl 172.16.6.67:30080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
問題なく動きました。
EKS Anywhere のいいところ
EKS Anywhere はKubernetesのクラスター作成がコマンド一発で一通り動かせることがいいところだと思います。 ある程度みんなで使うKubernetesクラスターであればkubeadmなどを使ってクラスターを作成すると思いますが、kubeadmは他のKubernetesインストールツールと異なり、Kubernetesクラスターを作るまでしか行ってくれません。例えばkubeadmを含めて必要なソフトウェア(例えばkubeadm,kubelet)やコンテナランタイム(例えばcontainerd, CRI-Oなど)は事前に用意する必要がありますし、クラスターを作成した後は最低限、ネットワークのアドオン(例えばCalico,Canal,Flannelなど)の追加が必要です。
一方、EKS AnywhereはノードのOSのセットアップからクラスター作成、その他諸々をコマンド一発で作成してくれるので、クラスター作成から利用開始までの手間を考えると非常に便利と言えると思います。ノードに用いられるOSも、一般的なLinux OSとは異なり、コンテナ利用に特化したOSが用いられている点も評価できると思います。
aws.amazon.com www.publickey1.jp
ちなみに今回は検証しませんでしたが、EKS Connectorを利用すると、AWSマネジメントコンソールにEKS Anywhereで構築したクラスターを登録することが可能とのことです。ただ、これを使うには別途独自にIngressのようなものを構築して、外部からアクセスする経路が必要になりそうです。
いずれ、試してみたいと思います。
はまったこと
vCSAのインストールでエラー発生で詰む
Linuxデスクトップ環境からVCSAのセットアップをしようと思ったが、デプロイ中に「A problem occurred while reading the OVA file.: TypeError: Cannot read property 'length' of undefined」というエラーになり、それ以上進めないという事象が発生しました。
Linuxで実行した時は次のような実行ログが出ていました。 --trace-deprecation
をつけてもつけなくても出てきたログは一緒で、何か想定しているファイルがないようです。vcsa-ui-installer/lin64/resources/app/dist
ディレクトリーとその下にファイルがいくつかあるところまでは確認しましたが、今回は諦めて他のOSを使ってデプロイすることにしました。
$ ./installer --trace-deprecation (node:64745) electron: Failed to load URL: file:///media/vcsa-ui-installer/lin64/resources/app/dist/# with error: ERR_FILE_NOT_FOUND (Use `installer --trace-warnings ...` to show where the warning was created) (node:64792) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead. (Use `exe --trace-deprecation ...` to show where the warning was created)
エラーで検索すると、以下の書き込みがヒットしました。vCSAのインストーラのバグみたいです。
回避策として、Windows Server 2019でWindows版のvCSAインストーラーで実行したらうまく動作しました。その後、上記エラーはUbuntu Desktop 22.04でも発生しないことを手元で確認しています(ただしUbuntuではそれ以降は進めていないのでデプロイまでできるかは試していません)。vCSAインストーラーはWindows, macOS, Linuxに対応していますが、Linux版はGNOMEのバージョンとか色々な要件があるのかもしれません。IssueにもCentOS 8でセットアップできなかったとあるので、同じバージョンのRHELやRHELクローンでも同様かと思います。
というわけで、はまったことはEKS Anywhere側は特にありませんでした。