環境
- HW:Raspberry Pi Model 4B(8GB) × 3
- OS:Raspbian GNU/Linux 10 (buster)
8GBのメモリを積んでいるラズパイでも32bitで動作するため、単一プロセスで3GB以上は使えないらしい。ソース
とりあえず今回は仮運用ということで単一プロセスも大きくメモリを消費しないと思うので通常のRaspbianを入れる。
ベータとして64bit版も出ているようなのでそのうち試す予定。
IPアドレス設定
host | IP |
---|---|
k8s-master1 | 192.168.30.1/24 |
k8s-node1 | 192.168.30.2/24 |
k8s-node2 | 192.168.30.3/24 |
上の通りに設定した。
パッケージを更新
# sudo apt -y update && sudo apt -y dist-upgrade\
k8sの構築
kubeadmのインストール
公式のページにインストール方法が乗っているためそのように進める。
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を見てみる