EKS Anyhereが一般公開されたので試してみました。
目次
環境
以下にドキュメントがあります。
Prerequisiteについては、Install EKS Anywhere | EKS Anywhere にあります。
Administrative machine prerequisites
- Docker 20.x.x
- Mac OS (10.15) / Ubuntu (20.04.2 LTS)
- 4 CPU cores
- 16GB memory
- 30GB free disk space
結構スペックが必要。あと、クラスタについては、以下の2種類のようです。
- local cluster
- ローカルなシングルクラスタ
- Dockerがあればよさそう
- production cluster
- vShpereが必要
準備
ということで、今回はlocal clusterを使ってみます。手元のMacで作ってもいいんだけど、まずはVagrant上のUbuntuでやってみます。Vagrantfileはこんな感じで。vagrant-disksizeプラグインが必要です。
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.network "private_network", ip: "192.168.33.10" config.disksize.size = "100GB" config.vm.provider "virtualbox" do |vb| vb.gui = false vb.cpus = 4 vb.memory = "8192" vb.customize ["modifyvm", :id, "--ioapic", "on"] end config.vm.provision "shell", inline: <<-SHELL apt-get update apt-get upgrade -y SHELL end
うちのMBPはメモリが16GBなので、そこだけ減らしました。(32GBほしい・・・)
VMをあげてsshします。
$ vagrant up $ vagrant ssh
Ubuntuの場合は標準のDockerではなくてDocker CEを使う必要があるようなので、以下に従って入れ替えます。
$ sudo apt-get remove docker docker-engine docker.io containerd runc $ sudo apt-get update $ sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $ sudo apt-get update $ sudo apt-get install -y docker-ce docker-ce-cli containerd.io
vagrantユーザでもdockerコマンドが使えるようにして、hello-worldが動くかを確認しましょう。
$ sudo usermod -aG docker $USER $ newgrp docker $ docker run hello-world (snip) Hello from Docker! This message shows that your installation appears to be working correctly. (snip)
dockerがサービスで立ち上がるようにしておきます。
$ sudo systemctl enable docker.service $ sudo systemctl enable containerd.service
一旦抜けてrebootしておきます。
$ vagrant reload
これで準備完了です。
EKS Anywhereのインストール
ここからは以下の手順に従って実施していきます。
EKS Anywhere CLI toolsのインストール
$ curl "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" \ --silent --location \ | tar xz -C /tmp $ sudo mv /tmp/eksctl /usr/local/bin/
バージョンを確認。
$ eksctl version 0.66.0
EKS Anywhere pluginのインストール
$ export EKSA_RELEASE="0.5.0" OS="$(uname -s | tr A-Z a-z)" $ curl "https://anywhere-assets.eks.amazonaws.com/releases/eks-a/1/artifacts/eks-a/v${EKSA_RELEASE}/${OS}/eksctl-anywhere-v${EKSA_RELEASE}-${OS}-amd64.tar.gz" \ --silent --location \ | tar xz ./eksctl-anywhere $ sudo mv ./eksctl-anywhere /usr/local/bin/
pluginをインストールすると、以下のようにeksctlからバージョンが確認できるみたい。
$ eksctl anywhere version v0.5.0
ローカルクラスタの作成
クラスタ作成用のコンフィグを生成します。
$ CLUSTER_NAME=dev-cluster $ eksctl anywhere generate clusterconfig $CLUSTER_NAME \ --provider docker > $CLUSTER_NAME.yaml
生成されたコンフィグはこんな感じでした。
apiVersion: anywhere.eks.amazonaws.com/v1alpha1 kind: Cluster metadata: name: dev-cluster spec: clusterNetwork: cni: cilium pods: cidrBlocks: - 192.168.0.0/16 services: cidrBlocks: - 10.96.0.0/12 controlPlaneConfiguration: count: 1 datacenterRef: kind: DockerDatacenterConfig name: dev-cluster externalEtcdConfiguration: count: 1 kubernetesVersion: "1.21" workerNodeGroupConfigurations: - count: 1 --- apiVersion: anywhere.eks.amazonaws.com/v1alpha1 kind: DockerDatacenterConfig metadata: name: dev-cluster spec: {} ---
podネットワーク(192.168.0.0/16)が、vagrantのプライベートネットワーク(192.168.33.0/24)とかぶっているので、以下だけ変更しておきます。
pods: cidrBlocks: - 10.10.0.0/16
ではクラスタを作成します。メモリを減らしたせいかもしれませんが、かなり時間がかかります。
$ eksctl anywhere create cluster -f $CLUSTER_NAME.yaml Performing setup and validations Warning: The docker infrastructure provider is meant for local development and testing only ✅ Docker Provider setup is valid Creating new bootstrap cluster Installing cluster-api providers on bootstrap cluster Provider specific setup Creating new workload cluster Installing networking on workload cluster Installing storage class on workload cluster Installing cluster-api providers on workload cluster Moving cluster management from bootstrap to workload cluster Installing EKS-A custom components (CRD and controller) on workload cluster Creating EKS-A CRDs instances on workload cluster Installing AddonManager and GitOps Toolkit on workload cluster GitOps field not specified, bootstrap flux skipped Writing cluster config file Deleting bootstrap cluster 🎉 Cluster created!
クラスタが作成されると、クラスタ名のフォルダが作成され、その中にKUBECONFIGが生成されます。
vagrant@ubuntu-bionic:~$ tree . ├── dev-cluster │ ├── dev-cluster-eks-a-cluster.kubeconfig │ └── dev-cluster-eks-a-cluster.yaml └── dev-cluster.yaml 1 directory, 3 files
KUBECONFIGを読み込みます。
$ export KUBECONFIG=${PWD}/${CLUSTER_NAME}/${CLUSTER_NAME}-eks-a-cluster.kubeconfig
kubectlをインストールします。
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" $ chmod +x ./kubectl $ sudo mv ./kubectl /usr/local/bin/kubectl
kubectlでnodeやpodを見てみます。
$ kubectl get node NAME STATUS ROLES AGE VERSION dev-cluster-kl5rn Ready control-plane,master 14m v1.21.2-eks-1-21-4 dev-cluster-md-0-7c7f759fc6-zc6pc Ready <none> 14m v1.21.2-eks-1-21-4 $ kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE capd-system capd-controller-manager-659dd5f8bc-545s2 2/2 Running 0 13m capi-kubeadm-bootstrap-system capi-kubeadm-bootstrap-controller-manager-69889cb844-b8xz7 2/2 Running 0 13m capi-kubeadm-control-plane-system capi-kubeadm-control-plane-controller-manager-6ddc66fb75-5l4d8 2/2 Running 0 13m capi-system capi-controller-manager-db59f5789-nnnbm 2/2 Running 0 13m capi-webhook-system capi-controller-manager-64b8c548db-v8qw4 2/2 Running 0 13m capi-webhook-system capi-kubeadm-bootstrap-controller-manager-68b8cc9759-g8jcp 2/2 Running 0 13m capi-webhook-system capi-kubeadm-control-plane-controller-manager-7dc88f767d-n6l59 2/2 Running 0 13m cert-manager cert-manager-5f6b885b4-xs6j2 1/1 Running 0 15m cert-manager cert-manager-cainjector-bb6d9bcb5-w9h8v 1/1 Running 0 15m cert-manager cert-manager-webhook-56cbc8f5b8-6sz65 1/1 Running 0 15m eksa-system eksa-controller-manager-6769764b45-f6q48 2/2 Running 0 11m etcdadm-bootstrap-provider-system etcdadm-bootstrap-provider-controller-manager-54476b7bf9-kh9j4 2/2 Running 0 13m etcdadm-controller-system etcdadm-controller-controller-manager-d5795556-rgptd 2/2 Running 0 13m kube-system cilium-d9cfz 1/1 Running 0 15m kube-system cilium-operator-6bf46cc6c6-4hz6x 1/1 Running 0 15m kube-system cilium-operator-6bf46cc6c6-6c5np 1/1 Running 0 15m kube-system cilium-sxvjh 1/1 Running 0 15m kube-system coredns-7c68f85774-9rgx5 1/1 Running 0 15m kube-system coredns-7c68f85774-srzl7 1/1 Running 0 15m kube-system kube-apiserver-dev-cluster-kl5rn 1/1 Running 0 15m kube-system kube-controller-manager-dev-cluster-kl5rn 1/1 Running 0 15m kube-system kube-proxy-2fjqz 1/1 Running 0 15m kube-system kube-proxy-kt84t 1/1 Running 0 15m kube-system kube-scheduler-dev-cluster-kl5rn 1/1 Running 0 15m
とりあえず動いているようですね。ただ、-o wideつけるとわかるのですが、pods.cidrBlocksを変更(→10.10.0.0/16)したのが反映されていないのかな?ただここを変更しないとクラスタ作成がコケたような気がします(もう覚えてない)
$ kubectl get pod --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES capd-system capd-controller-manager-659dd5f8bc-545s2 2/2 Running 0 32m 192.168.1.102 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> capi-kubeadm-bootstrap-system capi-kubeadm-bootstrap-controller-manager-69889cb844-b8xz7 2/2 Running 0 32m 192.168.0.140 dev-cluster-kl5rn <none> <none> capi-kubeadm-control-plane-system capi-kubeadm-control-plane-controller-manager-6ddc66fb75-5l4d8 2/2 Running 0 32m 192.168.0.11 dev-cluster-kl5rn <none> <none> capi-system capi-controller-manager-db59f5789-nnnbm 2/2 Running 0 33m 192.168.0.116 dev-cluster-kl5rn <none> <none> capi-webhook-system capi-controller-manager-64b8c548db-v8qw4 2/2 Running 0 33m 192.168.1.144 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> capi-webhook-system capi-kubeadm-bootstrap-controller-manager-68b8cc9759-g8jcp 2/2 Running 0 33m 192.168.1.202 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> capi-webhook-system capi-kubeadm-control-plane-controller-manager-7dc88f767d-n6l59 2/2 Running 0 32m 192.168.0.149 dev-cluster-kl5rn <none> <none> cert-manager cert-manager-5f6b885b4-xs6j2 1/1 Running 0 34m 192.168.1.182 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> cert-manager cert-manager-cainjector-bb6d9bcb5-w9h8v 1/1 Running 0 34m 192.168.1.150 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> cert-manager cert-manager-webhook-56cbc8f5b8-6sz65 1/1 Running 0 34m 192.168.1.199 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> eksa-system eksa-controller-manager-6769764b45-f6q48 2/2 Running 0 30m 192.168.0.87 dev-cluster-kl5rn <none> <none> etcdadm-bootstrap-provider-system etcdadm-bootstrap-provider-controller-manager-54476b7bf9-kh9j4 2/2 Running 0 32m 192.168.1.64 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> etcdadm-controller-system etcdadm-controller-controller-manager-d5795556-rgptd 2/2 Running 0 32m 192.168.1.82 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> kube-system cilium-d9cfz 1/1 Running 0 34m 172.18.0.5 dev-cluster-kl5rn <none> <none> kube-system cilium-operator-6bf46cc6c6-4hz6x 1/1 Running 0 34m 172.18.0.6 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> kube-system cilium-operator-6bf46cc6c6-6c5np 1/1 Running 0 34m 172.18.0.5 dev-cluster-kl5rn <none> <none> kube-system cilium-sxvjh 1/1 Running 0 34m 172.18.0.6 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> kube-system coredns-7c68f85774-9rgx5 1/1 Running 0 35m 192.168.1.101 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> kube-system coredns-7c68f85774-srzl7 1/1 Running 0 35m 192.168.1.155 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> kube-system kube-apiserver-dev-cluster-kl5rn 1/1 Running 0 35m 172.18.0.5 dev-cluster-kl5rn <none> <none> kube-system kube-controller-manager-dev-cluster-kl5rn 1/1 Running 0 35m 172.18.0.5 dev-cluster-kl5rn <none> <none> kube-system kube-proxy-2fjqz 1/1 Running 0 35m 172.18.0.5 dev-cluster-kl5rn <none> <none> kube-system kube-proxy-kt84t 1/1 Running 0 34m 172.18.0.6 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none> kube-system kube-scheduler-dev-cluster-kl5rn 1/1 Running 0 35m 172.18.0.5 dev-cluster-kl5rn <none> <none>
テスト
以下に従って、テストしてみましょう。
$ kubectl apply -f "https://anywhere.eks.amazonaws.com/manifests/hello-eks-a.yaml" deployment.apps/hello-eks-a created service/hello-eks-a create
$ kubectl get pods -l app=hello-eks-a -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES hello-eks-a-9644dd8dc-bj7l5 1/1 Running 0 20s 192.168.1.86 dev-cluster-md-0-7c7f759fc6-zc6pc <none> <none>
$ kubectl port-forward deploy/hello-eks-a 8000:80 & Forwarding from 127.0.0.1:8000 -> 80 Forwarding from [::1]:8000 -> 80
$ curl localhost:8000 Handling connection for 8000 ⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢ Thank you for using ███████╗██╗ ██╗███████╗ ██╔════╝██║ ██╔╝██╔════╝ █████╗ █████╔╝ ███████╗ ██╔══╝ ██╔═██╗ ╚════██║ ███████╗██║ ██╗███████║ ╚══════╝╚═╝ ╚═╝╚══════╝ █████╗ ███╗ ██╗██╗ ██╗██╗ ██╗██╗ ██╗███████╗██████╗ ███████╗ ██╔══██╗████╗ ██║╚██╗ ██╔╝██║ ██║██║ ██║██╔════╝██╔══██╗██╔════╝ ███████║██╔██╗ ██║ ╚████╔╝ ██║ █╗ ██║███████║█████╗ ██████╔╝█████╗ ██╔══██║██║╚██╗██║ ╚██╔╝ ██║███╗██║██╔══██║██╔══╝ ██╔══██╗██╔══╝ ██║ ██║██║ ╚████║ ██║ ╚███╔███╔╝██║ ██║███████╗██║ ██║███████╗ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝ You have successfully deployed the hello-eks-a pod hello-eks-a-9644dd8dc-bj7l5 For more information check out https://anywhere.eks.amazonaws.com ⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢
こちらもとりあえず動いているようです。
まとめ
とりあえず動いてはいる、という感じでしょうか・・・
現実的な環境ではないとは予め思いつつも(local clusterの場合)docker-in-dockerっぽいのでネットワーク周り色々ややこしそうだし、しかも今回Vagrantつかったので余計に複雑。Mac上で動かす場合はDocker Desktop+KINDみたいなのでそっちのほうがいくらかマシかもと思いつつ、今回やってみた感じだとクラスタ作成失敗とかするとゴミがたくさん残ったままになってたりして、ちょっとそこは手を出しにくい。
あと、eksctlでやってるようなことができるのかなと思いきや、eksctl anywhereだとできることがほとんどなくて、manifest書き換えてupgradeするしかないのかなーという感じです。
$ eksctl anywhere Use eksctl anywhere to build your own self-managing cluster on your hardware with the best of Amazon EKS Usage: anywhere [command] Available Commands: create Create resources delete Delete resources generate Generate resources help Help about any command upgrade Upgrade resources version Get the eksctl anywhere version
local cluster環境だとEKS感はほとんどないし、vsphere使えるならそっちで試したほうがいい気がしますね。
追記)
見るべきところは、EKSっぽさよりもCluster APIってことみたい。