🚛

3.5万円でmicro k8sクラスタ作成

2023/08/27に公開

こちらの続き。
https://zenn.dev/takai404/articles/d6204dd62037d5
https://zenn.dev/takai404/articles/7a3320b8e0bf3a
https://zenn.dev/takai404/articles/182e707014fd0b

Ubuntuを複数台用意してkubernetesクラスタをインストールしてみる。

Ubuntuを手動インストールしてみたときにmicrok8sというsnapパッケージがあるのが気になったのでこれを入れてみた。

Ubuntuはこちらの方法で3台用意。

まずはmicrok8sインストール。
1,2,3号機全て同じ。今月出たばかりのversion 1.28を入れてみる。

ubuntu@ubuntu01:~$ sudo snap install microk8s --classic --channel=1.28
2023-08-27T13:49:32Z INFO task ignored
microk8s (1.28/stable) v1.28.0 from Canonical✓ installed
ubuntu@ubuntu01:~$ sudo usermod -a -G microk8s $USER
ubuntu@ubuntu01:~$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),119(netdev),120(lxd)
ubuntu@ubuntu01:~$ exec newgrp microk8s
ubuntu@ubuntu01:~$ id
uid=1000(ubuntu) gid=1001(microk8s) groups=1001(microk8s),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),119(netdev),120(lxd),1000(ubuntu)
ubuntu@ubuntu01:~$ microk8s kubectl get node
NAME       STATUS     ROLES    AGE   VERSION
ubuntu01   NotReady   <none>   20s   v1.28.0
ubuntu@ubuntu01:~$ microk8s kubectl get node
NAME       STATUS   ROLES    AGE   VERSION
ubuntu01   Ready    <none>   41s   v1.28.0
ubuntu@ubuntu01:~$ echo "alias kubectl='microk8s kubectl'" >> ~/.bashrc
ubuntu@ubuntu01:~$ echo 'source <(kubectl completion bash)' >> ~/.bashrc
ubuntu@ubuntu01:~$ source .bashrc

これで3台の独立したk8sクラスタができた。
これからubuntu01をコントロールノード、ubuntu02, 03をメンバとする1つのk8sクラスタに統合する。

1号機でmicrok8s add-nodeを打つ。出力されたコマンド文字列を2号機にこの後打つ。

ubuntu@ubuntu01:~$ microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.10.147:25000/ce32fb7945f7bbb622a2ab5b7e7fa1ca/40a73a8988d2

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.10.147:25000/ce32fb7945f7bbb622a2ab5b7e7fa1ca/40a73a8988d2 --worker

If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join 192.168.10.147:25000/ce32fb7945f7bbb622a2ab5b7e7fa1ca/40a73a8988d2
ubuntu@ubuntu01:~$

2号機で先ほど出力されたコマンド文字列をそのまま打つ。

ubuntu@ubuntu02:~$ microk8s join 192.168.10.147:25000/ce32fb7945f7bbb622a2ab5b7e7fa1ca/40a73a8988d2 --worker
Contacting cluster at 192.168.10.147

The node has joined the cluster and will appear in the nodes list in a few seconds.

This worker node gets automatically configured with the API server endpoints.
If the API servers are behind a loadbalancer please set the '--refresh-interval' to '0s' in:
    /var/snap/microk8s/current/args/apiserver-proxy
and replace the API server endpoints with the one provided by the loadbalancer in:
    /var/snap/microk8s/current/args/traefik/provider.yaml

1号機に戻ってクラスタのノード一覧を確認すると2号機が追加されている。

ubuntu@ubuntu01:~$ kubectl get node
NAME       STATUS   ROLES    AGE     VERSION
ubuntu01   Ready    <none>   2m45s   v1.28.0
ubuntu02   Ready    <none>   29s     v1.28.0

同じ手順で1号機でjoin用コマンド作成。3号機でそれを打つ。1号機でノード一覧確認。

ubuntu@ubuntu01:~$ microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.10.147:25000/1070629501b801fbb2777551efde568a/40a73a8988d2

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.10.147:25000/1070629501b801fbb2777551efde568a/40a73a8988d2 --worker

If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join 192.168.10.147:25000/1070629501b801fbb2777551efde568a/40a73a8988d2

3号機

