📘
オンプレ環境でk8s環境の構築(v1.34)
オンプレ環境でk8s環境の構築(v1.34)
概要
kubeadmを使ってkubernetes環境を構築した手順のメモです。
未検証ですが、AWSのEC2やその他のVPS等でも同様の手順で実施できると思います。
環境
- OS: Ubuntu 24.04
- kubernetes: v1.34
- CNI: cilium
- Ingress: Traefik
構成図
構築したクラスターは、コントロールプレーン3台、ワーカーノード2台で全てProxmox上のVMで構築しています。

コントロールプレーン、ワーカーノード共通の作業
コントロールプレーンとワーカーノードで共通で必要になる、kubernetes関連のモジュールインストールや設定を下記コマンドで実施します。
sudo swapoff -a
sudo vim /etc/fstab
#下記の行をコメントアウト
#/swap.img none swap sw 0 0
# ネットワーク関連の設定
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding=1
EOF
sudo sysctl --system
# containerdのインストール、設定
sudo apt -y install containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
# kubelet kubeadm kubectlのインストール
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable kubelet
control plane構築
冗長化のための設定
control planeとなるノードを複数台構築しても、1つのノードのIPアドレスをエンドポイントにしてしまうと、該当ノードに障害が発生した場合にクラスタとして稼働出来ないため、keepalivedを使って仮想IPを設定します。
# keepalivedのインストール
sudo apt -y install keepalived
# 下記は設定の参考値です。router_idやvirtual_ipaddressは適宜設定してください。
sudo vim /etc/keepalived/keepalived.conf
#############################################################################
global_defs {
router_id k8s-control100
}
vrrp_instance VRRP1 {
# プライマリーノードは [MASTER]
# バックアップノードは [BACKUP]
state MASTER
# 自動フェイルバックしない場合は [BACKUP] と合わせて指定
# nopreempt
interface [インターフェース名に書き換え]
virtual_router_id 100
# [Master] > [BACKUP] な任意の値
priority 200
# VRRP 通知インターバル (秒)
advert_int 1
virtual_ipaddress {
192.168.10.20/24
}
}
#############################################################################
sudo systemctl restart keepalived
sudo systemctl enable keepalived
Kubernetesクラスタの初期化
下記コマンドを実行し、Kubernetesクラスタの構築を実施します。
# kubernetesクラスタの初期化(k8s-control101のみで実施)
sudo kubeadm init --control-plane-endpoint=192.168.10.20 --skip-phases=addon/kube-proxy --pod-network-cidr=10.0.0.0/8
#下記コマンド実行で出力される値を環境変数「$KEY」に格納する(k8s-control101のみで実施)
sudo kubeadm init phase upload-certs --upload-certs
KEY=「上記コマンドの出力」
# 下記コマンド実行でコントロールプレーンとワーカーノードとしてクラスタに参加するためのコマンドが出力される(k8s-control101のみで実施)
# k8s-control102、k8s-control103では出力されたコントロールプレーン用のコマンドを実行する
sudo kubeadm token create --certificate-key $KEY --print-join-command
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# helm install
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update
sudo apt install helm
# ciliumのインストール(--versionの値は適宜変更してください)
helm repo add cilium https://helm.cilium.io/
API_SERVER_IP=192.168.10.20
API_SERVER_PORT=6443
helm install cilium cilium/cilium --version 1.18.0 \
--namespace kube-system \
--set kubeProxyReplacement=true \
--set k8sServiceHost=${API_SERVER_IP} \
--set k8sServicePort=${API_SERVER_PORT}
worker node構築
セキュリティ設定
ubuntuのセキュリティ上必要な設定ですが、正直ここはあまりわかってないです。。。
vim /etc/apparmor.d/cri-containerd.apparmor.d
#############################################################################
#include <tunables/global>
profile cri-containerd.apparmor.d flags=(attach_disconnected,mediate_deleted) {
# 共通の設定
#include <abstractions/base>
/** rwixk,
# ネットワーク操作
network raw,
network bind,
network inet stream,
# キャパビリティ
capability kill,
capability net_bind_service,
capability net_admin,
# 特定のプロセスへのシグナル送信を許可
signal (receive send) peer=unconfined,
signal (send,receive) peer=runc,
}
#############################################################################
クラスタへ参加
「Kubernetesクラスタの初期化」で出力されたworker node用のクラスタ参加コマンドを管理者権限で実行する。
まとめ
今回は、kubeadmを使ってKubernetesクラスタを構築する手順をまとめてみました。
IngressとしてTraefikを使う設定などもありますが、一旦ここまででクラスターとして稼働はします。
cert-managerを使ったLets encryptからの証明書取得の方法なども後々書くつもりです。
Discussion