【4-1】Dockerの次に学ぶ「Kubernetes」超入門!k3sで自宅サーバーに最速クラスター構築
Dockerの次に学ぶ「Kubernetes」超入門!k3sで自宅サーバーに最速クラスター構築
はじめに
前回の記事では、Docker Composeで「単一ホスト」でのコンテナ管理をマスターしました。 次に私たちが、次に目指す頂。それは、「複数ホスト」 を束ね、アプリケーションを自動でスケーリングさせ、障害発生時には 「自己修復」 まで行う、コンテナオーケストレーションの王様、Kubernetes (k8s) です。
この記事では、まず「なぜKubernetesが必要なのか?」という概念的な違いを整理し、その後、学習に最適な軽量Kubernetesディストリビューション「k3s」 を使って、既存のLinuxサーバー(LXCコンテナ)に最速で自分専用のKubernetesクラスターを構築する手順を徹底解説します。
Part 1: Kubernetesは「なぜ」必要か?(概念理解)
私たちが愛用するdocker composeは、1台のサーバー上で複数のコンテナを管理するのに最適です。しかし、サービスが成長し、数百万アクセスを捌く「本番環境」になると、docker composeでは解決できない問題に直面します。
| 比較軸 | Docker Compose (単一ホスト) | Kubernetes (複数ホスト・クラスター) |
|---|---|---|
| 例えるなら | 1つの建物の「設計図」 | 複数建物を管理する「都市管理システム」 |
| 目的 | 開発環境・小規模アプリの起動 | 大規模本番環境での自動運用 |
| 自己修復 | ✕ (サーバーが停止したら全滅) | ◎ (自動検知し、別サーバーで再起動) |
| スケーリング | ✕ (手動でコンテナを増やすのみ) | ◎ (アクセス増でコンテナ数を自動で増減) |
| アップデート | ✕ (サービスの一時停止が必要) | ◎ (ゼロダウンタイムでの更新) |
Kubernetesは、まさにこの 「自動スケーリング」「自己修復」「ローリングアップデート」 を実現するために生まれました。
Kubernetesを支える「司令塔」と「作業場所」
Kubernetesは、大きく2つの役割で動いています。
1. コントロールプレーン (Control Plane) = 「司令塔」
クラスター全体の頭脳です。「Webサーバーを3つ動かせ」という命令(あるべき姿)を管理・決定します。
- API Server: 全ての操作を受け付ける 「総合窓口」
- etcd: クラスターの全状態を保存する 「公式台帳」
- Scheduler: Podをどのサーバーに配置するか決める 「割り当て係」
- Controller Manager: 「あるべき姿」と「現実」を監視し、差があれば修正する 「監視・調整役」
2. ワーカーノード (Worker Node) = 「作業場所」
司令塔からの指示に基づき、実際にコンテナ(Pod)を実行するサーバー群です。
- kubelet: 各サーバーにいる 「現場監督」。指示を実行し、状態を報告します
- kube-proxy: コンテナ間の通信を制御する 「ネットワーク係」
-
Container Runtime:
containerdなど、コンテナを動かす「エンジン」
Part 2: 実践!k3sで最速Kubernetesクラスター構築
概念を学んだら、すぐに手を動かします。今回は、Dockerの学習で使ってきたubuntu-server-01(192.168.3.101)に、軽量なk3sをインストールします。
Step 1: k3sのインストールとトラブルシューティング
k3sは、この複雑なKubernetesの仕組みを1つの実行ファイルに凝縮した素晴らしいディストリビューションです。以下のコマンド1行でインストールできます。
ssh adm-labuser@192.168.3.101
# k3sをダウンロードしてインストール
curl -sfL https://get.k3s.io | sh -
💥 トラブルシューティング:私が出会ったエラー
ここで私は2つのエラーに遭遇しました。学習の記録として、その解決策も共有します。
[ERROR] Download failed
これはネットワークの一時的な問題でした。慌てず、もう一度同じコマンドを実行するだけで成功しました。
curl: (23) Failure writing output to destination
これは「ダウンロードは成功したが、ディスクへの書き込みに失敗した」というエラーです。原因はディスク容量不足でした。
df -hで確認すると、Docker学習で使ったイメージやボリュームでディスクが圧迫されていました。以下の「Dockerお掃除コマンド」で容量を確保し、解決しました。
docker system prune -a -f
docker volume prune -f
【補足】ワーカーノード(2台目以降)はどうするの?
「Kubernetesは複数サーバーを管理する仕組みなのに、なぜ1台のサーバーにしかインストールしていないの?」と疑問に思うかもしれません。
まさにその通りで、実際の構成ではワーカーノード(管理される側)にもk3sをインストールする必要があります。
ただし、インストール時の「役割」が異なります。
-
1台目 (コントロールプレーン):
curl -sfL https://get.k3s.io | sh -
私たちが実行したこのコマンドは、k3sを「サーバー(司令塔)」としてインストールします。(API ServerやSchedulerなどが起動) -
2台目以降 (ワーカーノード):
別のサーバーで、k3sを「エージェント(作業員)」としてインストールし、既存のクラスターに「参加」させます。# (これはイメージです。今回は実行しません) # ワーカーノードとなる別のサーバーで実行するコマンド # 1. 司令塔のIPアドレスを指定 # 2. 司令塔から取得した「合言葉(トークン)」を指定 curl -sfL [https://get.k3s.io](https://get.k3s.io) | K3S_URL='[https://192.168.3.101:6443](https://192.168.3.101:6443)' K3S_TOKEN='<合言葉>' sh -このように、ワーカーノード側は「エージェント」(
kubeletやkube-proxy)として起動し、司令塔からの指示を待つ状態になります。今回は学習のため、コントロールプレーン自身がワーカーノードの役割も兼ねる、1台構成のシンプルなクラスターを構築しています。
Step 2: kubectlコマンド環境のセットアップ
インストールが成功したら、kubectl(Kubernetesを操作するコマンド)を使いやすく設定します。
# まずはsudo付きで動作確認
sudo k3s kubectl get nodes
# STATUSがReadyならOK
# 1. sudoなしで使えるよう、設定ファイルをホームにコピー
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
# 2. kubectlのショートカット「k」を登録
echo "alias k='kubectl'" >> ~/.bashrc
# 3. kubectlに設定ファイルの場所を教える(重要!)
# これがないと "permission denied" エラーが出ます
echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
# 4. 設定をターミナルに反映
source ~/.bashrc
【補足】~/.bashrc とは何? 4つのコマンドの詳しい解説
kubectlのセットアップで実行したコマンド、特に~/.bashrcへの追記は、Linux環境をカスタマイズする上で非常に重要です。各コマンドが何をしているのか、詳しく解説します。
~/.bashrc とは?
~/.bashrcは「bashというシェル(ターミナルソフト)が起動するたびに自動的に読み込まれる、あなた専用のカスタマイズ設定ファイル」です。
-
~(チルダ): あなたのホームディレクトリ (/home/adm-labuserなど) を指すショートカットです。 -
bash: あなたが使っているシェルの名前です。 -
.rc: "Run Commands" の略で、設定ファイルを意味する慣習的な名前です。
このファイルに設定を書き込むことで、ターミナルを開くたびに自動でショートカット(エイリアス)や環境変数が設定され、作業が効率的になります。
各コマンドの解説
1. echo "alias k='kubectl'" >> ~/.bashrc
kubectlのショートカット(エイリアス)を登録しています。
-
echo "...":"alias k='kubectl'"という文字列を出力します。 -
>> ~/.bashrc:>>(追記)記号を使い、echoが出力した文字列を~/.bashrcファイルの一番最後に追加します。 -
結果: 次回ターミナル起動時から、
kと打つだけでkubectlと打ったことと同じになります。
2. echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
kubectlが読み込むべき設定ファイルの場所を明示的に教えています。
-
export KUBECONFIG=...:KUBECONFIGという環境変数を設定しています。環境変数とは、ターミナル全体で共有される設定値のことです。 -
なぜ必要か?: これがないと、
kコマンドは管理者専用の(権限のない)/etc/rancher/k3s/k3s.yamlを読みに行こうとしてpermission deniedエラーになってしまいます。 -
結果:
kコマンドに対し、「あなたが読み込むべき設定ファイルは、私たちがホームディレクトリにコピーした~/.kube/configですよ」と指示することで、エラーを回避できます。
3. source ~/.bashrc
今行った設定変更を、現在のターミナルに即座に反映させます。
-
source: 指定されたファイル(~/.bashrc)を読み込み直して実行するコマンドです。 -
なぜ必要か?:
~/.bashrcは通常、新しくターミナルを開いたときにしか読み込まれません。このコマンドを実行しないと、設定を有効にするために一度ターミナルを閉じて開き直す必要があり、手間がかかります。
Step 3: クラスターを探検する
セットアップが完了!sudoなし&kコマンドだけで、クラスターの状態を見てみましょう。
# クラスターの司令塔(API Server)の情報を確認
k cluster-info
# ノード(サーバー)の一覧と状態を確認
k get nodes -o wide
# NAME STATUS ROLES AGE VERSION IP-ADDRESS ...
# k3s-master Ready control-plane,master 10m v1.xx.x+k3s1 192.168.3.101 ...
# クラスターで動いている全てのPodを確認
k get pods -A # または k get pods --all-namespaces
# KubernetesのシステムPodが動いていることを確認
k get pods -n kube-system
# Kubernetesが扱えるリソースの種類を一覧表示
k api-resources
k get pods -n kube-systemを実行すると、corednsやmetrics-serverといった、k3sを動かすためのシステムPodがRunningになっていることがわかります。
まとめ
ついに、自分だけのKubernetesクラスターを手に入れました!
今回はKubernetesの壮大なアーキテクチャの概要を学び、k3sのおかげで驚くほど簡単にその実物を構築できました。そしてkubectlという「鍵」を手に入れ、クラスターという「都市」の内部を覗き見る第一歩を踏み出しました。
次の記事では、いよいよこのクラスターに、Docker Composeで使ったようなWebアプリケーションを 「デプロイ(配備)」 していきます。
Discussion