Open5

おうちKubernetesにリベンジ

junpeejunpee

はじめに

1年くらい前におうちk8s環境を作ろうとしてintel nuc(いつの間にかasusに売却されてた)を買って取り組んだが、control-planeがうまく起動しなかった。GWで時間ができたのでリベンジする。
基本的にドキュメント通りに進める。(ある程度進めた後で書いているのでこの通りに動かないかも)

ゴール

Kubernetes クラスターにnginxのpodをデプロイしてアクセスできること

junpeejunpee

コンテナランタイムのインストール

IPv4フォワーディングを有効化し、iptablesからブリッジされたトラフィックを見えるようにする

いちおうスワップもoffにしておく。

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

sudo swapoff -a

# この構成に必要なカーネルパラメーター、再起動しても値は永続します
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
vm.swappiness = 0
EOF

# 再起動せずにカーネルパラメーターを適用
sudo sysctl --system

containerdインストール

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install containerd.io

パッケージからインストールするとCRI統合プラグインが無効になっているっぽいので設定変更する。
(ここを対応してなかったのでcontrol-planeが動いていなかった)

containerd config default > /etc/containerd/config.toml

systemd cgroupドライバーを使用するように以下の通り修正し、再起動する。

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
sudo systemctl restart containerd
junpeejunpee

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

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | 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
junpeejunpee

コントロールプレーンノードの初期化

# コントロールプレーンのノードの初期化
sudo kubeadm init --pod-network-cidr=10.0.0.0/16

# root user 以外でもkubectlコマンド打てるように
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# nodeの確認
kubectl get node

今回はコントロールプレーンノードにもpodをスケジュールさせたいのでその設定を入れる。

kubectl taint nodes --all node-role.kubernetes.io/control-plane-
junpeejunpee

calico install

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
wget https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml
# pod networkを書き換える
kubectl apply -f custom-resources.yaml
# すべてのpodがrunningになっていれば大丈夫そう
kubectl get pods --all-namespaces