はじめに
今更の感覚はありますがクラウド環境を構成しているOSSアプリについて知りたい+カスタマイズしたいことで環境構築、k8sの各コンポーネントをビルドなどすることにしました。今回はその1回目として公式ドキュメントから紹介されている「kubeadm」のコマンドを使い本格的なクラスタ構築、追加、管理などの一連の構築作業+運用作業について把握していきたいです。
この記事の範囲
kubeadmを使いControl Planeの構築、同じノード内でのpod挙動の確認まで行います。
使った環境、ツールなど
- ubuntu(linux tegra 4.9.201)(gnomeは無効にしてます。)
- k8s 1.28
- kubeadm 1.28
- machine
- jetson nano (arm64)
手順
- まずは、公式ドキュメントで提示されているインストール手順を確認したところ軽微な問題がありました。
この記事の目標としている手順までなってなく、さらに細かいLinuxの設定が抜けてます。
そのため、インストール手順などは参考しつつ、元々kubectlのコマンドについて知識はあるのでゴールを達成するまでのコマンドを残すことにします。 - kubeadmのインストールを行います。まず、Container Runtimeとしてはcontainerdをインストールします。
- このリンクにアクセス、Option1のバイナリからインストールを行います。
-
これで実行環境のインストールが完了しました。
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
- kubeadm, kubelet, kubectlをインストールします。
これで必要な「ツール」のインストールは完了しました。
sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
これからツールに必要な「設定」を行います。 - kubelet サービスが正常に動いていることを確認すると、swap spaceの設定問題で正常に起動できてないことが確認できます。
この解決用のコマンドを実行、再度サービスをリスタートします。swapoff -a
- 実行環境から使うネットワーク設定が必要になります。まずはLinux上のittalbesの設定を行います。
sudo modprobe br_netfilter echo br_netfilter | sudo tee /etc/modules-load.d/kubernetes.conf
- ネットワーク系の設定はまだ完了してないですが、一旦下記のコマンドから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
- ここでネットワーク関連設定の続きです。下記のコマンドでネットワークプラグインのPodを作成し、実行環境を再起動します。
もし実行環境の再起動ができないとcontrol planeノードはready状態にならない問題があります。
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- 作成されたノードをisolateを行います。
kubectl taint node <ノード名> node-role.kubernetes.io/control-plane:NoSchedule-
- これでcontrol planeの作成、初期化が完了しました。クラウド実行環境が正しく動いていることをかくにんするため、試し用のPodを起動し確認します
正常にレスポンスがあると問題なくpodがデプロイされていることが確認できます。
kubectl run nginx --image nginx:latest kubectl expose pod/nginx --port 80 --type NodePort kubectl get services#port番号を確認します。 curl http://localhost:<port>
問題点いくつか
上記の手順にもありましたが、公式ドキュメントの手順が不完全なことで下記について別途確認を行いました。
- containerdのswaffoff問題
- containerdのネットワークインタフェース手順
- kubeadmのネットワークパラメーター指定
- iptableの設定
この中で2番の対応については実行環境を動かしてから実行環境をリスタートすることが一番戸惑いました。
また、マシンを再起動するとswapoffの設定を再度実施してkubeletを再起動しないと使えないようでした。
めも
ついでにsyslogなども併せてどのような形になるか確認しました。
各サービス起動コマンドにログパスの指定をしてないため、下記のフォルダに格納されているようです。
- /var/log/containers
- /var/log/pods
もう少し確認したところ、「fluentd」のプラグインがあれば他のログストアに流せるみたいでした。
最後に
手順に一部抜けもれがあればすみません。ほぼ自分用で作成してまったようです。
もしこの内容に指摘などあればコメントお願いします。
続きは追加のマシン(ラズパイ5が発売されそうなので待ってる状況)が用意できたら実行ノードの追加、管理コマンドの挙動確認にしたいと思います。