Kubernetes

Kubernetes クラスタ構築 手順 初心者向けガイド – Docker・kubectl・kind・kubeadm

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

スポンサードリンク

前提条件と環境準備

項目 推奨バージョン(2026/04 時点) 補足
OS Ubuntu 24.04 LTS / Debian 12, WSL2 (Ubuntu) カーネル 6.5 系が標準搭載されているものを想定
CPU/Memory 2 コア以上、4 GB RAM 推奨(kind は 1 GB 程度でも動作) 本番向け kubeadm は最低 8 GB を推奨
Docker エンジン Docker CE 24.0 系列 docker.io パッケージは非公式な旧バージョンです

※重要
Debian/Ubuntu 系ディストリビューションでは apt-key2023 年に非推奨 となり、キーリングファイル (*.gpg) を /usr/share/keyrings/ に配置してから sources.list.d/*.list に署名情報を書き込む手順が標準です。以下のインストール例はすべてこの方式で実装しています。


Docker CE の公式インストール(Debian / Ubuntu)

補足情報

項目 内容
cgroup driver Docker CE はデフォルトで systemd を使用します。kubelet も同じドライバーに合わせると cgroup driver mismatch が防げます。
Docker Desktop (WSL2) Windows 環境では Docker Desktop の WSL2 統合機能が便利です。Linux ディストリビューション上で直接 dockerd を走らせても問題ありません。

kubectlkind の最新インストール手順

2026/04 時点の最新版
- kubectl: v1.29.3(Kubernetes 1.29 系列)
- kind: v0.22.2

注意点

  • kubectl のバイナリは公式の stable リリースを取得するので、将来的にメジャーバージョンが上がっても自動で最新安定版が入ります。
  • kind は GitHub のリリースページから直接ダウンロードしますが、CI/CD パイプラインで使用する場合は go install sigs.k8s.io/kind@latest でも取得可能です(Go がインストールされている前提)。

WSL2 上でのセットアップポイント

手順 コマンド例
WSL2 の有効化 wsl --install -d Ubuntu (PowerShell)
Docker Desktop との連携 Docker Desktop → Settings → Resources → WSL Integration → Ubuntu をオン
Linux 側での Docker デーモン確認 docker ps が正常に実行できれば OK
kubectl / kind のインストール 前節の手順をそのまま実行

Tip:
WSL2 では /etc/docker/daemon.json"exec-opts": ["native.cgroupdriver=systemd"] を追記すると、Docker と kubelet が同一 cgroup driver を使用するように強制できます。


ローカル開発向け kind クラスタ作成(ポート設定を統一)

1. 設定ファイルの作成

以下は ホスト側ポート 30080Service の NodePort も同じ 30080 を使用した例です。これにより「どちらのポートでアクセスすれば良いか」について混乱が起きません。

ポイント
extraPortMappingskind が内部で起動する Docker コンテナのポートマッピングです。
NodePort を使用しない場合でも、hostPort によりローカルブラウザから直接アクセスできます。

2. クラスタ作成

3. テスト用 nginx デプロイと Service 作成

4. アクセス確認

期待結果
Welcome to nginx! と表示されれば成功です。

hostPortNodePort の違い(初心者向けまとめ)

項目 hostPort (extraPortMappings) NodePort
作成場所 kind 設定ファイルで Docker コンテナに直接バインド Kubernetes Service オブジェクトで自動的に割り当て
ポート範囲 任意(ただしコンフリクトに注意) 30000‑32767 が予約済み
用途 ローカル開発・デバッグ向け、外部から直接アクセスしたいとき 複数ノードがある本格クラスターでの外部公開に必須

kubeadm によるマルチノード構築(apt-key 非推奨対応)

1. Kubernetes リポジトリの追加(Debian/Ubuntu 共通)

ポイント
kubeadmkubectlkubelet は同一バージョンで揃える必要があります。上記は 2026/04 時点の最新安定版です。

2. Docker CE の設定と cgroup driver 統一

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

重要
--control-plane-endpoint は外部ロードバランサや仮想 IP(VIP)を使用する際に必須です。シングルノードでテストするときは上記のように自ホスト IP を指定しても問題ありません。

4. ワーカーノード参加手順

ワーカーノード上で上記コマンドを root または sudo 付きで実行すれば自動的に Ready 状態になります。

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

備考
kubeadm のオプションは 2026 年度に一部変更されました。最新フラグは公式ドキュメント (kubeadm config print init-defaults) で随時確認してください。


CNI プラグイン導入と基本的なセキュリティ設定

Calico と Cilium の選択指針

項目 Calico Cilium
実装方式 L3 ルーティング + IPIP (デフォルト) eBPF ベースの高性能パケット処理
導入コスト シンプルな YAML 1 ファイルで完了 Helm が必要(依存関係が多い)
ネットワークポリシー 標準的な NetworkPolicy に完全対応 同上 + L7 ポリシーや CiliumClusterwideNetworkPolicy
推奨環境 小〜中規模、学習コスト最小化 大規模クラスター、パフォーマンス重視、Observability が重要なケース

Calico 導入(再掲)

Cilium 導入(Helm 使用例)

RBAC と API Server の認証強化

kubeadm init 時点で RBAC は自動的に有効です。さらに以下の設定を追加するとセキュリティが向上します。

変更後は kubelet が自動的に Pod を再起動し、設定が反映されます。


サンプルアプリ(nginx)での外部アクセス確認

1. Manifest の作成(Deployment + Service)

2. 動作確認

ブラウザまたは CLI から次の URL にアクセスします。

期待結果: Welcome to nginx! の HTML が返ってくること。

Tip:
kindextraPortMappings.hostPort=30080 を設定している場合、上記 URL は Docker ホスト(WSL2/VM)から直接アクセスできます。NodePort のみを使用した場合は kubectl proxy や外部ロードバランサが必要になる点に注意してください。


よくあるエラーとトラブルシューティング集

エラー 主な原因 推奨対処
cgroup driver mismatch Docker が systemd、kubelet が cgroupfs 両者を systemd に統一(上記「Docker 設定」参照)
Pod で DNS 解決できない (kubernetes.default.svc.cluster.local) CNI 未起動または CoreDNS Pod が CrashLoopBackOff kubectl -n kube-system get podscoredns の状態を確認、必要なら kubectl rollout restart deployment/coredns -n kube-system
NodePort が外部から届かない ホスト側ファイアウォールがポート 30000‑32767 を遮断 sudo ufw allow 30000:32767/tcp(Ubuntu)または iptables -A INPUT -p tcp --dport 30080 -j ACCEPT
Calico の IPIP モジュールがロードされない カーネルに ip_tables, xt_conntrack が無い sudo modprobe ip_tables && sudo modprobe xt_conntrack
kubeadm init 後に etcd が空 /var/lib/etcd ディレクトリが破損または権限不足 既存ディレクトリを削除し、kubeadm reset -f && kubeadm init … 再実行
kubectl が “connection refused” API Server の --advertise-address が誤っている sudo kubeadm init --apiserver-advertise-address=$(hostname -I | awk '{print $1}') で再初期化

ログの取り方
bash

kubelet

journalctl -u kubelet -f

Docker デーモン

journalctl -u docker -f

特定 Pod のログ

kubectl logs -n


次のステップ – 学習ロードマップ

  1. ローカル kind クラスタで基本操作を完了
    nginx デプロイ → Service/Ingress まで体感

  2. 本番に近い構成へ移行

  3. kubeadmマスター + ワーカー (最低 2 ノード) を構築
  4. CNI は Calico(IPIP)か Cilium(eBPF)を選択し、ネットワークポリシーを書いてみる

  5. セキュリティ強化

  6. RBAC で最小権限ロールを作成 (kubectl create rolebinding …)
  7. API Server の認証フラグ追加・Audit ログ有効化
  8. etcd バックアップスクリプト(cron + etcdctl snapshot save

  9. CI/CD パイプライン構築

  10. GitHub Actions で kind クラスタにテストデプロイ → PR の自動検証
  11. Helm Chart を作成し、バージョン管理・リリース手順を体験

  12. クラウドマネージドへの移行
    | サービス | 移行のハンドオフポイント |
    |----------|------------------------|
    | EKS (AWS) | eksctl create cluster → VPC CNI がデフォルト、Calico の有効化はオプション |
    | GKE (Google Cloud) | gcloud container clusters create--enable-network-policy で Calico 有効 |
    | AKS (Azure) | az aks create--network-plugin azure または kubenet |

  13. ナレッジシェア

  14. GitHub リポジトリに Dockerfile、Manifests、Helm Chart をまとめる
  15. Markdown ドキュメントをブログや社内 Wiki に投稿し、レビューを受ける

まとめ

  • apt-key は使用せず、キーリングファイル (/usr/share/keyrings/*.gpg) と signed-by オプションでリポジトリを管理
  • Docker CE の公式レポジトリからインストールし、cgroup driver を systemd に統一
  • kindextraPortMappings.hostPort と Service の NodePort を同じ 30080 に揃えて、ポート混乱を防止
  • kubeadm インストール時も apt-key 非推奨に対応し、バージョン固定で安定運用
  • CNI は Calico(シンプル)か Cilium(高性能)から選択し、RBAC と API Server の認証フラグでセキュリティを強化

この手順通りに進めれば、ローカル環境での学習 → 本格マルチノード構築 → クラウド移行 という一連の流れを安全かつ最新のベストプラクティスで実現できます。ぜひ手元で試し、次のプロジェクトに活かしてください。

スポンサードリンク

-Kubernetes
-, , , , , , , , ,