💡

Raspberry Pi 4 への Kubernetes インストール(シングルノード)

2021/10/24に公開

概要

  • 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