👻

Proxmoxを使ってお家Kubernetesクラスター構築

2024/08/10に公開

ある程度ちゃんとしたKubernetesのクラスター環境を構築しようとすると、やっぱり物理サーバが最低でも2台欲しいところ。。。
選択肢としては、次の3パターンのいづれかを採用したい。

  1. 2台のラズベリーパイ用意し、Kubernetesクラスターを構築する
  2. 1台の物理マシンにProxmoxを構築し、その上に2台のUbuntuマシンを立てKubernetesクラスターを構築する
  3. パターン2のOpenStack版

今回はパターン2を採用しました。
採用した背景として、まずお金をかけたくありませんでした。
そのため、新たにラズパイを2台購入するのはコストがかかるので選択肢から外れました。
次に、構築のし易さを考えたときに、OpenStackの構築は手間がかかるなと想像し、選択肢から外しました。
よって、お金をかけずに、簡単に構築できそうなパターン2を採用しました。

Proxmox

Proxmoxのインストール

以前勉強用に購入したミニサーバがあるのでそちらのサーバにインストールしました。
インストール手順については、Proxmox VEのセットアップ手順(インストール編)
がおすすめです。

インストール後の初期設定

https://zenn.dev/northeggman/articles/0203320c4a2690

IPアドレス固定

個人的にDHCPでコロコロIPアドレス変わるの好きじゃないので、固定しました。

/etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens18:
      addresses: [192.168.0.XX/24]
      routes:
        - to: default
          via: 192.168.0.1
      nameservers:
        addresses: [192.168.0.1 , 8.8.8.8]
        search: []
      optional: true

00-installer-config.yamlファイルを修正後、netplan applyを実行

netplan apply

Kubernetesクラスター構築

Proxmox上で2台のUbuntuインスタンスを作成します。
1つはマスターノード、もう1つはワーカーノードとして動作させます。
2台とも同じスペックです

パラメータ
OS Ubuntu22.04
Disk Size 32GB
Processors 1 sockets, 2 cores
Memory 4GB

構築

master/worker共通

マスターノードもワーカーノードも共通の作業

各ノードのホスト名の名前解決ができるようにする

$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 master

10.32.1.16 k8s-master #マスターノードのホスト名とIPアドレス
10.32.1.15 k8s-worker01 #ワーカーノードのホスト名とIPアドレス

swapの無効

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

/etc/fstabの最終行をコメントアウトされていることを確認する

cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-aq2ElNNLksret98GNCi7z2unyz45SQG7UPhnoYybdPWsfecRlnAsqttOfjXyZW1l / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/79e7999d-c582-4161-a102-1e18c2610220 /boot ext4 defaults 0 1
#/swap.img	none	swap	sw	0	0 #この行をコメントアウト

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

$ tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
$ modprobe overlay
$ modprobe br_netfilter
$ 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
EOF

設定の反映

$ sysctl --system

containerdをインストールする

$ apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ apt update
$ apt install -y containerd.io
$ containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
$ sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
$ systemctl restart containerd
$ systemctl enable containerd

kubelet kubeadm kubectlをインストールする

$ apt-get update
$ apt-get install -y apt-transport-https ca-certificates curl gpg
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/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.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ apt-get update
$ apt-get install -y kubelet kubeadm kubectl
$ apt-mark hold kubelet kubeadm kubectl

masterで実行すること

kubeadm initコマンドのログの最下部にkubeadm joinコマンドが出力されるので控えておく
あとでワーカーノード側で使用するためである。

$ kubeadm init --control-plane-endpoint=k8s-master
$ mkdir -p $HOME/.kube
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl cluster-info

Calicoのインストールを行う

$ kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

workerで実行すること

kubeadm init --control-plane-endpoint=k8s-masterコマンドで実行したログに記載のkubeadm joinコマンドをそのまま実行する

root@k8s-worker01:~# kubeadm join k8s-master:6443 --token :********** --discovery-token-ca-cert-hash sha256:**********

確認

マスター/ワーカーノードで以下のように出力されれば構築完了。

master
$ kubectl get nodes
NAME           STATUS   ROLES           AGE    VERSION
k8s-master     Ready    control-plane   4h2m   v1.31.3
k8s-worker01   Ready    <none>          4h     v1.31.3

$ kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS       AGE
kube-system   calico-kube-controllers-6879d4fcdc-bfvc7   1/1     Running   1 (169m ago)   3h23m
kube-system   calico-node-5t4k5                          1/1     Running   1 (169m ago)   3h34m
kube-system   calico-node-7nrfm                          1/1     Running   2 (170m ago)   3h34m
kube-system   coredns-7c65d6cfc9-d6tx4                   1/1     Running   1 (169m ago)   3h23m
kube-system   coredns-7c65d6cfc9-jhp79                   1/1     Running   1 (169m ago)   3h23m
kube-system   etcd-k8s-master                            1/1     Running   1 (169m ago)   4h2m
kube-system   kube-apiserver-k8s-master                  1/1     Running   1 (169m ago)   3h
kube-system   kube-controller-manager-k8s-master         1/1     Running   1 (169m ago)   4h2m
kube-system   kube-proxy-fwfhk                           1/1     Running   2 (170m ago)   4h
kube-system   kube-proxy-lpnzf                           1/1     Running   1 (169m ago)   4h2m
kube-system   kube-scheduler-k8s-master                  1/1     Running   1 (169m ago)   4h2m
$
worker
$ kubectl get nodes
NAME           STATUS   ROLES           AGE    VERSION
k8s-master     Ready    control-plane   4h3m   v1.31.3
k8s-worker01   Ready    <none>          4h     v1.31.3
$

Discussion