このシェルは、Raspberry Pi 5 + SSD起動 + Debian 13 (Trixie) という最新環境で、`cgroup` の問題を突破し、Kubernetesを導入するためのものです。
(シェル記載のIPについては、各自環境に合わせて修正してください)
1. cgroup設定とOS最適化
特にSSD起動時のパス `/boot/firmware/cmdline.txt` に対応しています。
```
#!/bin/bash
set -euo pipefail
# ==== 1. ホスト名によるIP厳密判定 ====
CURRENT_HOST=$(hostname -s)
GW_IP="192.168.10.1"
K8S_VERSION="v1.35"
log(){ echo -e "\033[32m[INFO]\033[0m $*"; }
case "$CURRENT_HOST" in
*master*) MY_IP="192.168.10.125" ;;
*node1*) MY_IP="192.168.10.128" ;;
*node2*) MY_IP="192.168.10.129" ;;
*)
log "\033[31m[ERROR]\033[0m ホスト名 '$CURRENT_HOST' が判別不能です。"
log "勝手にIPを割り当てると競合するため、処理を中断します。"
exit 1 ;;
esac
log "判別成功: $CURRENT_HOST に IP: $MY_IP を割り当てます。"
# APT自動回答フラグ
APT_OPT="-y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew"
export DEBIAN_FRONTEND=noninteractive
# --- 2. ネットワーク設定の強制上書き ---
log "NetworkManagerの設定を更新中..."
# アクティブな接続名を取得(なければ "Wired connection 1" をデフォルトに)
CON_NAME=$(nmcli -g NAME connection show --active | head -n 1) || CON_NAME="Wired connection 1"
sudo nmcli connection modify "$CON_NAME" \
ipv4.addresses "${MY_IP}/24" \
ipv4.gateway "${GW_IP}" \
ipv4.dns "8.8.8.8,8.8.4.4" \
ipv4.method manual
# 即時反映(バックグラウンド実行でSSH切断に備える)
sudo nmcli connection up "$CON_NAME" >/dev/null 2>&1 &
# --- 3. cgroup 設定 ---
log "cgroup設定 (SSD/Trixie) ..."
CMDLINE="/boot/firmware/cmdline.txt"
[ ! -f "$CMDLINE" ] && CMDLINE="/boot/cmdline.txt"
if [ -f "$CMDLINE" ]; then
for p in cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1; do
grep -qw "$p" "$CMDLINE" || sudo sed -i "1 s/$/ $p/" "$CMDLINE"
done
fi
# --- 4. 共通の無効化・カーネル設定 ---
log "Swap/IPv6 無効化..."
sudo dphys-swapfile swapoff || true
sudo dphys-swapfile uninstall || true
sudo systemctl disable dphys-swapfile || true
sudo swapoff -a || true
sudo sed -i '/swap/d' /etc/fstab || true
sudo tee /etc/sysctl.d/99-k8s.conf >/dev/null <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sudo modprobe overlay && sudo modprobe br_netfilter
sudo sysctl --system >/dev/null 2>&1
# --- 5. ソフトウェア導入 ---
log "containerd / nftables 導入..."
sudo apt-get update && sudo apt-get install $APT_OPT nftables
sudo update-alternatives --set iptables /usr/sbin/iptables-nft || true
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/docker.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 update && sudo apt-get install $APT_OPT containerd.io
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
# --- 6. Kubernetes 導入 (2026年署名エラー突破) ---
log "Kubernetes導入 (trusted=yes)..."
curl -fsSL https://pkgs.k8s.io/core:/stable:/$K8S_VERSION/deb/Release.key | sudo gpg --dearmor --yes -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg trusted=yes] https://pkgs.k8s.io/core:/stable:/$K8S_VERSION/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list >/dev/null
sudo apt-get update
sudo apt-get install $APT_OPT kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# --- 7. CNIパス不整合解消 ---
sudo mkdir -p /opt/cni/bin /usr/lib/cni
sudo ln -sf /opt/cni/bin/* /usr/lib/cni/ 2>/dev/null || true
log "------------------------------------------------------------"
log "【完了】 $CURRENT_HOST は $MY_IP に設定されました。"
log "★今すぐ 'sudo reboot' してください。"
if [[ "$CURRENT_HOST" == *master* ]]; then
log "再起動後: sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.10.125"
fi
log "------------------------------------------------------------"
```