激安中華miniPCでKubernetesクラスタを構築する

Page content

この記事は 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 さん の記事です。