EKS-D（Amazon EKS Distro）使ってみた

EKS-D を早速使ってみました。
Ubuntu Server 20.10にsnapでeks-dをインストールしてノード追加するだけの記事です。

# 参考
https://aws.amazon.com/jp/blogs/opensource/introducing-amazon-eks-distro/
> Find out how easy it is to install EKS-D using Canonical’s MicroK8s, in a snap.

https://snapcraft.io/eks



# 環境
|役割|ホスト名|IPアドレス|OS|
|---|---|---|---|
|マスターノード|ubekssvr01|192.168.21.30/24|Ubuntu Server 20.10（x86_64）|
|追加ノード|ubekssvr02|192.168.21.31/24|Ubuntu Server 20.10（x86_64）|


# EKS-D のインストール
インストールはコマンド一発で簡単でした。
これで環境ができてるっぽい。

```console
s64s@ubekssvr01:~$ sudo snap install eks --classic --edge
eks (1.18/edge) v1.18.9 from Canonical? installed
s64s@ubekssvr01:~$
```

追加ノード側でも EKS-D をインストールします。

```console
s64s@ubekssvr02:~$ sudo snap install eks --classic --edge
eks (1.18/edge) v1.18.9 from Canonical? installed
s64s@ubekssvr02:~$
```


ステータスの確認。この状態になるまでちょっと時間かかりました。

```console
s64s@ubekssvr01:~$ sudo eks status
eks is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
s64s@ubekssvr01:~$
```

ちなみに起動完了前はこんな出力でした。

```console
s64s@ubekssvr01:~$ sudo eks status
eks is not running. Use eks inspect for a deeper inspection.
s64s@ubekssvr01:~$
```

snap 側での確認は以下の通りでした。

```console
s64s@ubekssvr01:~$ snap services eks
Service                          Startup  Current  Notes
eks.daemon-apiserver             enabled  active   -
eks.daemon-apiserver-kicker      enabled  active   -
eks.daemon-cluster-agent         enabled  active   -
eks.daemon-containerd            enabled  active   -
eks.daemon-control-plane-kicker  enabled  active   -
eks.daemon-controller-manager    enabled  active   -
eks.daemon-kubelet               enabled  active   -
eks.daemon-proxy                 enabled  active   -
eks.daemon-scheduler             enabled  active   -
s64s@ubekssvr01:~$

```

# ノードの追加

マスターノードで以下のコマンドを実行すると、追加ノード側で実行するコマンドが表示されます。

```console
s64s@ubekssvr01:~$ sudo eks add-node
From the node you wish to join to this cluster, run the following:
eks join 192.168.21.30:25000/acde01fb6bb2218a7ed53b0f793023ad

If the node you are adding is not reachable through the default interface you can use one of the following:
 eks join 192.168.1.30:25000/acde01fb6bb2218a7ed53b0f793023ad
 eks join 192.168.21.30:25000/acde01fb6bb2218a7ed53b0f793023ad
 eks join 192.168.100.30:25000/acde01fb6bb2218a7ed53b0f793023ad
 eks join 10.1.82.128:25000/acde01fb6bb2218a7ed53b0f793023ad
s64s@ubekssvr01:~$
```

追加ノード(ubekssvr02)で表示された通りコマンドを実行します。

```console
s64s@ubekssvr02:~$ sudo eks join 192.168.21.30:25000/acde01fb6bb2218a7ed53b0f793023ad
[sudo] password for s64s:
Contacting cluster at 192.168.21.30
Waiting for this node to finish joining the cluster. ..
s64s@ubekssvr02:~$
```

追加ノードを確認します。

```console
s64s@ubekssvr01:~$ sudo eks kubectl get node -o wide
NAME         STATUS   ROLES    AGE     VERSION              INTERNAL-IP     EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION     CONTAINER-RUNTIME
ubekssvr01   Ready    <none>   7m58s   v1.18.9-eks-1-18-1   192.168.21.30   <none>        Ubuntu 20.10   5.8.0-31-generic   containerd://1.3.7
ubekssvr02   Ready    <none>   112s    v1.18.9-eks-1-18-1   192.168.21.31   <none>        Ubuntu 20.10   5.8.0-31-generic   containerd://1.3.7
s64s@ubekssvr01:~$
```

起動している pod は次の通りです。

```console
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
kube-system   hostpath-provisioner-66667bf7f-p25f2       1/1     Running   0          20m   10.1.82.131     ubekssvr01   <none>           <none>
kube-system   coredns-6788f546c9-pzm4t                   1/1     Running   0          21m   10.1.82.132     ubekssvr01   <none>           <none>
kube-system   calico-kube-controllers-555fc8cc5c-qtjz8   1/1     Running   0          21m   10.1.82.133     ubekssvr01   <none>           <none>
kube-system   metrics-server-768748c8f4-mz5bc            1/1     Running   0          21m   10.1.82.134     ubekssvr01   <none>           <none>
kube-system   calico-node-z9l75                          1/1     Running   0          15m   192.168.21.30   ubekssvr01   <none>           <none>
kube-system   calico-node-jdw6b                          1/1     Running   0          15m   192.168.21.31   ubekssvr02   <none>           <none>
s64s@ubekssvr01:~$
```

