Proxmoxを使ってお家Kubernetesクラスター構築
ある程度ちゃんとしたKubernetesのクラスター環境を構築しようとすると、やっぱり物理サーバが最低でも2台欲しいところ。。。
選択肢としては、次の3パターンのいづれかを採用したい。
- 2台のラズベリーパイ用意し、Kubernetesクラスターを構築する
- 1台の物理マシンにProxmoxを構築し、その上に2台のUbuntuマシンを立てKubernetesクラスターを構築する
- パターン2のOpenStack版
今回はパターン2を採用しました。
採用した背景として、まずお金をかけたくありませんでした。
そのため、新たにラズパイを2台購入するのはコストがかかるので選択肢から外れました。
次に、構築のし易さを考えたときに、OpenStackの構築は手間がかかるなと想像し、選択肢から外しました。
よって、お金をかけずに、簡単に構築できそうなパターン2を採用しました。
Proxmox
Proxmoxのインストール
以前勉強用に購入したミニサーバがあるのでそちらのサーバにインストールしました。
インストール手順については、Proxmox VEのセットアップ手順(インストール編)
がおすすめです。
インストール後の初期設定
IPアドレス固定
個人的にDHCPでコロコロIPアドレス変わるの好きじゃないので、固定しました。
# 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の最終行をコメントアウトされていることを確認する
# /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:**********
確認
マスター/ワーカーノードで以下のように出力されれば構築完了。
$ 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
$
$ 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