[k8s]kubeadmを使う際のクラスタ構築 -1-

# はじめに
今更の感覚はありますがクラウド環境を構成しているOSSアプリについて知りたい＋カスタマイズしたいことで環境構築、k8sの各コンポーネントをビルドなどすることにしました。今回はその１回目として公式ドキュメントから紹介されている「kubeadm」のコマンドを使い本格的なクラスタ構築、追加、管理などの一連の構築作業＋運用作業について把握していきたいです。
# この記事の範囲
kubeadmを使いControl Planeの構築、同じノード内でのpod挙動の確認まで行います。

# 使った環境、ツールなど
- ubuntu(linux tegra 4.9.201)(gnomeは無効にしてます。)
- k8s 1.28
- kubeadm 1.28
- machine
    - jetson nano (arm64)


# 手順
1. まずは、公式ドキュメントで提示されているインストール手順を確認したところ軽微な問題がありました。<br>この記事の目標としている手順までなってなく、さらに細かいLinuxの設定が抜けてます。<br>そのため、インストール手順などは参考しつつ、元々kubectlのコマンドについて知識はあるのでゴールを達成するまでのコマンドを残すことにします。
1. kubeadmのインストールを行います。まず、Container Runtimeとしてはcontainerdをインストールします。
1. この[リンク](https://github.com/containerd/containerd/blob/main/docs/getting-started.md)にアクセス、Option1のバイナリからインストールを行います。
1. ```
    wget https://github.com/containerd/containerd/releases/download/v1.7.10/containerd-1.7.10-linux-arm64.tar.gz
    tar Cxzvf /usr/local containerd-1.7.10-linux-arm64.tar.gz
    systemctl daemon-reload
    systemctl enable --now containerd
    wget https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.arm64
    install -m 755 runc.arm64 /usr/local/sbin/runc
    wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-arm64-v1.3.0.tgz
    mkdir -p /opt/cni/bin
    tar Cxzvf /opt/cni/bin cni-plugins-linux-arm64-v1.3.0.tgz
    
   ```
   これで実行環境のインストールが完了しました。
1. kubeadm, kubelet, kubectlをインストールします。
   ```
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
   ```
   これで必要な「ツール」のインストールは完了しました。
   これからツールに必要な「設定」を行います。
1. kubelet サービスが正常に動いていることを確認すると、swap spaceの設定問題で正常に起動できてないことが確認できます。<br>この解決用のコマンドを実行、再度サービスをリスタートします。`swapoff -a`
1. 実行環境から使うネットワーク設定が必要になります。まずはLinux上のittalbesの設定を行います。
   ```
   sudo modprobe br_netfilter
   echo br_netfilter | sudo tee /etc/modules-load.d/kubernetes.conf
   ```
1. ネットワーク系の設定はまだ完了してないですが、一旦下記のコマンドからcontrol planeノードを構築します。また、kubectlが使えるように設定まで行います。
   ```
   sudo kubeadm init --pod-network-cidr=10.244.0.0/16
   mkdir -p $HOME/.kube
   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
   sudo chown $(id -u):$(id -g) $HOME/.kube/config
   ```
1. ここでネットワーク関連設定の続きです。下記のコマンドでネットワークプラグインのPodを作成し、実行環境を再起動します。
   ```
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
    ```
    もし実行環境の再起動ができないとcontrol planeノードはready状態にならない問題があります。
1. 作成されたノードをisolateを行います。
   ```
    kubectl taint node <ノード名> node-role.kubernetes.io/control-plane:NoSchedule-
   ```
1. これでcontrol planeの作成、初期化が完了しました。クラウド実行環境が正しく動いていることをかくにんするため、試し用のPodを起動し確認します
   ```
   kubectl run nginx --image nginx:latest
   kubectl expose pod/nginx --port 80 --type NodePort
   kubectl get services#port番号を確認します。
   curl http://localhost:<port>
   ```
   正常にレスポンスがあると問題なくpodがデプロイされていることが確認できます。



# 問題点いくつか
上記の手順にもありましたが、公式ドキュメントの手順が不完全なことで下記について別途確認を行いました。
1. containerdのswaffoff問題
1. containerdのネットワークインタフェース手順
1. kubeadmのネットワークパラメーター指定
1. iptableの設定

この中で２番の対応については実行環境を動かしてから実行環境をリスタートすることが一番戸惑いました。
また、マシンを再起動するとswapoffの設定を再度実施してkubeletを再起動しないと使えないようでした。

# めも
ついでにsyslogなども併せてどのような形になるか確認しました。
各サービス起動コマンドにログパスの指定をしてないため、下記のフォルダに格納されているようです。
- /var/log/containers
- /var/log/pods

もう少し確認したところ、「fluentd」のプラグインがあれば他のログストアに流せるみたいでした。

# 最後に
手順に一部抜けもれがあればすみません。ほぼ自分用で作成してまったようです。
もしこの内容に指摘などあればコメントお願いします。
続きは追加のマシン(ラズパイ５が発売されそうなので待ってる状況)が用意できたら実行ノードの追加、管理コマンドの挙動確認にしたいと思います。