🖥️

【4-1】Dockerの次に学ぶ「Kubernetes」超入門!k3sで自宅サーバーに最速クラスター構築

に公開

Dockerの次に学ぶ「Kubernetes」超入門!k3sで自宅サーバーに最速クラスター構築

はじめに

前回の記事では、Docker Composeで「単一ホスト」でのコンテナ管理をマスターしました。
https://zenn.dev/koikoi_infra/articles/72f619b4d3da2f
次に私たちが、次に目指す頂。それは、「複数ホスト」 を束ね、アプリケーションを自動でスケーリングさせ、障害発生時には 「自己修復」 まで行う、コンテナオーケストレーションの王様、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-01192.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 -
    

    このように、ワーカーノード側は「エージェント」(kubeletkube-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を実行すると、corednsmetrics-serverといった、k3sを動かすためのシステムPodがRunningになっていることがわかります。

まとめ

ついに、自分だけのKubernetesクラスターを手に入れました!

今回はKubernetesの壮大なアーキテクチャの概要を学び、k3sのおかげで驚くほど簡単にその実物を構築できました。そしてkubectlという「鍵」を手に入れ、クラスターという「都市」の内部を覗き見る第一歩を踏み出しました。

次の記事では、いよいよこのクラスターに、Docker Composeで使ったようなWebアプリケーションを 「デプロイ(配備)」 していきます。

Discussion