1からのWEBサーバ作り Kubernetesを使ったコンテナ管理
はじめに
この記事ではKubernetesを使ってコンテナの管理を行います。
前回はApacheをDocker上で動作させました。
前回の記事はこちらです。
この記事はシリーズの第7回です。シリーズ全体の目次は以下からご覧ください。
シリーズ目次: 1からのWEBサーバ作り - 完全ガイドシリーズ
1. 目的と完成条件の定義
1.1 目的
Kubernetesは自動化による運用の効率化、スケーリングの自動化、リソースの最適配置などの役割があります。かつては、サーバー1台ごとにエンジニアが手作業で設定や監視を行っていました。しかし、現代のWEBサービスは規模が巨大で、更新頻度も高いため、手作業では追いつきません。「インフラ管理の複雑さを解消し、エンジニアが『サービス開発』そのものに集中できるようにする」ことがKubernetesの目的です。
1.2 完成条件
以下の条件をすべて満たすこと:
| No | 検証項目 | 合格条件 |
|---|---|---|
| 1 | 基本動作(Deployment & Service) | マニフェスト(apply)適用後、ServiceのIP(またはlocalhost)へアクセスし、トップページが正常に表示される |
| 2 | 自動復旧(Self-Healing) | kubectl delete podコマンドで稼働中のPodを強制削除した後、即座に新しいPodが自動生成され、Running状態になる |
| 3 | スケーリング(Scaling) | replicas(レプリカ数)を「3」に変更した際、Podが3つに増え、ロードバランサーが通信を適切に振り分ける |
| 4 | 無停止更新(Rolling Update) | コンテナイメージのバージョンを更新(例: v1→v2)した際、サービスが中断することなく新しいバージョンへ切り替わる |
| 5 | 設定の分離(ConfigMap) | コンテナを作り直すことなく、ConfigMap(設定情報)を書き換えてPodを再起動するだけで、Webサイトの文言や設定が反映される |
2. 前提条件
2.1 環境情報
- 対象OS: Ubuntu 24.04.3 LTS
- CPU: AMD RYZEN 7 7840HS
- 実行環境: ローカルマシン(物理サーバ)
- ネットワーク: ローカルネットワーク(192.168.x.x)
2.2 必要なマシン構成
- サーバマシン: Ubuntu 24.04.3 LTS がインストール済み
- メモリ: 最低2GB以上推奨(Kubernetes実行には4GB以上推奨)
- ディスク: 20GB以上の空き容量
2.3 必要なソフトウェア
- Docker: 第5回の記事でインストール済み
-
Docker Compose:
docker composeコマンドが使用可能であること - kubectl: Kubernetesのコマンドラインツール(本記事でインストール)
- Minikube: ローカルKubernetes環境(本記事でインストール)
3. Kubernetesの基本概念
Kubernetesを理解するために、主要な概念を押さえておきましょう。
3.1 主要コンポーネント
| コンポーネント | 説明 |
|---|---|
| Pod | コンテナを実行する最小単位。1つ以上のコンテナで構成される |
| Deployment | Podの複製を管理し、宣言的な更新を提供する |
| Service | Podへの安定したネットワークアクセスを提供する |
| ConfigMap | 設定情報をPodから分離して管理する |
| Node | Podが実行される物理マシンまたは仮想マシン |
| Cluster | 複数のNodeで構成されるKubernetes環境全体 |
Dockerとの違い
Dockerは単一のコンテナを管理するのに対し、Kubernetesは複数のコンテナを複数のサーバにまたがって管理します。Dockerが「家」なら、Kubernetesは「マンション管理システム」です。
3.2 宣言的管理
Kubernetesでは「あるべき状態」をYAMLファイル(マニフェスト)で宣言し、Kubernetesがその状態を維持します。
# 例: 「Apacheコンテナを3つ常に動かす」と宣言
replicas: 3
これにより、1つのPodが停止しても、Kubernetesが自動的に新しいPodを起動します。
4. 事前準備
4.1 Dockerのバージョン確認
まず、Dockerが正しくインストールされているか確認します。
docker --version
期待される出力例:
Docker version 24.0.7, build afdd53b
4.2 作業ディレクトリの作成
プロジェクト用のディレクトリを作成します。
mkdir -p ~/kubernetes-apache
cd ~/kubernetes-apache
4.3 SWP領域の削除
SWP(仮想メモリ)をオフにします。
sudo swapoff -a
4.4 kubectlのインストール
kubectlは、Kubernetesクラスタを操作するためのコマンドラインツールです。
# 最新版のkubectlをダウンロード
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 実行権限を付与
chmod +x kubectl
# システムパスに移動
sudo mv kubectl /usr/local/bin/
# バージョン確認
kubectl version --client
期待される出力例:
Client Version: v1.31.0
エラーが出た場合、aptの管理下でインストールしたい場合
curl: command not foundと表示された場合は、以下のコマンドでcurlをインストールしてください。
# Kubernetes公式リポジトリを追加(Ubuntu 24.04)
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
#kubectl をインストール
sudo apt update
sudo apt install -y kubectl
#(推奨)aptが自動でバージョンアップしないようにする
sudo apt-mark hold kubectl
エラーなく終わったら、以下のコマンドでバージョンを確認し、正しくインストールできたか確認してください。
kubectl version --client
4.4 Minikubeのインストール
Minikubeは、ローカル環境で単一ノードのKubernetesクラスタを簡単に構築できるツールです。
# Minikubeのダウンロード
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
# インストール
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# バージョン確認
minikube version
期待される出力例:
minikube version: v1.33.1
commit: 5883c09216182566a63dff4c326a6fc9ed2982ff
5. Minikubeクラスタの起動
5.1 Minikubeの起動
# Minikubeクラスタを起動
minikube start --driver=docker
--driver=dockerオプション
このオプションは、MinikubeがDockerをバックエンドとして使用することを指定します。他にもvirtualboxやkvm2などのドライバを選択できますが、今回はDockerを使用します。
期待される出力例:
😄 minikube v1.33.1 on Ubuntu 24.04
✨ Using the docker driver based on user configuration
👍 Starting control plane node minikube in cluster minikube
🚜 Pulling base image ...
🔥 Creating docker container (CPUs=2, Memory=2200MB) ...
🐳 Preparing Kubernetes v1.30.0 on Docker 26.0.1 ...
🔗 Configuring bridge CNI (Container Networking Interface) ...
🔎 Verifying Kubernetes components...
🌟 Enabled addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
メモリ不足エラーが出た場合
メモリが不足している場合、以下のコマンドでメモリ割り当てを調整してください。
minikube start --driver=docker --memory=4096 --cpus=2
5.2 クラスタの状態確認
# クラスタの状態を確認
minikube status
期待される出力例:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
# Nodeの状態を確認
kubectl get nodes
期待される出力例:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.30.0
6. カスタムApacheイメージの作成
Kubernetesで使用するために、カスタムHTMLを含むApacheイメージを作成します。
6.1 HTMLファイルの作成
cd ~/kubernetes-apache
mkdir -p public-html
cat > public-html/index.html << 'EOF'
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>K8s Apache v1</title>
<style>
body {
font-family: system-ui, sans-serif;
display: grid;
place-content: center;
height: 100vh;
margin: 0;
background: #f0f4f8;
color: #333;
text-align: center;
}
h1 { margin: 0; color: #007bff; }
p { color: #666; margin-top: 0.5rem; }
</style>
</head>
<body>
<div>
<h1>Version 1.0</h1>
<p>Apache on Kubernetes works!</p>
</div>
</body>
</html>
EOF
6.2 Dockerfileの作成
cat > Dockerfile << 'EOF'
FROM httpd:2.4
# メンテナ情報
LABEL maintainer="your-email@example.com"
LABEL version="1.0"
# カスタムHTMLをコピー
COPY ./public-html/ /usr/local/apache2/htdocs/
# ポート80を公開
EXPOSE 80
# ヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1
# デフォルトコマンド
CMD ["httpd-foreground"]
EOF
6.3 イメージのビルドとMinikubeへの登録
Minikubeは独自のDockerデーモンを持っているため、イメージをMinikube内でビルドする必要があります。
# MinikubeのDockerデーモンを使用する設定
eval $(minikube docker-env)
# イメージをビルド
docker build -t my-apache:v1 .
# イメージが作成されたか確認
docker images | grep my-apache
期待される出力例:
my-apache v1 abc123def456 1 minute ago 145MB
eval $(minikube docker-env)の意味
このコマンドは、現在のシェルでMinikube内のDockerデーモンを使用するように環境変数を設定します。これにより、ローカルでビルドしたイメージがMinikube内で直接利用可能になります。
7. Kubernetesマニフェストの作成
7.1 Deploymentマニフェストの作成
Deploymentは、Podの複製を管理し、宣言的な更新を提供します。
cat > deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-deployment
labels:
app: apache
spec:
replicas: 1
selector:
matchLabels:
app: apache
template:
metadata:
labels:
app: apache
spec:
containers:
- name: apache
image: my-apache:v1
imagePullPolicy: Never # ローカルイメージを使用
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
EOF
主要な設定項目の説明
| 項目 | 説明 |
|---|---|
replicas: 1 |
Podを1つ起動する |
imagePullPolicy: Never |
ローカルイメージを使用(Dockerレジストリから取得しない) |
resources |
CPU・メモリの制限 |
livenessProbe |
Podが正常に動作しているかチェック |
readinessProbe |
Podがトラフィックを受け入れる準備ができているかチェック |
7.2 Serviceマニフェストの作成
ServiceはPodへの安定したネットワークアクセスを提供します。
cat > service.yaml << 'EOF'
apiVersion: v1
kind: Service
metadata:
name: apache-service
spec:
type: NodePort
selector:
app: apache
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
EOF
Serviceのタイプ
| タイプ | 説明 |
|---|---|
ClusterIP |
クラスタ内部からのみアクセス可能(デフォルト) |
NodePort |
各NodeのIPアドレスとポート経由でアクセス可能 |
LoadBalancer |
クラウドプロバイダのロードバランサーを使用 |
8. Kubernetesへのデプロイ
8.1 マニフェストの適用
# Deploymentを適用
kubectl apply -f deployment.yaml
# Serviceを適用
kubectl apply -f service.yaml
期待される出力例:
deployment.apps/apache-deployment created
service/apache-service created
8.2 デプロイ状態の確認
# Deploymentの状態確認
kubectl get deployments
# Podの状態確認
kubectl get pods
# Serviceの状態確認
kubectl get services
期待される出力例:
NAME READY UP-TO-DATE AVAILABLE AGE
apache-deployment 1/1 1 1 30s
NAME READY STATUS RESTARTS AGE
apache-deployment-5d7b8c9f4d-xyz12 1/1 Running 0 30s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
apache-service NodePort 10.96.123.45 <none> 80:30080/TCP 30s
8.3 詳細な状態確認
# Deploymentの詳細情報
kubectl describe deployment apache-deployment
# Podの詳細情報
kubectl describe pod apache-deployment-5d7b8c9f4d-xyz12
# Podのログ確認
kubectl logs apache-deployment-5d7b8c9f4d-xyz12
9. 動作確認と検証
9.1 検証1: 基本動作(Deployment & Service)
# MinikubeのIPアドレスを取得
minikube ip
期待される出力例:
192.168.49.2
Webブラウザまたはcurlコマンドでアクセスします:
# curlでアクセス
curl http://$(minikube ip):30080
# またはブラウザで開く
minikube service apache-service
確認ポイント: カスタムHTMLの内容が表示される
9.2 検証2: 自動復旧(Self-Healing)
Podを強制削除して、自動復旧を確認します。
# 現在のPod名を取得
POD_NAME=$(kubectl get pods -l app=apache -o jsonpath='{.items[0].metadata.name}')
echo "削除するPod: $POD_NAME"
# Podを強制削除
kubectl delete pod $POD_NAME
# リアルタイムでPodの状態を監視
kubectl get pods -l app=apache -w
期待される動作:
- Podが
Terminating状態になる - 新しいPodが自動的に作成される(
ContainerCreating) - 新しいPodが
Running状態になる
確認ポイント: 10秒以内に新しいPodが起動する
# 新しいPodが起動したか確認
kubectl get pods -l app=apache
期待される出力例:
NAME READY STATUS RESTARTS AGE
apache-deployment-5d7b8c9f4d-abc34 1/1 Running 0 15s
9.3 検証3: スケーリング(Scaling)
レプリカ数を3に増やして、ロードバランシングを確認します。
# レプリカ数を3に変更
kubectl scale deployment apache-deployment --replicas=3
# Podの状態を確認
kubectl get pods -l app=apache
期待される出力例:
NAME READY STATUS RESTARTS AGE
apache-deployment-5d7b8c9f4d-abc34 1/1 Running 0 2m
apache-deployment-5d7b8c9f4d-def56 1/1 Running 0 10s
apache-deployment-5d7b8c9f4d-ghi78 1/1 Running 0 10s
ロードバランシングの確認:
kubectl execの動作について
kubectl exec deployment/apache-deploymentは、Deployment内の特定の1つのPodに接続するため、同じPod名が繰り返し表示されます。これは正常な動作です。
ロードバランシングを確認するには、Service経由でアクセスする必要があります。
方法1: 各Podのログでアクセスを確認
別ターミナルでログを監視:
# 各Podのアクセスログをリアルタイムで監視
kubectl logs -l app=apache --tail=10 --prefix=true -f
メインターミナルで複数回アクセス:
# Service経由で20回アクセス
for i in {1..20}; do
curl -s http://$(minikube ip):30080 > /dev/null
echo "Request $i sent"
sleep 0.5
done
期待される結果: 3つのPodのログに、ほぼ均等にアクセスログが記録される

方法2: Podのメトリクスを確認
# 各Podのネットワークトラフィックを確認
kubectl top pods -l app=apache
9.4 検証4: 無停止更新(Rolling Update)
新しいバージョンのイメージを作成して、ローリングアップデートを実行します。
バージョン2のHTMLを作成
cat > public-html/index.html << 'EOF'
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>K8s Apache v2</title>
<style>
body {
font-family: system-ui, sans-serif;
display: grid;
place-content: center;
height: 100vh;
margin: 0;
background: #fff5f5;
color: #333;
text-align: center;
}
h1 { margin: 0; color: #e53e3e; }
p { color: #666; margin-top: 0.5rem; }
.tag {
background: #e53e3e;
color: white;
font-size: 0.8rem;
padding: 4px 10px;
border-radius: 99px;
font-weight: bold;
display: inline-block;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div>
<div class="tag">Version 2.0</div>
<h1>Update Success!</h1>
<p>Rolling update completed smoothly.</p>
</div>
</body>
</html>
EOF
バージョン2のイメージをビルド
# MinikubeのDockerデーモンを使用
eval $(minikube docker-env)
# バージョン2をビルド
docker build -t my-apache:v2 .
# イメージが作成されたか確認
docker images | grep my-apache
Deploymentを更新
# イメージを更新
kubectl set image deployment/apache-deployment apache=my-apache:v2
# ローリングアップデートの進行状況を監視
kubectl rollout status deployment/apache-deployment
期待される出力例:
Waiting for deployment "apache-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "apache-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "apache-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "apache-deployment" successfully rolled out
# 更新履歴を確認
kubectl rollout history deployment/apache-deployment
確認ポイント: サービスが停止することなく、新しいバージョンに切り替わる
# バージョン2のページを確認
curl http://$(minikube ip):30080 | grep "Version 2.0"
ローリングアップデートの仕組み
Kubernetesは、新しいバージョンのPodを段階的に作成し、古いバージョンのPodを段階的に削除します。これにより、サービスが中断することなく更新が完了します。
ロールバックの確認(任意)
# バージョン1にロールバック
kubectl rollout undo deployment/apache-deployment
# ロールバックの進行状況を確認
kubectl rollout status deployment/apache-deployment
# バージョン1に戻ったか確認
curl http://$(minikube ip):30080 | grep "Version 1.0"
9.5 検証5: 設定の分離(ConfigMap)
ConfigMapを使って、コンテナを再ビルドせずに設定を変更します。
ConfigMapの作成
cat > configmap.yaml << 'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: apache-config
data:
message: "Hello from ConfigMap!"
environment: "Production"
EOF
# ConfigMapを適用
kubectl apply -f configmap.yaml
# ConfigMapの内容を確認
kubectl get configmap apache-config -o yaml
Deploymentを修正してConfigMapを使用
cat > deployment-with-configmap.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-deployment
labels:
app: apache
spec:
replicas: 3
selector:
matchLabels:
app: apache
template:
metadata:
labels:
app: apache
spec:
containers:
- name: apache
image: my-apache:v2
imagePullPolicy: Never
ports:
- containerPort: 80
env:
- name: MESSAGE
valueFrom:
configMapKeyRef:
name: apache-config
key: message
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: apache-config
key: environment
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
EOF
# Deploymentを更新
kubectl apply -f deployment-with-configmap.yaml
ConfigMapの値を確認
# Podに入って環境変数を確認
POD_NAME=$(kubectl get pods -l app=apache -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $POD_NAME -- env | grep -E "MESSAGE|ENVIRONMENT"
期待される出力例:
MESSAGE=Hello from ConfigMap!
ENVIRONMENT=Production
ConfigMapを更新
# ConfigMapの値を変更
kubectl edit configmap apache-config
viエディタが開くので、以下のように変更します:
data:
- message: "Hello from ConfigMap!"
+ message: "Updated message from ConfigMap!"
- environment: "Production"
+ environment: "Staging"
# Podを再起動して変更を反映
kubectl rollout restart deployment/apache-deployment
# 再起動の進行状況を確認
kubectl rollout status deployment/apache-deployment
# 変更が反映されたか確認
POD_NAME=$(kubectl get pods -l app=apache -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $POD_NAME -- env | grep -E "MESSAGE|ENVIRONMENT"
期待される出力例:
MESSAGE=Updated message from ConfigMap!
ENVIRONMENT=Staging
確認ポイント: コンテナイメージを再ビルドすることなく、設定が変更される
10. トラブルシューティング
10.1 Podが起動しない
症状: PodがPendingまたはImagePullBackOff状態のまま
# Podの詳細を確認
kubectl describe pod <pod-name>
原因と対処法:
| 原因 | 対処法 |
|---|---|
| イメージが見つからない |
imagePullPolicy: Neverが設定されているか確認。eval $(minikube docker-env)を実行してからイメージをビルドする |
| リソース不足 |
kubectl describe node minikubeでリソース使用状況を確認。必要に応じてMinikubeのメモリを増やす |
| 権限エラー |
SecurityContextの設定を確認 |
10.2 Serviceに接続できない
症状: curl http://$(minikube ip):30080が失敗する
対処法:
# Serviceの状態を確認
kubectl get svc apache-service
# Endpointsが設定されているか確認
kubectl get endpoints apache-service
# Podが正常に動作しているか確認
kubectl get pods -l app=apache
原因:
- Podが
Running状態でない - Serviceのセレクタとpodのラベルが一致していない
- ファイアウォールがポートをブロックしている
10.3 ローリングアップデートが失敗する
症状: kubectl rollout statusが完了しない
# ローリングアップデートの状態を確認
kubectl rollout status deployment/apache-deployment
# Podのイベントを確認
kubectl get events --sort-by='.lastTimestamp'
対処法:
# ロールバックを実行
kubectl rollout undo deployment/apache-deployment
# 問題を修正してから再度デプロイ
kubectl apply -f deployment.yaml
10.4 MinikubeのDockerデーモンに接続できない
症状: eval $(minikube docker-env)後、Dockerコマンドが失敗する
対処法:
# Minikubeが起動しているか確認
minikube status
# Minikubeを再起動
minikube stop
minikube start --driver=docker
# 再度環境変数を設定
eval $(minikube docker-env)
10.5 ConfigMapの変更が反映されない
症状: ConfigMapを更新してもPodに反映されない
対処法:
# ConfigMapが更新されているか確認
kubectl get configmap apache-config -o yaml
# Podを再起動
kubectl rollout restart deployment/apache-deployment
# または、Podを強制削除して自動再生成
kubectl delete pods -l app=apache
ConfigMapの制限
ConfigMapを環境変数として使用している場合、ConfigMapを更新してもPodは自動的に再起動しません。kubectl rollout restartを実行する必要があります。
11. セキュリティ配慮
11.1 リソース制限の設定
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
目的: Podがクラスタ全体のリソースを使い果たすのを防ぐ
11.2 ReadOnly Root Filesystem
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
目的: コンテナのルートファイルシステムを読み取り専用にして、攻撃者がファイルを改ざんするのを防ぐ
11.3 NetworkPolicyの設定
cat > network-policy.yaml << 'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: apache-network-policy
spec:
podSelector:
matchLabels:
app: apache
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
EOF
# NetworkPolicyを適用
kubectl apply -f network-policy.yaml
目的: 特定のPodからのみトラフィックを許可する
11.4 Secretの使用
機密情報(パスワード、APIキーなど)は、ConfigMapではなくSecretを使用します。
# Secretを作成
kubectl create secret generic apache-secret \
--from-literal=db-password='super-secret-password'
# Secretの内容を確認(base64エンコードされている)
kubectl get secret apache-secret -o yaml
11.5 定期的な更新
# イメージを最新版に更新
kubectl set image deployment/apache-deployment apache=httpd:2.4-alpine
# セキュリティパッチを適用
sudo apt update
sudo apt upgrade -y
12. クリーンアップ
作業が完了したら、リソースをクリーンアップします。
# Deploymentを削除
kubectl delete deployment apache-deployment
# Serviceを削除
kubectl delete service apache-service
# ConfigMapを削除
kubectl delete configmap apache-config
# すべてのリソースを一度に削除
kubectl delete -f deployment.yaml -f service.yaml -f configmap.yaml
# Minikubeクラスタを停止
minikube stop
# Minikubeクラスタを完全に削除(任意)
minikube delete
13. まとめ
この記事では、Kubernetesを使ってコンテナを管理する方法を学びました。
重要なポイント:
- Kubernetesは宣言的管理により「あるべき状態」を維持する
- Self-Healing機能でPodが自動復旧する
- スケーリングによりトラフィックに応じてPodを増減できる
- ローリングアップデートで無停止更新が可能
- ConfigMapで設定をコードから分離できる
Dockerとの比較:
| 項目 | Docker | Kubernetes |
|---|---|---|
| スケール | 単一ホスト | 複数ホストのクラスタ |
| 自動復旧 | ✗ | ✓ |
| ロードバランシング | 手動設定 | 自動 |
| 無停止更新 | 難しい | 簡単 |
| 設定管理 | 環境変数/.env | ConfigMap/Secret |
14. 参考資料
- Kubernetes公式ドキュメント
- Minikube公式ドキュメント
- kubectl公式リファレンス
- Kubernetesのベストプラクティス
- Apache HTTP Server Docker Official Image
付録: 完全な設定ファイル一式
A. ディレクトリ構造
kubernetes-apache/
├── Dockerfile
├── deployment.yaml
├── service.yaml
├── configmap.yaml
├── deployment-with-configmap.yaml
├── network-policy.yaml
└── public-html/
└── index.html
B. deployment.yaml(完全版)
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-deployment
labels:
app: apache
spec:
replicas: 1
selector:
matchLabels:
app: apache
template:
metadata:
labels:
app: apache
spec:
containers:
- name: apache
image: my-apache:v1
imagePullPolicy: Never
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
C. service.yaml(完全版)
apiVersion: v1
kind: Service
metadata:
name: apache-service
spec:
type: NodePort
selector:
app: apache
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
D. configmap.yaml(完全版)
apiVersion: v1
kind: ConfigMap
metadata:
name: apache-config
data:
message: "Hello from ConfigMap!"
environment: "Production"
E. よく使うkubectlコマンド一覧
| コマンド | 説明 |
|---|---|
kubectl get pods |
Pod一覧を表示 |
kubectl get deployments |
Deployment一覧を表示 |
kubectl get services |
Service一覧を表示 |
kubectl describe pod <pod-name> |
Podの詳細情報を表示 |
kubectl logs <pod-name> |
Podのログを表示 |
kubectl exec -it <pod-name> -- /bin/bash |
Podにシェルで接続 |
kubectl apply -f <file.yaml> |
マニフェストを適用 |
kubectl delete -f <file.yaml> |
マニフェストで定義されたリソースを削除 |
kubectl scale deployment <name> --replicas=<num> |
レプリカ数を変更 |
kubectl rollout status deployment/<name> |
ローリングアップデートの進行状況を確認 |
kubectl rollout undo deployment/<name> |
ローリングアップデートをロールバック |
以上で、Kubernetesを使ったコンテナ管理の手順は完了です。次回以降は、より高度なKubernetesの機能や、本番環境での運用について学んでいきます。



