ラズパイでk8sクラスタを試す

サーバー
環境
  • HW:Raspberry Pi Model 4B(8GB) × 3
  • OS:Raspbian GNU/Linux 10 (buster)

8GBのメモリを積んでいるラズパイでも32bitで動作するため、単一プロセスで3GB以上は使えないらしい。ソース
とりあえず今回は仮運用ということで単一プロセスも大きくメモリを消費しないと思うので通常のRaspbianを入れる。
ベータとして64bit版も出ているようなのでそのうち試す予定。

IPアドレス設定
hostIP
k8s-master1192.168.30.1/24
k8s-node1192.168.30.2/24
k8s-node2192.168.30.3/24

上の通りに設定した。

パッケージを更新
# sudo apt -y update && sudo apt -y dist-upgrade\
k8sの構築
kubeadmのインストール

公式のページにインストール方法が乗っているためそのように進める。

kubeadmのインストール
このページではkubeadmコマンドをインストールする方法を示します。このインストール処理実行後にkubeadmを使用してクラスターを作成する方法については、kubeadmを使用したシングルマスタークラスターの作成を参照してください。 始める前に 次のいずれかが動作しているマシンが必要です Ubuntu 16.04...

Swapの無効化
Swapをオフにする必要があるようなのでオフにする。

# swapoff -all
# systemctl stop dphys-swapfile.service
# systemctl disable dphys-swapfile.service

cgroupの有効化
/boot/cmdline.txtの行の末尾に入力する

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

iptablesの設定

# modprobe br_netfilter
# lsmod | grep br_netfilter
~
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system

iptablesをレガシーモードに変更

# apt-get install -y iptables arptables ebtables
# update-alternatives --set iptables /usr/sbin/iptables-legacy
# update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
# update-alternatives --set arptables /usr/sbin/arptables-legacy
# update-alternatives --set ebtables /usr/sbin/ebtables-legacy

コンテナ(Docker)のインストール
Dockerの公式のインストールDocsを見ながら入れる。
Raspbianはリポジトリを利用したインストールがサポートされていないようなのでパッケージから。
最新のcontainerd, docker-ce-cli, docker-ce の3つをインストールする。

# wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/containerd.io_1.4.4-1_armhf.deb
# wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce-cli_20.10.6~3-0~debian-buster_armhf.deb
# wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce_20.10.6~3-0~debian-buster_armhf.deb
# dpkg -i containerd.io_1.4.4-1_armhf.deb
# dpkg -i docker-ce-cli_20.10.6~3-0~debian-buster_armhf.deb
# dpkg -i docker-ce_20.10.6~3-0~debian-buster_armhf.deb

Docker確認
hello-wolrdが実行されたらOK

# docker run hello-wolrd
~

一般ユーザでDockerを実行する
dockerグループに所属させる。

# usermod -aG docker $USER
# newgrp docker
# exit
$ docker run hello-world
//実行できることを確認

kubeadm, kubelet, kubectlのインストール

$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl
~
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
OK
$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl
クラスターの作成

kubeadmのインストールは完了しているため、その次の手順からおこなう。

Pod間ネットワーク
Pod間のネットワークには様々なアドオンがある。(CNIプラグイン)
有名所でflannelやweave, Calicoがあるらしい。それぞれVXLANやBGPなど実装方法が異なる。
今回はflannelで実装する。

コントロールプレーンノード(マスター)の初期化
ここで出力されるJoinコマンドはメモをとる。
※ここの作業はマスターのみで行う

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
kubeadm join 192.168.30.1:6443 --token ***************** \
        --discovery-token-ca-cert-hash sha256:**************************************

root以外でもkubectlを実行させる

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

kubectlの自動補完設定

$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> ~/.bashrc

flannelのインストール

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

ノードの追加
各ノードマシンで実行する。
※ここの作業はノードのみで行う

$ sudo kubeadm join 192.168.30.1:6443 --token ***************** \
        --discovery-token-ca-cert-hash sha256:**************************************

確認

izumin@k8s-master1:~ $ kubectl get nodes 
NAME          STATUS     ROLES                  AGE     VERSION
k8s-master1   NotReady   control-plane,master   39m     v1.21.0
k8s-node1     NotReady   <none>                 5m21s   v1.21.0
k8s-node2     NotReady   <none>                 5m12s   v1.21.0

マスターにもPodを置けるようにする。
セキュリティ上デフォルトではマスターにPodをスケジュールできないらしい。
自宅ラボではリソースがもったいないので割り当てられるようにする。

$ kubectl taint nodes --all node-role.kubernetes.io/master-
k9sのインストール

k8sを動かすのにみやすいCUIのツールがあるので入れてみる。

必要パッケージのインストール

# apt install snap

k9sをインストール
インストール語に再起動を行う。

# sudo snap install k9s
# sudo reboot

k9sの設定
k9sのために環境変数をいじる。

# export KUBECONFIG=$HOME/.kube/config
# vi ~/.bashrc
export KUBECONFIG=$HOME/.kube/config //追記

テスト用pod作成
再起動起動した直後はpodsが動かないので少し待つ。
その間にテスト用のPodsを作成するyamlを作成

# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.18

podを実行する

# kubectl apply -f nginx.yaml

k9sを見てみる

コメント

タイトルとURLをコピーしました