🚛
3.5万円でmicro k8sクラスタ作成
こちらの続き。
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