baremetal上でk3sをインストールする - ステップバイステップのガイドとterraformによる方法

ホームラボクラスターにlittle k3s Kubernetesをインストールする

目次

以下は、提供されたHugoページの英語から日本語への翻訳です。すべての技術的なフォーマット、構造、Hugo固有の要素は維持されています。


ここでは、裸の金属サーバー(1マスター + 2ワーカー)上で**3ノードK3sクラスターのインストール**を行うステップバイステップのガイドを紹介します。

このガイドでは、各サーバーに最小限の**Linuxインストール**(例:Ubuntu 22.04またはDebian)を開始し、コントロールプレーンとワークロードを自社でホストしたいという前提条件を仮定しています。

kubernetes baremetal cluster

K3sは、 軽量なKubernetesのバージョンであり、この小さなホームラボに非常に適しています。

⚙️ クラスタートポロジー

ノード名 ロール ホスト名/IP
master-1 サーバー(コントロールプレーン) 192.168.1.100
worker-1 エージェント(ワーカーノード) 192.168.1.101
worker-2 エージェント(ワーカーノード) 192.168.1.102

✅ 事前準備

🧱 ハードウェア(最小限):

  • CPU: 2コア
  • RAM: ノードごとに2GB以上
  • ディスク: ノードごとに20GB以上

🛠 OSの要件:

  • Linux(Ubuntu 22.04、Debian 12など)
  • curlssh、およびsudoがインストール済み
  • ルートまたはsudoアクセス権

🧼 ネットワークのクリーンアップ:

  • すべてのノードがIPまたはホスト名で互いを解決し、pingできるようにしてください。

  • スワップを無効化:

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    

🚀 ステップバイステップのインストール


📍ステップ1: コントロールプレーン(master-1)にK3sをインストール

curl -sfL https://get.k3s.io | sh -

インストール後:

sudo cat /var/lib/rancher/k3s/server/node-token
  • これにより、ワーカーノードに必要な参加トークンが取得できます。

クラスターが動作しているかを確認:

sudo kubectl get nodes

k3sにはkubectlk3s kubectlとしてインストールされ、またはkubectlとしてシンボリックリンクされます。


📍ステップ2: ウォーカーノード(worker-1 & worker-2)にK3sエージェントをインストール

各ワーカーノードで以下を繰り返してください:

ステップ1から取得した<MASTER_IP><NODE_TOKEN>に置き換えてください。

curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=<NODE_TOKEN> sh -

例:

K3S_URL=https://192.168.1.100:6443 \
K3S_TOKEN=K10abcde123456789::server:abcde123456789 \
sh -c "$(curl -sfL https://get.k3s.io)"

📍ステップ3: master-1からクラスターを確認

kubectl get nodes

以下のように表示されるはずです:

NAME        STATUS   ROLES    AGE   VERSION
master-1    Ready    control  5m    v1.29.2+k3s1
worker-1    Ready    <none>   2m    v1.29.2+k3s1
worker-2    Ready    <none>   2m    v1.29.2+k3s1

🔐(オプション)高可用性(HA)を有効にする

プロダクションに近いHA(ホームラボではオプション):

  • 外部DB(例:MySQL/PostgreSQL/etcd)を使用。
  • --serverフラグと共有DBを使用して複数のサーバーノードを実行。
  • 詳細については: K3s HA Doc

🧪 デプロイメントのテスト

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl get svc

curl http://<worker-ip>:<port>でアクセスを確認するか、MetalLBを使用して外部のLoadBalancer IPを設定してください。


🧰 ヘルプフルなノート

  • Kubeconfig: /etc/rancher/k3s/k3s.yaml

    • ローカルマシンにコピーし、export KUBECONFIG=...を実行してリモートから管理できます。
  • Systemdサービス:

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent(ワーカーで)

💡 オプションの機能

  • K9s: Kubernetesを管理するためのターミナルUI: brew install k9sまたはsudo snap install k9s

  • ダッシュボード: マニフェストで有効化:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    
  • MetalLB: 裸金属にロードバランシングを追加:

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
    

📦 クリーンアップ

k3sを削除するには:

# マスターで:
/usr/local/bin/k3s-uninstall.sh

# ワーカーで:
/usr/local/bin/k3s-agent-uninstall.sh

Terraformを使用して3ノードの裸金属K3sクラスターをインストール

以下は、Terraformテンプレートです。 これは、既にプロビジョニングされたLinuxサーバー(例:LAN/ホームラボ内)をSSHとAnsibleで管理する前提で、3ノードの裸金属K3sクラスターをプロビジョニングするのに役立ちます。TerraformはAnsibleプレイブックを呼び出してK3sをインストールします。


🧱 前提条件

  • すでに以下のものをお持ちください:

    • 固定IPを持つ3台のサーバーでSSHにアクセス可能。
    • SSHアクセス(キーベース)。
    • ローカルにTerraformとAnsibleがインストール済み。
  • ターゲットOS: Ubuntu/Debian(カスタマイズ可能)。

  • 使用しているのはTerraform local-execまたはAnsibleプロビジョナーのプラグイン(ここではlocal-execを使用します)。


📁 ディレクトリ構造

k3s-cluster/
├── main.tf
├── inventory.ini
├── ansible/
│   └── install_k3s.yml
└── variables.tf

📄 variables.tf

variable "master_ip" {
  default = "192.168.1.100"
}

variable "worker_ips" {
  default = ["192.168.1.101", "192.168.1.102"]
}

variable "ssh_user" {
  default = "your_user"
}

variable "ssh_private_key" {
  default = "~/.ssh/id_rsa"
}

📄 main.tf

provider "null" {}

resource "null_resource" "install_k3s" {
  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i inventory.ini ansible/install_k3s.yml --private-key ${var.ssh_private_key} -u ${var.ssh_user}"
  }

  triggers = {
    always_run = "${timestamp()}"
  }
}

📄 inventory.ini

[masters]
192.168.1.100

[workers]
192.168.1.101
192.168.1.102

[all:vars]
ansible_python_interpreter=/usr/bin/python3

📄 ansible/install_k3s.yml

---
- hosts: masters
  become: yes
  tasks:
    - name: k3sマスターをインストール
      shell: |
        curl -sfL https://get.k3s.io | sh -        
    - name: node-tokenを取得
      shell: cat /var/lib/rancher/k3s/server/node-token
      register: node_token
      delegate_to: localhost

- hosts: workers
  become: yes
  tasks:
    - name: クラスターにワーカーを参加させる
      shell: |
        curl -sfL https://get.k3s.io | K3S_URL=https://{{ hostvars['192.168.1.100']['ansible_host'] }}:6443 K3S_TOKEN={{ hostvars['192.168.1.100']['node_token']['stdout'] }} sh -        

ノート: AnsibleのバージョンによってIPまたはトークン変数のアクセス方法を調整する必要がある場合があります。また、マスターでトークンを生成し、ワーカーのインストール前にファイルに保存することもできます。


🚀 実行方法

k3s-cluster/ディレクトリから:

terraform init
terraform apply

🧰 補足(オプション)

  • ダイナミックなインベントリ生成(例:DHCP/dnsmasq)を使用。
  • AnsibleでMetalLBのデプロイメントを追加。
  • ホスト名とHA機能を追加。
  • Ansibleロール(例:xanmanning.k3s)を使用して柔軟性を向上。

有用なリンク