Kubernetes

本番環境向けKubernetes構築手順とベストプラクティス

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

1. 前提条件と環境準備

1‑1. ハードウェア・ネットワーク要件

コンポーネント 推奨最低スペック
コントロールプレーン CPU 2 vCPU、メモリ 4 GiB、ディスク OS 用 20 GB(etcd 用は別途 SSD 推奨)
ワーカーノード CPU 1 vCPU、メモリ 2 GiB、ディスク OS 用 20 GB
ネットワーク 全ノード間で以下のポートを開放
・API サーバー 6443/tcp
・etcd 2379‑2380/tcp
・kubelet 10250/tcp10251/tcp10252/tcp
・NodePort 30000‑32767/tcp
内部 Pod CIDR は 10.96.0.0/12(デフォルト)か、Calico 用に 192.168.0.0/16 などの重複しないプライベートアドレスを選択

根拠
Kubernetes の主要コンポーネントは高頻度で相互通信します。CPU・メモリが不足すると kubeletNotReady になるほか、ディスク I/O が低いと etcd のレプリケーション遅延が発生しやすくなります。

参考
- Kubernetes 公式ドキュメント(Production prerequisites
- Zenn 記事「K8s on Ubuntu」


1‑2. OS の更新、swap 無効化、ブリッジパケット転送設定

ポイント
br_netfilter がロードされていないと CNI プラグインが iptables ルールを作成できず、Pod の通信が遮断されます。また、swap が有効なままだと kubelet がリソース管理を正しく行えません。


2. コンテナランタイムと Kubernetes パッケージのインストール

2‑1. containerd のインストール(Docker リポジトリは使用しない)

Ubuntu の公式パッケージに含まれる containerd.io は、Kubernetes が推奨するバージョンです。以下の手順でインストールし、cgroup ドライバーを systemd に統一します。

解説
containerd は軽量で、Kubernetes と同様に systemd cgroup がデフォルトです。Docker のリポジトリを混在させるとバージョンの不整合が起きやすくなるため、公式 Ubuntu リポジトリだけで完結させます。


2‑2. kubeadm / kubelet / kubectl のインストール(バージョン固定)

ポイント
kubeadm init と各ノードの kubelet が同一バージョンであることがクラスタ安定性の前提です。apt-mark hold により自動アップグレードを防ぎ、計画的にバージョン変更できるようにします。


3. コントロールプレーンノードの初期化

3‑1. kubeadm init の実行例(改行位置修正)

注意:上記の \ は行継続文字です。コメント行の後に空白が入らないように配置してください。

kubeconfig の設定

これで一般ユーザーでも kubectl get nodes が実行可能になります。


4. CNI プラグイン(Calico)の導入

4‑1. Calico のデフォルトモードは IP‑in‑IP

Calico は複数のトンネリング方式を提供しますが、IP‑in‑IP がデフォルトです。VXLAN や BGP を利用したい場合はマニフェスト内の ipPools 設定や CALICO_IPV4POOL_IPIP フラグを書き換えて有効化します。

ポイント
--pod-network-cidr=192.168.0.0/16 とマニフェストの CALICO_IPV4POOL_CIDR が一致していれば、Pod 同士の通信がすぐに可能になります。


5. ワーカーノードの参加とクラスタ検証

5‑1. kubeadm join コマンド取得(トークン管理)

コントロールプレーン側で次のコマンドを実行し、出力された kubeadm join … をワーカーに貼り付けます。トークンはデフォルトで 24 h 有効です。

例:

トークン更新手順

5‑2. クラスタ状態の基本チェック

コマンド 確認項目
kubectl get nodes 全ノードが Ready
kubectl get pods -A kube-system のポッドがすべて Running/Completed
journalctl -u kubelet -f kubelet のリアルタイムログ
ctr containers list containerd が正しくコンテナを管理しているか

よくあるトラブルと対処例

  • Node が NotReady
  • 原因:cgroup driver 不一致、swap 有効、ネットワークプラグイン未起動。
  • 対策:/var/lib/kubelet/config.yamlcgroupDriver: systemd を確認し、swapoff -asysctl --system を再実行。Calico が Running かも確認。

  • NetworkPluginNotReady

  • 原因:Calico マニフェスト未適用、または --pod-network-cidr と不一致。
  • 対策:kubectl describe pod calico-node -n kube-system のイベントでエラー内容を確認し、CIDR 設定が合っているか検証。

  • etcd 証明書期限切れ

  • 原因:/etc/kubernetes/pki/etcd/*.crt が期限迫る。
  • 対策:sudo kubeadm certs renew all && sudo systemctl restart etcd を実行し、再度 kubectl get componentstatuses で確認。

6. セキュリティと運用ベストプラクティス

6‑1. API サーバーの認可設定(RBAC のみ有効化)

解説
RBAC が無効だと system:admin 権限がデフォルトで付与され、最小権限の原則が崩れます。PodSecurityPolicy は v1.25 以降 非推奨 となり、代替として Pod Security Admission(PSA)を使用します。

6‑2. Pod Security の現行ベストプラクティス

上記は削除し、代わりに Namespace に対して PSA ラベルを設定します。

6‑3. etcd バックアップ(スナップショット)

取得したスナップショットは 暗号化された S3 バケット、もしくは 外部 NFS など安全なストレージに保管し、世代管理(例:7 日分保持)を自動化します。

6‑4. クラスタのアップグレード手順

ポイント
kubeadm upgrade が API サーバーやコントロールプレーンのマニフェストを自動で置き換える一方、kubeletkubectl は手動でバージョン合わせが必要です。ノードごとのローリングアップグレードはサービス停止時間を最小化します。


7. まとめ

  1. ハードウェア・ネットワーク要件 を満たし、OS の前提条件(swap 無効、br_netfilter 有効)を設定。
  2. containerd を公式 Ubuntu パッケージでインストールし、systemd cgroup に統一。
  3. kubeadm/kubelet/kubectl は公式リポジトリからバージョン固定で導入。
  4. kubeadm init の正しい書式でコントロールプレーンを起動し、admin.conf を配置して kubectl が利用可能に。
  5. Calico はデフォルトの IP‑in‑IP モードで導入し、Pod CIDR と一致させるだけでネットワークが機能。
  6. ワーカーノードはトークンベースで参加させ、kubectl get nodes 等で正常性を確認。
  7. RBAC を必ず有効化し、PodSecurityPolicy は廃止。代わりに Pod Security Admission を使用。
  8. 定期的な etcd スナップショット と計画的な アップグレード手順 で運用リスクを最小化。

以上の手順・設定を守れば、Ubuntu 22.04 上に 安定かつセキュアな本番向き Kubernetes クラスタ を構築できます。


スポンサードリンク

-Kubernetes
-, , , , , , ,