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した時に復活することがある。
その場合は以下を参照するといい.

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
calicoのインストール
ここからはどこでもいいのでkubectlが叩けるところで行う。
まずtigera-operatorをインストール
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
次にcalicoをインストールするための設定ファイルをダウンロードする
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/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
確認する
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
MetalLB
インストール
このあとistioでメッシュ構築をしますが、そのLoadBalancerを外部公開するために必要
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
公開するIPに応じて中身を編集
adressesをLoadBalancerで外部公開するためのIPレンジにする
自分の場合は10.0.0.3を外部との接続に使いたい
kubectl apply -n metallb-system -f - <<EOF
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
Istioのインストール
istioctlのインストール
curl -L https://istio.io/downloadIstio | sh -
istioのクラスタへのインストール
istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete
kubectl label namespace default istio-injection=enabled
namespace/default labeled
これで一通りの設定が完了