Kubernetesを使いWordPress+MySQL環境を作成の記事では、Docker Desktop内のKubernetesクラスタに、シングルインスタンスのWordPress+MySQLをデプロイしましたが、Kubernetesが持つコンテナオーケストレーション機能まで確認できませんでした。

そこで、この記事では、DockerコンテナをKubernetesノードとして使用してクラスターを構築できるKind(Kubernetes in Docker)を使って、ローカル環境にKubernetesクラスターを構築し、クラスターの動作確認を行ってみることにしました。

作業環境
- Windows 11
- Docker Desktopインストール
(Kindでクラスターを作成するので、設定の「Enable Kubernetes」はONにしません。) - WSL2 + Ubuntu
- Visual Studio Code + Remote – Containers 拡張
環境の詳細は、こちらの記事を参照してください。
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
#実行ファイルを PATH の通る場所へ移動
sudo mv kubectl /usr/local/bin/
#バージョン確認
kubectl version --client
【参考】Linux上でのkubectlのインストールおよびセットアップ
kind のインストール
#最新の安定版リリース番号を取得&バイナリ取得
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-linux-amd64
#実行権限を付与
chmod +x ./kind
#実行ファイルを PATH の通る場所へ移動
sudo mv ./kind /usr/local/bin/kind
#バージョン確認
kind version
ターミナル操作
$ curl -LO "https://dl.k8s.io/release/$(\
curl -L -s https://dl.k8s.io/release/stable.txt\
)/bin/linux/amd64/kubectl"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 138 100 138 0 0 683 0 --:--:-- --:--:-- --:--:-- 683
100 57.3M 100 57.3M 0 0 68.0M 0 --:--:-- --:--:-- --:--:-- 68.0M
~$ sudo mv kubectl /usr/local/bin/
~$ kubectl version --client
Client Version: v1.33.2
Kustomize Version: v5.6.0
~$ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-linux-amd64
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 97 100 97 0 0 254 0 --:--:-- --:--:-- --:--:-- 253
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 10.5M 100 10.5M 0 0 5953k 0 0:00:01 0:00:01 --:--:-- 40.5M
~$ chmod +x ./kind
~$ sudo mv ./kind /usr/local/bin/kind
~$ kind version
kind v0.29.0 go1.24.2 linux/amd64
~$
kind クラスタの作成
Kindマニフェストファイル(kind-config.yaml)を作成し、kindクラスタを起動します。
Kindマニフェストファイル(kind-config.yaml) を作成
#kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
kind クラスタを起動
以下のコマンドを実行し、kindクラスタの起動と確認を行う。
#kind-config.yamlファイルに基づいてKubernetesクラスターを作成する
#クラスター名は、test-cluster
kind create cluster --name test-cluster --config kind-config.yaml
#クラスターの基本情報を表示して、クラスターが正常に動作しているかを検証する
kubectl cluster-info
#クラスター内のノード一覧を表示して、各ノードの状態を確認する
kubectl get nodes
サンプルアプリ(3レプリカ NGINX)のデプロイ
Kubernetesマニフェストファイルの作成
3つのNginx Pod(app: demo)を作成し、リソース制限を定義。
Service(demo-svc)を作成し、上記Podを負荷分散対象に設定。
トラフィックルーティングは、Serviceのポート80への接続を、Podのポート80に転送。
#deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: nginx
image: nginx:stable-alpine
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
---
apiVersion: v1
kind: Service
metadata:
name: demo-svc
spec:
type: ClusterIP
selector:
app: demo
ports:
- port: 80
targetPort: 80
アプリをデプロイ
deployment.yamlファイルに定義されたリソースをKubernetesクラスターに適用し、アプリをデプロイする。(DeploymentとServiceの両方が作成される)
#Kubernetesに、deployment.yamlを適用
kubectl apply -f deployment.yaml
#Deploymentリソースの情報を取得
kubectl get deploy,pods,svc
ターミナル操作
~$ mkdir Kubernetes-pod3/
~$ cd Kubernetes-pod3/
~/Kubernetes-pod3$ nano kind-config.yaml
~/Kubernetes-pod3$ cat kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
~/Kubernetes-pod3$ kind create cluster --name test-cluster --config kind-config.yaml
Creating cluster "test-cluster" ...
✓ Ensuring node image (kindest/node:v1.33.1) 🖼
✓ Preparing nodes 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-test-cluster"
You can now use your cluster with:
kubectl cluster-info --context kind-test-cluster
Have a nice day! 👋
~/Kubernetes-pod3$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:41681
CoreDNS is running at https://127.0.0.1:41681/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
~/Kubernetes-pod3$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
test-cluster-control-plane Ready control-plane 42s v1.33.1
test-cluster-worker Ready <none> 33s v1.33.1
~/Kubernetes-pod3$ nano deployment.yaml
~/Kubernetes-pod3$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: nginx
image: nginx:stable-alpine
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
---
apiVersion: v1
kind: Service
metadata:
name: demo-svc
spec:
type: ClusterIP
selector:
app: demo
ports:
- port: 80
targetPort: 80
~/Kubernetes-pod3$ kubectl apply -f deployment.yaml
deployment.apps/demo-app created
service/demo-svc created
~/Kubernetes-pod3$ kubectl get deploy,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo-app 3/3 3 3 14s
NAME READY STATUS RESTARTS AGE
pod/demo-app-d56fc77f4-5v4bn 1/1 Running 0 14s
pod/demo-app-d56fc77f4-fpx58 1/1 Running 0 14s
pod/demo-app-d56fc77f4-tmvkb 1/1 Running 0 14s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo-svc ClusterIP 10.96.172.35 <none> 80/TCP 14s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2m16s
~/Kubernetes-pod3$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
224942e00516 kindest/node:v1.33.1 "/usr/local/bin/entr…" 9 minutes ago Up 9 minutes 127.0.0.1:41681->6443/tcp test-cluster-control-plane
c6510a43c56c kindest/node:v1.33.1 "/usr/local/bin/entr…" 9 minutes ago Up 9 minutes test-cluster-worker
nginxアクセス確認
#ポートフォワードによるホストからのアクセス
kubectl port-forward pod/demo-app-**********-***** 8081:80
#Service 経由でのアクセス
kubectl port-forward service/demo-svc 8080:80
~/Kubernetes-pod3$ kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-bhs5k 1/1 Running 0 9m1s
demo-app-d56fc77f4-bxfvv 1/1 Running 0 9m1s
demo-app-d56fc77f4-mmrsn 1/1 Running 0 9m1s
~/Kubernetes-pod3$ kubectl port-forward pod/demo-app-d56fc77f4-bhs5k 8081:80
Forwarding from 127.0.0.1:8081 -> 80
Forwarding from [::1]:8081 -> 80
Handling connection for 8081
Handling connection for 8081
~/Kubernetes-pod3$ kubectl get deploy,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo-app 3/3 3 3 12m
NAME READY STATUS RESTARTS AGE
pod/demo-app-d56fc77f4-bhs5k 1/1 Running 0 12m
pod/demo-app-d56fc77f4-bxfvv 1/1 Running 0 12m
pod/demo-app-d56fc77f4-mmrsn 1/1 Running 0 12m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo-svc ClusterIP 10.96.249.195 <none> 80/TCP 12m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
~/Kubernetes-pod3$ kubectl port-forward service/demo-svc 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
Handling connection for 8080