ubuntu@ubuntu03:~$ microk8s join 192.168.10.147:25000/1070629501b801fbb2777551efde568a/40a73a8988d2 --worker
Contacting cluster at 192.168.10.147

The node has joined the cluster and will appear in the nodes list in a few seconds.

This worker node gets automatically configured with the API server endpoints.
If the API servers are behind a loadbalancer please set the '--refresh-interval' to '0s' in:
    /var/snap/microk8s/current/args/apiserver-proxy
and replace the API server endpoints with the one provided by the loadbalancer in:
    /var/snap/microk8s/current/args/traefik/provider.yaml

1号機

ubuntu@ubuntu01:~$ kubectl get node
NAME       STATUS   ROLES    AGE     VERSION
ubuntu01   Ready    <none>   3m26s   v1.28.0
ubuntu02   Ready    <none>   70s     v1.28.0
ubuntu03   Ready    <none>   34s     v1.28.0

これでk8sクラスタ完成。簡単すぎる。

ubuntu@ubuntu01:~$ kubectl get node -o wide
NAME       STATUS   ROLES    AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
ubuntu01   Ready    <none>   3m40s   v1.28.0   192.168.10.147   <none>        Ubuntu 22.04.3 LTS   5.15.0-79-generic   containerd://1.6.15
ubuntu02   Ready    <none>   84s     v1.28.0   192.168.10.148   <none>        Ubuntu 22.04.3 LTS   5.15.0-79-generic   containerd://1.6.15
ubuntu03   Ready    <none>   48s     v1.28.0   192.168.10.149   <none>        Ubuntu 22.04.3 LTS   5.15.0-79-generic   containerd://1.6.15
ubuntu@ubuntu01:~$ kubectl get pod -A -o wide
NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE     IP               NODE       NOMINATED NODE   READINESS GATES
kube-system   coredns-864597b5fd-rdq4s                 1/1     Running   0          3m41s   10.1.3.193       ubuntu01   <none>           <none>
kube-system   calico-kube-controllers-77bd7c5b-2srjr   1/1     Running   0          3m41s   10.1.3.194       ubuntu01   <none>           <none>
kube-system   calico-node-lj88r                        1/1     Running   0          2m3s    192.168.10.147   ubuntu01   <none>           <none>
kube-system   calico-node-2qbq2                        1/1     Running   0          91s     192.168.10.148   ubuntu02   <none>           <none>
kube-system   calico-node-hg8x6                        1/1     Running   0          55s     192.168.10.149   ubuntu03   <none>           <none>

適当なnginx WEBサーバを立ててみる。
ubuntu03でPodが起動し、疎通確認も成功。

ubuntu@ubuntu01:~$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
EOF
pod/nginx created
ubuntu@ubuntu01:~$ kubectl get pod -o wide
NAME    READY   STATUS              RESTARTS   AGE   IP       NODE       NOMINATED NODE   READINESS GATES
nginx   0/1     ContainerCreating   0          8s    <none>   ubuntu03   <none>           <none>
ubuntu@ubuntu01:~$ kubectl get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          14s   10.1.38.129   ubuntu03   <none>           <none>
ubuntu@ubuntu01:~$ curl http://10.1.38.129/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>

ハイパーバイザ全体のリソース状況

  • 3台からなるk8sクラスタにnginx podが1台乗っているだけの状態
  • ワークロードは何もない状態だけど12 coreの5%=0.6 coreくらいは使っている。
    • おそらくコントローラノード
  • メモリは 4 GB x 3ノードを割り当てた。10 GB使用中。
    • ファイルキャッシュに使われる部分もあると思うが今後のことを考えるとちょっと増強したい
    • Trigkey Speed S5は 8 GBメモリ x 2枚でスロットは埋まっているので、8 GBメモリを抜いて 16 GBとか 32 GBのメモリを買ってくる必要あり。
    • ミニPCを追加するときはメモリが多そうなやつがいい
  • VMによるストレージ使用量は5 GB。おそらくLinked Cloneで差分ディスクを使っている効果が大きい。
    • 時間がたってログが溜まってきたら使用量は増えそう
    • ミニPCを追加するならライブマイグレーションできるような構成にしたい

あと、ProxmoxはVM管理だけでなくてコンテナ管理もできるみたいなのでそちらでも遊んでみたい。

Discussion