baremetal上でk3sをインストールする - ステップバイステップのガイドとterraformによる方法
ホームラボクラスターにlittle k3s Kubernetesをインストールする
以下は、提供されたHugoページの英語から日本語への翻訳です。すべての技術的なフォーマット、構造、Hugo固有の要素は維持されています。
ここでは、裸の金属サーバー(1マスター + 2ワーカー)上で**3ノードK3sクラスターのインストール**を行うステップバイステップのガイドを紹介します。
このガイドでは、各サーバーに最小限の**Linuxインストール**(例:Ubuntu 22.04またはDebian)を開始し、コントロールプレーンとワークロードを自社でホストしたいという前提条件を仮定しています。
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など)
curl
、ssh
、および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
にはkubectl
がk3s 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
)を使用して柔軟性を向上。