📘

オンプレ環境で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