激安中華miniPCでKubernetesクラスタを構築する
この記事は whywaita Advent Calendar 2023 7 日目の記事です。
前日は k_enoki さんの記事 でした。
whywaita さんといえば、インフラエンジニアのイメージがあります。 今どきのインフラエンジニアといえば、Kubernetes ですよね。そこで、今回は Kubernetes の勉強を兼ねて、自宅で Kubernetes を動かすための環境を構築してみました。 お金はあまりかけたくないが、クラウドでやっても面白くないので、激安中華 miniPC を使います。
今回の環境
Amazon で Beelink EQ12 x 3 台とBeelink S12 Pro x 1 台を購入しました。これを Kubernetes クラスタとして構築します。 スペックは CPU: Alder Lake 4 コア、メモリ: 16GB、SSD: 500GB NVME です。 これで 1 台 3 万円弱でした。激安ですね。 3 台の EQ12 は ワーカーノード、1 台の S12 Pro はコントロールプレーンとします。
OS のインストール
まずは OS をインストールします。今回は Ubuntu Server 22.04 LTS をインストールしました。 PXE などでかっこよく自動インストールしたかったのですが、設定が大変そうだったので、手動で USB メモリを使ってインストールしました。
ネットワークの設定
サーバ側で固定 IP アドレスを割り振っておきます。
ホスト名 | IP アドレス |
---|---|
node01 | 192.168.1.21 |
node02 | 192.168.1.22 |
node03 | 192.168.1.23 |
cp01 | 192.168.1.41 |
netplan で設定しました。
$ sudo vim /etc/netplan/00-installer-config.yaml
各環境に応じて以下のように設定します。
network:
ethernets:
enp1s0:
dhcp4: no
addresses: [192.168.1.41/24]
gateway4: 192.168.1.254
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
version: 2
設定を反映します。
sudo netplan apply
サーバの SSH 設定
今回は、kubesprayという Ansible ベースのツールを使って Kubernetes クラスタを構築します。
Ansible の SSH ログインを簡略化するために、SSH の公開鍵認証(パスワードログイン禁止)と visudo
でパスワードなしで sudo
を使えるよう各サーバに設定しました。
SSH の公開鍵認証(パスワードログイン禁止)
$ vim ~/.ssh/authorized_keys
# 公開鍵を追記
$ sudo vim /etc/ssh/sshd_config
# 以下になっていることを確認
PasswordAuthentication no
PubkeyAuthentication yes
パスワードなしで sudo を使えるようにする
$ sudo visudo
# 以下を追記
<user> ALL=NOPASSWD: ALL
kubespray のインストール
kubespray は、Python3 で動作します。今回は、Python3 の仮想環境を作成し、そこに kubespray をインストールします。 なお、作業はコントロールプレーン上で行いました。
$ python3 -m venv venv
$ . ./venv/bin/activate
$ git clone https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray
$ git checkout release-2.23
$ pip install -r requirements.txt
インベントリの設定
インベントリにクラスタの構成を記述します。 今回は、3 台のワーカーノードと 1 台のコントロールプレーンを構成します。
$ cp -r inventory/sample inventory/k8s.akky.me
$ vim inventory/k8s.home.akky.me/hosts.yml
hosts.yml ファイルの中身は以下のようにしました。
all:
hosts:
node01:
ansible_host: 192.168.1.21
ip: 192.168.1.21
access_ip: 192.168.1.21
node02:
ansible_host: 192.168.1.22
ip: 192.168.1.22
access_ip: 192.168.1.22
node03:
ansible_host: 192.168.1.23
ip: 192.168.1.23
access_ip: 192.168.1.23
cp01:
ansible_host: 192.168.1.41
ip: 192.168.1.41
access_ip: 192.168.1.41
children:
kube_control_plane:
hosts:
cp01:
kube_node:
hosts:
node01:
node02:
node03:
etcd:
hosts:
cp01:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}
kubespray の実行
ansible-playbook
コマンドで kubespray を実行します。
実行に 40 分~1 時間ほどかかりました。
$ ansible-playbook -i inventory/k8s.home.akky.me/inventory.ini cluster.yml
動作確認
kubectl コマンドを使って、クラスタが動作していることを確認します。
$ kubectl get nodes$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
cp01 Ready control-plane 14d v1.27.7
node01 Ready <none> 14d v1.27.7
node02 Ready <none> 14d v1.27.7
node03 Ready <none> 14d v1.27.7
ちゃんと動作していました。すごく簡単でした。
結び
結局、Kubernetes の勉強はあまりできませんでしたが、激安中華 miniPC で Kubernetes クラスタを構築することができました。 今後は、この環境を活かして Kubernetes の勉強をしていきたいと思います。 明日は Jumpei Eto さん の記事です。