DockerでWebアプリを動かせるようになると、次の壁として現れるのがコンテナ数の増加です。コンテナが3つ、5つ、10と増えてくると、手作業での起動・停止・再起動は現実的ではなくなります。
そこで登場するのがKubernetes(クバネティス)です。Kubernetesはコンテナを自動で管理・スケールさせる「コンテナオーケストレーター」で、現在の本番インフラの標準となっています。
この記事では、手元のPCでKubernetesを動かせる minikube と kind を使い、インストールからPod・Deployment・Serviceの作成まで実際のコマンド出力を交えて解説します。
動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(minikube v1.33.1・kind v0.23.0・kubectl v1.30.2)
この記事のポイント
・minikube start 1コマンドでKubernetesクラスターが手元のPCで起動できる
・kubectl apply でPodやDeploymentをYAMLファイルから作成・管理できる
・kindはDockerだけで動く軽量クラスターでCI環境のテストに適している
・minikubeとkindの違いを理解して用途に合わせて使い分けられる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜKubernetesが必要になるのか
Dockerが普及した現場では、次のような課題がよく起きます。・コンテナが落ちても自動で再起動しない:docker runは起動しっぱなしで障害時の対処は手動
・複数台サーバーへの配置が手作業:サーバーが増えるほど同じコマンドを何度も叩く必要がある
・トラフィックの分散ができない:単一コンテナではアクセス集中時にスケールできない
・デプロイのたびにダウンタイムが発生:コンテナを止めて新しいものを起動する間、サービスが止まる
Kubernetesはこれらをすべて自動で解決します。「何台のコンテナを常に動かすか」「落ちたら自動で再起動するか」「新しいバージョンに無停止で切り替えるか」をYAMLファイルに宣言するだけです。
Kubernetesの主要概念(Dockerとの対比)
・Pod:Kubernetesの最小実行単位。1つ以上のコンテナをまとめたもの(Dockerのコンテナに相当)・Deployment:Podの数・バージョン管理をする。「nginxを3台常に動かす」と宣言できる
・Service:Podへのネットワーク経路を定義する。ロードバランサーの役割を担う
・Node:Podが実行される実体(仮想マシンや物理サーバー)
・Cluster:複数のNodeの集合体
学習段階では「本番クラスター」を用意する必要はありません。手元のPCで動作するminikubeやkindを使えば、コストゼロでKubernetesを実験できます。
minikubeで手元のPCにKubernetesを構築する
minikubeはKubernetes公式がメンテナンスする学習用クラスター構築ツールです。DriverにDockerを指定すれば、既存のDocker環境にそのままクラスターを追加できます。【注意】minikubeは開発・学習専用のツールです。本番環境では使用しないでください。本番環境ではEKS(AWS)・GKE(GCP)・AKS(Azure)などマネージドKubernetesを使用するのが鉄則です。また、minikubeは起動中にホストの2GB以上のRAMを消費するため、作業終了後は必ず
minikube stop を実行して停止してください。1. minikubeをインストールする
Rocky Linux 9 / Ubuntu 24.04 それぞれのインストール手順です。kubectlも合わせて導入します。Rocky Linux 9 の場合
# minikubeバイナリをダウンロードしてインストール $ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube # kubectlをインストール $ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" $ sudo install kubectl /usr/local/bin/kubectl # バージョン確認 $ minikube version minikube version: v1.33.1 commit: 5883c09216182566a63dff4c326a6fc9ed2982ff $ kubectl version --client Client Version: v1.30.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
# minikubeはRocky Linuxと同じコマンドでインストール可能 $ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube # kubectlはaptでインストール(Ubuntu推奨) $ sudo apt-get update $ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg $ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg $ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list $ sudo apt-get update && sudo apt-get install -y kubectl $ kubectl version --client Client Version: v1.30.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
2. minikubeクラスターを起動する
DockerをDriverに指定してクラスターを起動します。初回は必要なコンテナイメージを自動でダウンロードします。# Dockerドライバーでクラスター起動(rootlessユーザーで実行) $ minikube start --driver=docker * minikube v1.33.1 on Rocky 9.4 (amd64) * Using the docker driver based on user configuration * Starting "minikube" primary control-plane node in "minikube" cluster * Pulling base image v0.0.44 ... * Downloading Kubernetes v1.30.0 preload ... > preloaded-images-k8s-v18-v1...: 342.90 MiB / 342.90 MiB 100.00% 15.34 M * Creating docker container (CPUs=2, Memory=2200MB) ... * Preparing Kubernetes v1.30.0 on Docker 26.1.1 ... - Generating certs and keys ... - Booting up control plane ... - Configuring RBAC rules ... * Verifying Kubernetes components... * Enabled addons: default-storageclass, storage-provisioner * Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
3. kubectlでクラスターの状態を確認する
# ノードの状態を確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready control-plane 68s v1.30.0 # クラスターの接続情報を確認 $ kubectl cluster-info Kubernetes control plane is running at https://192.168.49.2:8443 CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy # 全Namespaceのシステムコンポーネントを確認 $ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-7db6d8ff4d-x7r2t 1/1 Running 0 2m10s etcd-minikube 1/1 Running 0 2m15s kube-apiserver-minikube 1/1 Running 0 2m15s kube-controller-manager-minikube 1/1 Running 0 2m15s kube-proxy-4fmrk 1/1 Running 0 2m10s kube-scheduler-minikube 1/1 Running 0 2m15s storage-provisioner 1/1 Running 0 2m13s
Running になっていれば、クラスターは正常に動作しています。KubernetesにはクラスターのDNSを担当するCoreDNSが組み込まれています。Linux DNS 設定の基本を理解しておくと、Pod間通信やServiceの名前解決の仕組みが読み解けるようになります。
kindで軽量クラスターを構築する(Docker-in-Docker方式)
kindはDockerコンテナをNodeとして使う軽量Kubernetesクラスターです。minikubeよりも起動が速く、マルチノード構成をYAMLで定義できるためCIパイプラインの自動テストに向いています。1. kindをインストールする
# kindバイナリをダウンロード(amd64) $ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64 $ sudo install kind /usr/local/bin/kind # バージョン確認 $ kind version kind v0.23.0 go1.21.10 linux/amd64
2. kindでシングルノードクラスターを起動する
# クラスター作成(クラスター名はデフォルトで "kind") $ kind create cluster Creating cluster "kind" ... * Ensuring node image (kindest/node:v1.30.0) ... * Preparing nodes ... * Writing configuration ... * Starting control-plane ... * Installing CNI ... * Installing StorageClass ... Set kubectl context to "kind-kind" You can now use your cluster with: kubectl cluster-info --context kind-kind # kubectlのコンテキストが自動で切り替わる $ kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready control-plane 60s v1.30.0
3. kindでマルチノードクラスターを定義する(応用)
# kind-config.yaml を作成する $ cat kind-config.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker # 設定ファイルからクラスターを起動 $ kind create cluster --config kind-config.yaml --name multi-node # ノード構成を確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION multi-node-control-plane Ready control-plane 90s v1.30.0 multi-node-worker Ready worker 75s v1.30.0 multi-node-worker2 Ready worker 75s v1.30.0
はじめてのPod・Deployment・Service作成
クラスターが起動したら、実際にアプリケーションをデプロイしてみましょう。ここではminikubeのコンテキストで操作します。1. kubectl runでPodを直接作成する
# nginxのPodを作成 $ kubectl run nginx-pod --image=nginx:1.27 --port=80 pod/nginx-pod created # PodのSTATUSがRunningになるまで確認 $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 30s # Podの詳細情報を確認 $ kubectl describe pod nginx-pod | head -12 Name: nginx-pod Namespace: default Priority: 0 Service Account: default Node: minikube/192.168.49.2 Start Time: Tue, 22 Jul 2026 09:00:00 +0900 Labels: run=nginx-pod Status: Running IP: 10.244.0.4
10.244.0.4)はクラスター内部のIPです。外部から直接アクセスするにはServiceが必要です。2. DeploymentでレプリカとローリングUpdateを管理する
本番では kubectl run ではなく Deployment を使います。Deploymentはレプリカ数の維持と無停止でのバージョンアップを自動で行います。# nginx Deploymentを3レプリカで作成 $ kubectl create deployment nginx-deploy --image=nginx:1.27 --replicas=3 deployment.apps/nginx-deploy created # Deployment・ReplicaSet・Podの状態を一括確認 $ kubectl get deployment,replicaset,pods NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deploy 3/3 3 3 45s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deploy-7c4b8d9f56 3 3 3 45s NAME READY STATUS RESTARTS AGE pod/nginx-deploy-7c4b8d9f56-4xkqp 1/1 Running 0 45s pod/nginx-deploy-7c4b8d9f56-8jvnm 1/1 Running 0 45s pod/nginx-deploy-7c4b8d9f56-rqwlc 1/1 Running 0 45s # nginx 1.27 から 1.28 へローリングアップデート $ kubectl set image deployment/nginx-deploy nginx=nginx:1.28 deployment.apps/nginx-deploy image updated # アップデートの進捗を確認 $ kubectl rollout status deployment/nginx-deploy Waiting for deployment "nginx-deploy" to finish: 1 out of 3 new replicas have been updated... Waiting for deployment "nginx-deploy" to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "nginx-deploy" to finish: 1 old replicas are pending termination... deployment "nginx-deploy" successfully rolled out
3. Serviceでアプリをポート公開する
NodePort型のServiceを作成すると、クラスター外(自分のPC)からnginxにアクセスできます。# Deploymentに対してNodePort型のServiceを作成 $ kubectl expose deployment nginx-deploy --type=NodePort --port=80 service/nginx-deploy exposed # ServiceとNodePortを確認 $ kubectl get service nginx-deploy NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-deploy NodePort 10.96.120.201
80:31245/TCP 20s # minikubeのIPを確認 $ minikube ip 192.168.49.2 # curlでnginxのレスポンスを確認 $ curl http://192.168.49.2:31245 -s | head -5 Welcome to nginx!
31245 のような NodePort の番号はKubernetesが自動で割り当てます。Linux ポート確認の全コマンドで紹介しているssコマンドと組み合わせると、ホスト側でどのポートが実際に使われているか確認できます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、本記事で紹介したminikubeとkindによるKubernetesクラスター構築を、さらに深く学べる講座を用意しています。
→ Dockerマスター講座の詳細はこちら
minikubeとkindの使い分けガイド
2つのツールはどちらも手元のPCでKubernetesを動かせますが、得意な場面が異なります。| 観点 | minikube | kind |
|---|---|---|
| 起動速度 | やや遅い(VM相当の初期化あり) | 速い(Dockerコンテナのみ) |
| マルチノード | オプション指定で可能 | YAMLで簡単に定義できる |
| ダッシュボード | minikube dashboard コマンド1つで起動 | 別途インストールが必要 |
| CI組み込み | やや複雑 | GitHub Actionsとの親和性が高い |
| 向いている用途 | 個人学習・機能試作・アドオン実験 | CIパイプライン・マルチノードテスト |
トラブルシュート|よくあるエラーと対処法
1. 「Exiting due to DRV_NOT_DETECTED: Found docker, but the docker service is not active」
Dockerデーモンが起動していない場合に発生します。# Dockerサービスの状態を確認 $ sudo systemctl status docker * docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service) Active: inactive (dead) # Dockerを起動する $ sudo systemctl start docker # 次回起動時にも自動起動するよう設定 $ sudo systemctl enable docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service
2. 「The connection to the server localhost:8080 was refused」
kubectlがクラスターに接続できていない状態です。minikube start後に自動設定される~/.kube/config が未設定のケースで発生します。# 現在のkubectlコンテキストを確認 $ kubectl config current-context error: current-context is not set # minikubeのコンテキストを手動で設定 $ kubectl config use-context minikube Switched to context "minikube". # 再度確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready control-plane 5m v1.30.0
3. 「insufficient memory」でminikube startが失敗する
デフォルトのメモリ要件(2200MB)が不足している場合に発生します。# 割り当てメモリを減らして起動する(最低1800MBが目安) $ minikube start --driver=docker --memory=1800 # または既存クラスターを削除して再作成 $ minikube delete * Deleting "minikube" in docker ... * Removing /home/user/.minikube/machines/minikube ... * Removed all traces of the "minikube" cluster. $ minikube start --driver=docker --memory=1800
本記事のまとめ
この記事で解説したminikubeとkindによるKubernetes入門の手順をまとめます。| やりたいこと | コマンド |
|---|---|
| minikubeクラスターをDockerドライバーで起動する | minikube start --driver=docker |
| ノードの状態を確認する | kubectl get nodes |
| Podを直接作成する | kubectl run nginx-pod --image=nginx:1.27 --port=80 |
| Deploymentを3レプリカで作成する | kubectl create deployment nginx-deploy --image=nginx:1.27 --replicas=3 |
| コンテナイメージをローリングアップデートする | kubectl set image deployment/nginx-deploy nginx=nginx:1.28 |
| DeploymentをNodePortで外部公開する | kubectl expose deployment nginx-deploy --type=NodePort --port=80 |
| kindクラスターを作成する | kind create cluster |
| minikubeクラスターを停止する | minikube stop |
まずはminikubeで手元のPCにクラスターを作り、kubectl get pods と kubectl describe を繰り返すことで感覚がつかめてきます。
Ubuntu 26.04 LTS の概要も合わせて確認しておくと、最新のUbuntu環境でのKubernetesセットアップの最新情報が得られます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、本記事で紹介したminikubeとkindによるKubernetesクラスター構築を、さらに深く学べる講座を用意しています。
→ Dockerマスター講座の詳細はこちら
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます