kubernetes のセットアップ
インフラ構成
ハードウェア
-
ゲートウェイ用クラウド 1(Debian 11 (bullseye))
- GCP vm instance 8$/month
-
自宅サーバー 3 台(いずれも ubuntu22.04)
-
worker 用
- Beelink Mini PC、AMD Ryzen7 5800H nvme 500GB 16GB RAM x 2
- 買った当初は 45000 円でスペックに対して意味不明な安さをしていた
- まだ CPU 使用率あまりないがぶん回した時に夜寝られるかは心配なポイント
- Beelink Mini PC、AMD Ryzen7 5800H nvme 500GB 16GB RAM x 2
-
control-plane 用
- NIPOGI Intel N95 mini pc x 1
- アフィリンクを貼った手前だが以下の理由であまりお勧めしない
- 有線接続系のドライバが realtek r8168 なのだが、セットアップで苦労する
- 結構青光りするので夜寝る時に気になるかも
- NIPOGI Intel N95 mini pc x 1
-
ネットワーク構成
- ゲートウェイ用クラウド -> worker1 へ 10.0.0.3 で wireguard 接続
- クラスタは 3 台構成
- control-plane1
- 192.168.5.12
- worker1
- 192.168.5.10 enp1s0 LAN
- 10.0.0.3 wg0 # wireguard
- worker2
- 192.168.5.11 enp1s0 LAN
- control-plane1
ホスト OS の基本設定
hosts の設定
各ノードで設定しておく
192.168.5.12 control-plane1 # コントロールプレーン
192.168.5.11 worker2
192.168.5.10 worker1
ファイアウォールの設定
性善説
ネットワークモジュール設定
次のコマンドを実行して、カーネル モジュール \overlay\ および \br_netfilter\ を有効にします。
modprobe overlay
modprobe br_netfilter
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
cat <<EOF | 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
EOF
永続化
sysctl --system
スワップ無効化
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
swapoff -a
free -m #確認
ただ、上記の設定をしても reboot した時に復活することがある。
その場合は以下の systemd コマンドでスワップのサービスをマスクする
dev-swap.swap
の名前は適宜systemctl --type swap
にて確認可能
sudo systemctl mask "dev-swap.swap"
quote: https://qiita.com/zembutsu/items/2d8a7f5caa4885d08591
containerd インストール
apt で入れるのが丸い
apt install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install containerd.io
参考: https://docs.docker.com/engine/install/ubuntu/

Systemd cgroup ドライバを有効化
ubuntu 22.04 では containerd のランタイムで systemd cgroup ドライバを有効化することを推奨されている
インストールが完了したら、次のコマンドを実行して containerd サービスを停止。
systemctl stop containerd
containerd のコンフィグファイルを生成、編集
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
以下のSystemdCgroup = false
をtrue
にする。出現箇所は containerd v1.7.3 時点で 1 箇所
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
- SystemdCgroup = false
+ SystemdCgroup = true
修正完了したら起動
systemctl start containerd
確認し、active ならお k
systemctl status containerd
kubeadm のインストール
apt install apt-transport-https ca-certificates curl -y
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
kubernetes のパッケージ群をインストールし、バージョン固定
apt update
apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
クラスターの初期化
kubeadm init コマンドを利用し、control-plane1 上で kubernetes クラスタを初期化する
kubeadm init --service-cidr=10.2.0.0/16 --pod-network-cidr=10.1.0.0/16 --cri-socket=unix:///run/containerd/containerd.sock --apiserver-advertise-address=192.168.5.12
https://www.infraexpert.com/study/ip5.html によると private ip は 10 系が幅を取りやすいので、pod, service のネットワークは 10.1・10.2 系の/16 とした。
うまくいくと他のノードがクラスタに join するためのコマンドが表示される。
kubeadm join 192.168.5.12:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
他のワーカーノードを参加させる
worker1, worker2 ノードで実行する。
root@worker1 $ kubeadm join 192.168.5.12:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
root@worker2 $ kubeadm join 192.168.5.12:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
ネットワーク環境の構築
ここからユーザー権限に戻る。
以下のユーザーレベルでもクラスタに繋げるようにするコマンドを実行する。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
MetalLB
helm 用に values を作成
ingress-nginx による LoadBalancer を外部公開するために必要
frr ではなく native モードでインストールしたいのでmetallb/values.yml
を以下の通りに作成
speaker:
frr:
enabled: false
helm インストール
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb -f metallb/values.yml -n metallb-system
公開する IP に応じて metallb/configrations.yml の中身を編集
adresses を LoadBalancer で外部公開するための IP レンジにする
自分の場合は 10.0.0.3 を外部との接続に使いたい
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default-pool
namespace: metallb-system
spec:
addresses:
- 10.0.0.3/32
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default-advertisement
namespace: metallb-system
EOF
metaldb/configrations.yaml
を適用
kubectl apply -f metallb/configrations.yml
calico のインストール
helm の repository add
helm repo add projectcalico https://docs.tigera.io/calico/charts
calico をインストールするための設定ファイルをダウンロード
curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml -O
vim かなんかで弄る
vim custom-resources.yaml
以下のようにする
cidr はkubeadm init
で設定したpod-cidr
の値を設定
nodeAddressAutodetectionV4 はほっといてもよしなにやってくれるが、一応こっちで LAN network を指定しておく
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
cidr: 10.1.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
nodeAddressAutodetectionV4:
cidrs:
- "192.168.5.0/24"
---
# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}
クラスタに適用
kubectl create -f custom-resources.yaml
helm install
helm install calico projectcalico/tigera-operator --version v3.27.3 --namespace tigera-operator
確認する
watch kubectl get pods -n calico-system
こういうのが出てたらお k
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-txngh 1/1 Running 0 54s
Policy IPAM CNI Overlay Routing Datastore
ingress-nginx のインストール
helm install
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace