💡
Raspberry Pi 4 への Kubernetes インストール(シングルノード)
概要
- Raspberry Pi 4 に Kubernetes をインストールする際の手順をまとめる
- なるべくコマンドだけで完結するようにする
- ネットワークは flannel ではなく calico を利用する
- flannel では外部へのネットワーク疎通ができない事象にハマったため
前提
- OS は RASPBERRY PI OS Lite(32bit)
- SD カードに OS のイメージを焼いた状態からスタート
手順
Raspberry Pi 4 初期設定
- OS 起動時に Wi-Fi に接続して SSH 接続を許可する
- SD カードを Laptop に接続した状態で、SD カード内の boot ファイルに対象ファイルを作成する
touch /Volumes/boot/ssh
cat <<EOF > /Volumes/boot/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="xxxxx"
psk=xxxxxx
}
EOF
diskutil unmount boot
- SSH ログイン確認
ssh pi@raspberrypi.local
- Laptop 上に SSH 接続用の公開鍵と秘密鍵を生成し、公開鍵を Raspberry Pi 4 に配置
ssh-keygen -t rsa -b 4096
ssh-copy-id -i ~/.ssh/xxxxx.pub pi@raspberrypi.local
ssh pi@raspberrypi.local -i ~/.ssh/xxxxx.pub
- Raspberry Pi 4 へのログインに公開鍵認証を有効にして、パスワード認証を拒否
sudo sed -i 's/#PubkeyAuthentication/PubkeyAuthentication/g' /etc/ssh/sshd_config
sudo sed -i 's/#AuthorizedKeysFile/AuthorizedKeysFile/g' /etc/ssh/sshd_config
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/g' /etc/ssh/sshd_config
sudo systemctl restart sshd.service
- ホスト名変更、タイムゾーン変更、ファイルシステムの拡張
sudo raspi-config nonint do_hostname raspi001
sudo raspi-config nonint do_change_timezone Asia/Tokyo
sudo raspi-config --expand-rootfs
- OS、ファームウェアの更新
sudo apt-get update && sudo apt-get dist-upgrade -y
sudo apt-get update && sudo apt-get upgrade -y
- vim のインストール
sudo apt-get -y --purge remove vim-common vim-tiny
sudo apt-get install -y vim
- IP アドレスの固定化
cat <<EOF >> /etc/dhcpcd.conf
static ip_address=192.168.1.xxx/24
static routers=192.168.1.xxx
static domain_name_servers=192.168.1.xxx
EOF
- 再起動してログイン
sudo shutdown -r now
ssh pi@raspberrypi.local -i ~/.ssh/xxxxx.pub
Kubernetes インストール
- swap の無効化
sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
systemctl status dphys-swapfile
- iptables 関連の設定
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
> br_netfilter
> EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
sudo apt-get install -y iptables arptables ebtables
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy
sudo sysctl --system
- Docker インストール
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
- Kubernetes 関連パッケージのインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
- cgroup の有効化
sudo sed -i 's/$/ cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory/g' /boot/cmdline.txt
sudo shutdown -r now
- Kubernetes クラスタ構築
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
sudo su -
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
exit
sudo kubectl taint nodes --all node-role.kubernetes.io/master-
- calico のデプロイ
curl https://docs.projectcalico.org/manifests/calico.yaml -O
export POD_CIDR="10.244.0.0/16"
cp -ap calico.yaml calico.yaml.org
sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico.yaml
kubectl apply -f calico.yaml
Kubernetes クラスタの初期化
sudo kubeadm reset
sudo rm -fr /etc/cni/net.d
sudo ip link delete cni0
sudo ip link delete flannel.1
sudo rm -fr ./.kube/
sudo rm -fr /root/.kube/
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo iptables -X
Discussion