kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

EKS Anywhereでlocal clusterを試す

f:id:kun432:20210912220133p:plain

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ってことみたい。