kubeadmでおうちkubernetesの作り方

# はじめに
何番煎じかわからないけどkubeadmを使っておうちkubernetesを構築したので忘備録として。
多々間違っているところがあるかもしれないです。

## 環境
| 種別 | PC | OS |
| --- | --- | --- |
| マスター| Mac Mini late 2012 | Ubuntu 20.04.3 LTS |
| ワーカー| ラズパイ3B+ | Raspberry Pi OS Lite 32Bit |

## 共通手順
インストール時にhostnameとかは設定済み

### パッケージ周り更新
```
sudo apt-get update && sudo apt-get -y upgrade
```

### swapを無効化
```
sudo vim /etc/fstab

# コメントアウトしてswapを無効化
# /swap.img     none    swap    sw      0       0
```

### {{ hostname }}.local でアクセスできるようにする
```
sudo apt-get install -y avahi-daemon
```

### Dockerをインストール
```
# インストール
sudo apt-get install -y docker

# dockerをsudoなしで使えるように
sudo usermod -aG docker $USER

# dockerが常時起動されるか確認
systemctl is-enabled docker

# enableが出力されなかった場合は常時起動を有効化
systemctl enable docker
```

### Dockerのcgroup driverをsystemdに変更する
dockerのcgroup driverは `cgroupfs` が使用されているが、kubeadmはデフォルトで `systemd` を使用するため、cgroup driverを合わせなければいけない。
今回はdockerのcgroup driverを `systemd` に変更して合わせるようにした。

```
# docker daemonの設定を作成
sudo vim /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

# daemonを再起動
systemctl daemon-restart
systemctl restart docker
```

### Dockerが動くか確認
```
# dockerコンテナ起動
docker run -p 80:80 nginx

# 疎通確認
curl http://{{ hostname }}.local

# 確認できたらコンテナ削除
docker rm {{ CONTAINER_ID }}
```

### k8s周りのパッケージインストール
```
# dockerのGPGキーを取得
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add

# kubernetesのレポジトリを追加
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

# httpでパッケージ追加できるように
sudo apt-get install -y apt-transport-https

# k8s周りのパッケージインストール
sudo apt-get install -y kubeadm kubelet kubectl kubernetes-cni
```

## マスターノード構築

### kubeadmでマスターノード構築
```
# マスターノード構築 (cirdrはflannelを使用するので固定)
kubeadm init --pod-network-cidr=10.244.0.0/16

# kubeconfig作成
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# ワーカーノードjoin用コマンドをメモしておく
# kubeadm join {{ ip_address }} ~~~ をコピー
```

### kubectlが使えるか確認
```
kubectl get node
とか
kubectl get pod --all-namespaces
```
この時点ではcorednsはまだpendingになってておｋ。

### flannel導入
```
kubectl apply -f https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
```
ここで `kubectl get pod --all-namespaces` して core-dnsが起動していればおｋ。


## ワーカーノード構築

### kubeadmでjoin
```
# マスターノード構築時にメモったやつ
sudo kubeadm join {{ MASTER_IP }}:6443 --token {{ TOKEN }} --discovery-token-ca-cert-hash {{ SHA256_HASH }}

# 確認(masterで操作)
kubectl get node

# ワーカーノードのstatusがReadyになってればおｋ
```

## トラブルシューティング

この時点でのトラブルはkubeletの起動周りが多いので、`systemctl status kubelet` や `journalctl -u kubelet` などでログを確認する。
以下よくハマったやつ。

> err="open /run/systemd/resolve/resolv.conf: no such file or directory

これ今の所再起動すると毎回起きる。。。
自分で作ってあげれば解決。

```
sudo mkdir -p /run/systemd/resolve
sudo ln -s /etc/resolv.conf /run/systemd/resolve/resolv.conf
```

> failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\"

dockerとkubeletのcgroup driverがあってないやつ。
上の方でやってる `/etc/docker/daemon.json` 作って再起動すれば解決。