# 感想
コマンド一発でインストールできたのでとても簡単でした。ノード追加も楽でいいですね。
使い方はまだわからないので、おいおい調べてく感じですね。




# おまけ
helm のインストール。

```console
sudo snap install helm --classic
```

Storage Classでnfsを使用できるようにします。
事前にNFSサーバは下記パラメータで設定しています。

|NFSサーバ IPアドレス|公開パス|
|---|---|
|192.168.21.50|/eks-d_nfs|

ubuntuにnfs-commonを入れていないとnfs-client-provisionerのpodがPendingのままになってしまいましたので予めインストールしておきます。

```console
sudo apt install nfs-common
```

helmでnfs-client-provisionerをインストールします。

```console
helm install nfs-client-provisioner stable/nfs-client-provisioner \
--set nfs.server=192.168.21.50 \
--set nfs.path=/eks-d_nfs \
--set storageClass.reclaimPolicy=Retain
```

helmインストール結果を確認します。
STATUSがdeployedとなっていることが確認できます。

```console
s64s@ubekssvr01:~$ helm ls
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
nfs-client-provisioner  default         1               2020-12-06 15:46:29.579710863 +0000 UTC deployed        nfs-client-provisioner-1.2.11   3.1.0
s64s@ubekssvr01:~$
```

podを確認するとnfs-client-provisionerが存在しています。

```console
s64s@ubekssvr01:~$ sudo eks kubectl get pod -A -o wide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
kube-system   hostpath-provisioner-66667bf7f-p25f2       1/1     Running   0          72m   10.1.82.131     ubekssvr01   <none>           <none>
kube-system   coredns-6788f546c9-pzm4t                   1/1     Running   0          72m   10.1.82.132     ubekssvr01   <none>           <none>
kube-system   calico-kube-controllers-555fc8cc5c-qtjz8   1/1     Running   0          72m   10.1.82.133     ubekssvr01   <none>           <none>
kube-system   metrics-server-768748c8f4-mz5bc            1/1     Running   0          72m   10.1.82.134     ubekssvr01   <none>           <none>
kube-system   calico-node-z9l75                          1/1     Running   0          67m   192.168.21.30   ubekssvr01   <none>           <none>
kube-system   calico-node-jdw6b                          1/1     Running   0          66m   192.168.21.31   ubekssvr02   <none>           <none>
default       nfs-client-provisioner-56c4f96ff4-m5l7f    1/1     Running   0          52m   10.1.206.193    ubekssvr02   <none>           <none>
s64s@ubekssvr01:~$
```



Storage Class の状態を確認します。nfs-clientが追加されました。

```console
s64s@ubekssvr01:~$ sudo eks kubectl get sc
[sudo] password for s64s:
NAME                          PROVISIONER                            RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
microk8s-hostpath (default)   microk8s.io/hostpath                   Delete          Immediate           false                  50m
nfs-client                    cluster.local/nfs-client-provisioner   Retain          Immediate           true                   30m
s64s@ubekssvr01:~$
```

microk8s-hostpathがデフォルトポリシーになっています。
今回はnfs-clientをデフォルトポリシーに変更します。

まずはmicrok8s-hostpathのデフォルトポリシーを無効にします。

```console
s64s@ubekssvr01:~$ sudo eks kubectl patch sc microk8s-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
storageclass.storage.k8s.io/microk8s-hostpath patched
```

nfs-clientをデフォルトポリシーに設定します。

```console
s64s@ubekssvr01:~$ sudo eks kubectl patch sc nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/nfs-client patched
```

Storage Classの確認をします。
nfs-client (default)  となり、デフォルトポリシーになっていることが確認できました。

```console
s64s@ubekssvr01:~$ sudo eks kubectl get sc
NAME                   PROVISIONER                            RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
microk8s-hostpath      microk8s.io/hostpath                   Delete          Immediate           false                  53m
nfs-client (default)   cluster.local/nfs-client-provisioner   Retain          Immediate           true                   33m
s64s@ubekssvr01:~$
```

# 使用リソース
作業後のメモリ利用状況はこのくらいでした。

```console
s64s@ubekssvr01:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          11969        1118        6367           2        4484       10601
Swap:          4095           0        4095
s64s@ubekssvr01:~$
```

```console
s64s@ubekssvr02:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15895         820       10727           3        4347       14843
Swap:          4095           0        4095
s64s@ubekssvr02:~$
```



以上です。