数年ぶりに自宅サーバーを立ててKubernetesを入れてみる

PONOS Advent Calendar 2023の21日目の記事です。
昨日は@tequila0725さんの『[ChatGptとGASでSlackのメンバー追加をラクにした話](https://qiita.com/tequila0725/items/b443a0f2ce039b910610)』でした。

https://qiita.com/tequila0725/items/b443a0f2ce039b910610

# はじめに
https://qiita.com/takumi3488/items/2eb4692a5672ee475998

こちらの記事を読んでよっしゃやってみっかと思ってやりました。
普段業務でKubernetesを使ってないので勉強も兼ねてます。
未完！！

:::note warn
未完なのでKubernetesの恩恵を得るところまでいっていません。
インストール大変だった話です。
:::

# PCを買う
Beelink Mini S12 Pro
https://www.amazon.co.jp/gp/product/B0BWMWFCSG
CPU: N100
メモリ: 16GB
ストレージ: 500GB
購入時の価格: 22,900円
![PXL_20231125_135625655.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/d3c83355-de77-da98-53be-e53cf40aac5a.jpeg)
軽くて小ちゃい。

:::note warn
書いてるときに見たらなんか高くなってました。
:::

# Ubuntuを入れる
Ubuntu Desktop 22.04.3 LTSをインストールしました。
最初は画面でポチポチやって、その後はsshで入って作業します。
アドレス固定したり鍵認証に変えたり等々。
こういう作業も久しぶり。

Ubuntuのisoファイルを焼くメディアが手元になかったので急遽購入しました。

# Kubernetesを入れる
ディストリビューションは色々あるのですが
とりあえずkubeadmを入れることにしました。
以下のインストール手順を見たり他のサイトを参考にしました。

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

以下作業ログ

コンテナランタイムはcontainerdを入れた

```shell
sudo apt install containerd
```

curlがなかったのでインストール

```shell
sudo apt install curl
```

kubeadmと周辺ツールのインストール

```shell
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubeadm kubelet kubectl
sudo apt-mark hold kubelet kubeadm kubectl
```

なんかswap止めないといけないらしいので止める

```shell
sudo swapoff -a
```

これだと再起動で復活するので/etc/fstabでswapっぽいところをコメントアウト
再起動してswapが止まってることを確認

```shell
free -h

               total        used        free      shared  buff/cache   available
Mem:            15Gi       1.1Gi        12Gi       282Mi       2.3Gi        13Gi
Swap:             0B          0B          0B
```

マスターノードを起動！！

```shell
sudo kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16
```

エラーが出る

```shell
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
	[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
```

https://kubernetes.io/docs/setup/production-environment/container-runtimes/#forwarding-ipv4-and-letting-iptables-see-bridged-traffic

コンテナランタイムのところでForwarding IPv4 and letting iptables see bridged trafficをやってないのが原因らしいのでやる

```shell
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system
```

再度実行...成功:metal:

```shell
sudo kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16

...

Your Kubernetescontrol-plane has initialized successfully!
```

成功するとこれをやれっていうのが出るので言われたとおりにやる

```shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

起動したノードを確認する

```shell
kubectl get nodes
```

エラーが出る

```
The connection to the server 192.168.x.x:6443 was refused - did you specify the right host or port?
```

https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd

またもやコンテナランタイムのところで必要な設定をやっていないのが原因らしいのでやる

```shell
sudo mkdir /etc/containerd
sudo sh -c "containerd config default > /etc/containerd/config.toml
```

tomlを編集してSystemdCgroupをtrueに変更

```toml:config.toml
SystemdCgroup = true
```

containerdを再起動してノードもリセットする

```shell
sudo systemctl restart containerd.service
sudo kubectl reset
```

再度init...成功！！！
...NotReady???

```shell
sudo kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
kubectl get nodes

NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   3m51s   v1.29.0
```

cni plugin not initializedらしい

```shell
kubectl describe node

container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
```

flannelを入れる

```shell
sudo sysctl net.bridge.bridge-nf-call-iptables=1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

成功！

```shell
kubectl get nodes

NAME     STATUS   ROLES           AGE     VERSION
master   Ready    control-plane   9m38s   v1.29.0
```


# おわりに
ということでマスターノードを起動するところまでやりました。
コンソールポチポチーとかterraformでーとかできるのは凄くありがたいことだな〜。

以上

明日は@ANIZA_15さんの『「Loco」をCloud Runで実行する』です！！！