自動スケーリング(HPA)のテスト
Kubernetesにおける自動スケーリング(HPA: Horizontal Pod Autoscaler)のテストとは、HPAが期待通りにPodの数を増減させ、アプリケーションのパフォーマンスを維持できるかを確認するテストです。
HPAは、CPU使用率、メモリ使用率、またはカスタムメトリクス(例:QPS、メッセージキューの長さなど)に基づいて、DeploymentやStatefulSetなどのワークロードのPodレプリカ数を自動的に調整します。

metrics-server のデプロイ(HPA の前提)
HPA は Pod の CPU/メモリ使用率を取得する metrics-server が必要です。
#metrics-server のデプロイ
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
#kind 向けに Kubelet TLS 検証を無効化(証明書エラー回避)
kubectl -n kube-system patch deployment metrics-server \
--type='json' \
-p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'
#metrics-server が起動したことを確認
kubectl -n kube-system get pods -l k8s-app=metrics-server
自動スケーリング (HPA) の設定と確認
#HPA リソースを作成(CPU 利用率 50% を目標、最小1〜最大5レプリカ)
kubectl autoscale deployment demo-app \
--cpu-percent=50 --min=1 --max=5
#HPA が作成されたか確認
kubectl get hpa
#負荷をかけてスケール動作をテスト(別ターミナルで負荷用 Pod を起動(BusyBox で無限ループ))
kubectl run load-gen --rm -i --tty --image=busybox -- \
/bin/sh -c "while true; do wget -q -O- http://demo-svc; done"
#負荷を高くする場合は、下記の*を1,2,3・・・に変更しload-gen1,load-gen2,load-gen3・・・として複数ターミナルで実行する。
kubectl run load-gen* --rm -i --tty --image=busybox -- \
/bin/sh -c "while true; do wget -q -O- http://demo-svc; done"
#HPA の挙動をウォッチ(別ターミナルで監視する)
kubectl get hpa -w
kubectl get pods -o wide
*CPU 使用率が 50% を超えると replicas が増加する。
ターミナル操作
** metrics-server のデプロイと自動スケーリング (HPA) の設定 **
~/Kubernetes-pod3$ kubectl get deploy,pods,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo-app 3/3 3 3 22s
NAME READY STATUS RESTARTS AGE
pod/demo-app-d56fc77f4-58478 1/1 Running 0 22s
pod/demo-app-d56fc77f4-mmf8g 1/1 Running 0 22s
pod/demo-app-d56fc77f4-qwmnf 1/1 Running 0 22s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo-svc ClusterIP 10.96.168.193 <none> 80/TCP 22s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 96s
#metrics-server のデプロイ
~/Kubernetes-pod3$ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
#kind 向けに Kubelet TLS 検証を無効化(証明書エラー回避)
~/Kubernetes-pod3$ kubectl -n kube-system patch deployment metrics-server \
--type='json' \
-p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'
deployment.apps/metrics-server patched
#metrics-server 起動確認
~/Kubernetes-pod3$ kubectl -n kube-system get pods -l k8s-app=metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-56fb9549f4-bx4hj 0/1 Running 0 17s
metrics-server-867d48dc9c-btw64 0/1 Running 0 36s
#HPA リソースを作成(CPU 利用率 50% を目標、最小1〜最大5レプリカ)
~/Kubernetes-pod3$ kubectl autoscale deployment demo-app \
--cpu-percent=50 --min=1 --max=5
horizontalpodautoscaler.autoscaling/demo-app autoscaled
~/Kubernetes-pod3$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
demo-app Deployment/demo-app cpu: 0%/50% 1 5 3 18s
** 別ターミナルで負荷用 Pod (BusyBox で無限ループ)を起動する **
~/Kubernetes-pod3$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-app-d56fc77f4-58478 1/1 Running 0 6m3s 10.244.1.2 test-cluster-worker <none> <none>
demo-app-d56fc77f4-86pfw 1/1 Running 0 89s 10.244.1.10 test-cluster-worker <none> <none>
demo-app-d56fc77f4-m97dr 1/1 Running 0 74s 10.244.1.12 test-cluster-worker <none> <none>
demo-app-d56fc77f4-mmf8g 1/1 Running 0 6m3s 10.244.1.3 test-cluster-worker <none> <none>
demo-app-d56fc77f4-qwmnf 1/1 Running 0 6m3s 10.244.1.4 test-cluster-worker <none> <none>
load-gen 1/1 Running 0 2m42s 10.244.1.7 test-cluster-worker <none> <none>
load-gen1 1/1 Running 0 2m5s 10.244.1.8 test-cluster-worker <none> <none>
load-gen2 1/1 Running 0 103s 10.244.1.9 test-cluster-worker <none> <none>
load-gen3 1/1 Running 0 77s 10.244.1.11 test-cluster-worker <none> <none>
~/Kubernetes-pod3$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
demo-app Deployment/demo-app cpu: 65%/50% 1 5 5 4m13s
~/Kubernetes-pod3$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-app-d56fc77f4-58478 1/1 Running 0 7m4s 10.244.1.2 test-cluster-worker <none> <none>
demo-app-d56fc77f4-86pfw 1/1 Running 0 2m30s 10.244.1.10 test-cluster-worker <none> <none>
demo-app-d56fc77f4-m97dr 1/1 Running 0 2m15s 10.244.1.12 test-cluster-worker <none> <none>
demo-app-d56fc77f4-mmf8g 1/1 Running 0 7m4s 10.244.1.3 test-cluster-worker <none> <none>
demo-app-d56fc77f4-qwmnf 1/1 Running 0 7m4s 10.244.1.4 test-cluster-worker <none> <none>
~/Kubernetes-pod3$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
demo-app Deployment/demo-app cpu: 53%/50% 1 5 5 5m4s
** 別端末で実施している無限ループによる負荷を停止 **
~/Kubernetes-pod3$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-app-d56fc77f4-mmf8g 1/1 Running 0 17m 10.244.1.3 test-cluster-worker <none> <none>
** HPA 挙動をウォッチ(別ターミナルで監視)**
~$ kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
demo-app Deployment/demo-app cpu: 0%/50% 1 5 3 7m45s
demo-app Deployment/demo-app cpu: 0%/50% 1 5 1 8m
demo-app Deployment/demo-app cpu: 14%/50% 1 5 1 8m30s
demo-app Deployment/demo-app cpu: 46%/50% 1 5 4 9m31s
demo-app Deployment/demo-app cpu: 47%/50% 1 5 4 9m46s
demo-app Deployment/demo-app cpu: 46%/50% 1 5 4 10m
demo-app Deployment/demo-app cpu: 45%/50% 1 5 4 10m
demo-app Deployment/demo-app cpu: 46%/50% 1 5 4 11m
demo-app Deployment/demo-app cpu: 52%/50% 1 5 4 11m
demo-app Deployment/demo-app cpu: 65%/50% 1 5 4 11m
demo-app Deployment/demo-app cpu: 65%/50% 1 5 5 11m
demo-app Deployment/demo-app cpu: 57%/50% 1 5 5 12m
demo-app Deployment/demo-app cpu: 53%/50% 1 5 5 12m
demo-app Deployment/demo-app cpu: 59%/50% 1 5 5 12m
demo-app Deployment/demo-app cpu: 65%/50% 1 5 5 12m
demo-app Deployment/demo-app cpu: 64%/50% 1 5 5 13m
demo-app Deployment/demo-app cpu: 63%/50% 1 5 5 14m
demo-app Deployment/demo-app cpu: 64%/50% 1 5 5 15m
demo-app Deployment/demo-app cpu: 69%/50% 1 5 5 15m
demo-app Deployment/demo-app cpu: 55%/50% 1 5 5 16m
demo-app Deployment/demo-app cpu: 9%/50% 1 5 5 16m
demo-app Deployment/demo-app cpu: 40%/50% 1 5 5 16m
demo-app Deployment/demo-app cpu: 52%/50% 1 5 5 16m
demo-app Deployment/demo-app cpu: 40%/50% 1 5 5 17m
demo-app Deployment/demo-app cpu: 35%/50% 1 5 5 17m
demo-app Deployment/demo-app cpu: 20%/50% 1 5 5 17m
demo-app Deployment/demo-app cpu: 19%/50% 1 5 5 17m
demo-app Deployment/demo-app cpu: 9%/50% 1 5 5 18m
demo-app Deployment/demo-app cpu: 1%/50% 1 5 5 18m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 5 18m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 5 20m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 5 21m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 4 22m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 4 22m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 2 22m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 2 22m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 1 23m
demo-app Deployment/demo-app cpu: 0%/50% 1 5 1 23m
*別ターミナルで実行している無限ループ処理による負荷の増減によりREPLICA Podの数が1~5の範囲で増減する。
【参考】HPAの挙動。
Pod が増えるのはすぐ:HPA はスケールアップを積極的に行う
Pod が減るのは遅い:デフォルトで 5 分間の安定化ウィンドウがあるため
チューニング方法:behavior.scaleDown で stabilizationWindowSeconds と policies を調整
** HPA リソースを削除 **
~/Kubernetes-pod3$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
demo-app Deployment/demo-app cpu: 0%/50% 1 5 1 20m
~/Kubernetes-pod3$ kubectl delete hpa demo-app
horizontalpodautoscaler.autoscaling "demo-app" deleted
~/Kubernetes-pod3$ kubectl get hpa
No resources found in default namespace.
~/Kubernetes-pod3$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-app-d56fc77f4-mmf8g 1/1 Running 0 26m 10.244.1.3 test-cluster-worker <none> <none>
~/Kubernetes-pod3$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-mmf8g 1/1 Running 0 26m
** HPA を削除しても Pod 数が 1 のままな理由 **
HPA を削除しても Pod 数が 1 のままなのは、HPA は Deployment の spec.replicas 字段を動的に書き換えてスケール操作を行っているため。
HPA を削除しても、そのときにセットされていた spec.replicas(今回は 1)が残り続けるだけで、自動的に元のレプリカ数(たとえば 3)に戻らない。
** Pod 数を元に戻すには、手動で書き換える **
~/Kubernetes-pod3$ kubectl scale deployment demo-app --replicas=3
deployment.apps/demo-app scaled
~/Kubernetes-pod3$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-8bjqd 1/1 Running 0 9s
demo-app-d56fc77f4-ckcc4 1/1 Running 0 9s
demo-app-d56fc77f4-mmf8g 1/1 Running 0 42m
自動復旧(自己修復)のテスト
Deployment は常に指定レプリカ数を維持しようとします。
Control Plane
ReplicaSet Controller: ポッドが不足していることを検知し、新しいポッドの作成を決定 Node Controller: ノードの異常を検知し、そのノード上のポッドを「削除対象」として判定 kube-scheduler: 新しいポッドをどのWorker Nodeに配置するかを決定
Worker Node
kubelet: Control Planeからの指示を受けて、実際にポッドを起動・停止・再起動
Pod の手動削除で自己修復
** Pod の手動削除で自己修復を確認 **
~/Kubernetes-pod3$ kubectl get pods -l app=demo -w
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-8bjqd 1/1 Running 0 2m57s
demo-app-d56fc77f4-ckcc4 1/1 Running 0 2m57s
demo-app-d56fc77f4-mmf8g 1/1 Running 0 44m
#任意の Pod を削除
~/Kubernetes-pod3$ POD=$(kubectl get pods -l app=demo -o name | head -n1)
~/Kubernetes-pod3$ kubectl delete $POD
pod "demo-app-d56fc77f4-8bjqd" deleted
** 削除直後に同じ Deployment コントローラが新しい Pod を(数秒以内)に作成する。**
~/Kubernetes-pod3$ kubectl get pods -l app=demo -w
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-ckcc4 1/1 Running 0 3m37s
demo-app-d56fc77f4-fncp6 1/1 Running 0 5s
demo-app-d56fc77f4-mmf8g 1/1 Running 0 45m
** 別ターミナルでのモニター状態 **
~kubectl get pods -l app=demo -w
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-ckcc4 1/1 Running 0 8m35s
demo-app-d56fc77f4-fncp6 1/1 Running 0 5m3s
demo-app-d56fc77f4-mmf8g 1/1 Running 0 50m
demo-app-d56fc77f4-ckcc4 1/1 Terminating 0 9m52s
demo-app-d56fc77f4-smjkl 0/1 Pending 0 0s
demo-app-d56fc77f4-smjkl 0/1 Pending 0 0s
demo-app-d56fc77f4-smjkl 0/1 ContainerCreating 0 0s
demo-app-d56fc77f4-ckcc4 0/1 Completed 0 9m53s
demo-app-d56fc77f4-ckcc4 0/1 Completed 0 9m53s
demo-app-d56fc77f4-ckcc4 0/1 Completed 0 9m53s
demo-app-d56fc77f4-smjkl 1/1 Running 0 1s
コンテナプロセスの強制終了(Crash)で自己修復
** 強制終了対象 Pod を exec で起動して、nginx プロセスを killする **
~/Kubernetes-pod3$ kubectl get pods -l app=demo
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-fncp6 1/1 Running 0 10m
demo-app-d56fc77f4-mmf8g 1/1 Running 0 55m
demo-app-d56fc77f4-smjkl 1/1 Running 0 3m42s
#Pod 自体は残り、コンテナプロセスのみ再起動する(RESTARTS が増加)
~/Kubernetes-pod3$ kubectl exec -it demo-app-d56fc77f4-fncp6 -- /bin/sh
#コンテナ内でプロセスを終了
/ # pkill -TERM nginx
/ # command terminated with exit code 137
~/Kubernetes-pod3$ kubectl get pods -l app=demo
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-fncp6 1/1 Running 1 (20s ago) 11m
demo-app-d56fc77f4-mmf8g 1/1 Running 0 56m
demo-app-d56fc77f4-smjkl 1/1 Running 0 5m2s
~/Kubernetes-pod3$
** 別ターミナルでのモニター状態 **
~$ kubectl get pods -l app=demo -w
NAME READY STATUS RESTARTS AGE
demo-app-d56fc77f4-fncp6 1/1 Running 0 9m38s
demo-app-d56fc77f4-mmf8g 1/1 Running 0 55m
demo-app-d56fc77f4-smjkl 1/1 Running 0 3m18s
demo-app-d56fc77f4-fncp6 0/1 Completed 0 11m
demo-app-d56fc77f4-fncp6 1/1 Running 1 (1s ago) 11m
Kubernetes テスト環境の削除
#HPA(HorizontalPodAutoscaler)の削除
kubectl delete hpa demo-app
#Deployment と Service の削除
kubectl delete deployment demo-app
kubectl delete service demo-svc
#metrics-server の削除
kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
#kind クラスタの削除
kind delete cluster --name test-cluster
まとめ
以上の手順で、ローカルの kind クラスタ上で 3 Pod の自動スケーリング・自動復旧を確認しました。
Kubernetesを使いWordPress+MySQL環境を作成の記事での、シングルインスタンスのWordPress+MySQLをデプロイから、Kubernetesの理解が少し進んだ様に思います。

