仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

EKS AnywhereをvSphereプロバイダーで利用してみる

Amazon EKS Anywhere は、プライベートのオンプレミス環境でKubernetesクラスターを作成および運用できるようにする、AWS がサポート可能なAmazon EKSのための新しいデプロイオプションです。名前が示すように「どこでも、EKSのような環境を」を目指して開発されているOSSのソフトウェアです。

aws.amazon.com

現在はDockerとvSphere環境に対して、EKSのようなコンテナクラスターを作成して利用できます。特にvSphereをバックエンドに利用することで、実運用にも耐えうるKubernetesクラスター環境を導入できます。将来はベアメタルサポートや他のデプロイターゲットへの対応も予定されているようで、非常に楽しみなプロジェクトになっています。

Amazon EKS AnywhereのDockerでの実行は非常に簡単で、EKS Anywhereに必要なパッケージをインストールした後、ローカルクラスターの作成を行うだけで、あっという間に作成できます。

今回は、公式サイトの「Production cluster」として想定されている、vSphereプロバイダーベースでセットアップしてみます。

anywhere.eks.amazonaws.com

テスト環境

現在の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を利用)

セットアップの流れ

コンフィグ例

こんな感じで定義ファイルを作成します。

$ 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のようなものを構築して、外部からアクセスする経路が必要になりそうです。

いずれ、試してみたいと思います。

qiita.com

はまったこと

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側は特にありませんでした。