第08章:Deploymentで“落ちても戻る”を作る🛟🤖💥➡️😇
この章は 「Kubernetesっぽさ、ここで一気に来る」 回です🙌 Pod を直接動かすだけだと「落ちたら終わり」になりがち。でも Deployment を使うと、落ちても勝手に復活します🔥 (そして更新も “いい感じに” してくれます🔄)
ちなみに本日時点の Kubernetes の最新安定は v1.35.1(2026-02-10) です📅 (Kubernetes) ローカル学習で kind を使う場合、v0.31.0 が Kubernetes 1.35.0 をデフォルトにしています🧪 (GitHub)
この章でできるようになること🎯✨
- Deployment を作って、Node/TS の API を “常駐” させる🏠
- replicas(複製数)で、落ちにくい形にする👯♂️
- Pod をわざと消して、自動復活(self-healing) を目で見る😈➡️😇
- 画像タグを変えて、ローリング更新(rollout) を体験する🔄
kubectl rollout status / history / undo / restartを触る✋ (Kubernetes)
まずは超ざっくり理解🧠🍙
Deploymentってなに?🤔
「理想の状態(desired state)」を宣言して、現実を合わせ続ける係です📌 たとえば…
- 「Podを 2個 走らせたい」👯
- 「コンテナはこのイメージ(タグ)で動かしたい」📦
- 「更新するときは、止めずに少しずつ入れ替えたい」🔄
…と書いておくと、Kubernetes が 監視して勝手に調整してくれます👀✨
ざっくり関係図👪
Deployment は裏で ReplicaSet を作り、ReplicaSet が Pod の数を維持します🧩 (だから Pod を消しても戻る!)
ハンズオン①:Deploymentを作る🏗️📄
ここでは例として my-api という Node/TS API を動かす想定でいきます🍔
(第7章で作った API コンテナをそのまま使うイメージ!)
1) deployment.yaml を作る📝
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
labels:
app: my-api
spec:
replicas: 2
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api
image: YOUR_REGISTRY/YOUR_IMAGE:1.0.0
ports:
- containerPort: 3000
env:
- name: PORT
value: "3000"
ポイントだけ🎯
replicas: 2← ここが「落ちにくさ」の第一歩👯♂️selector.matchLabelsとtemplate.metadata.labelsは 同じにする(超重要)🧷
2) 反映して状態を見る👀
kubectl apply -f deployment.yaml
kubectl get deploy
kubectl get rs
kubectl get pods -l app=my-api -o wide
見どころ👀✨
deploy/my-apiができるrs(ReplicaSet)ができるpodsが 2個 起動する(replicas=2 だから)🎉
ハンズオン②:Podをわざと消して“復活”を観察😈➡️😇
1) Podを監視しながら消す🕵️♂️
まず監視:
kubectl get pods -l app=my-api -w
別ターミナルで、Pod 名を1つ消す:
kubectl get pods -l app=my-api
kubectl delete pod <消したいPod名>
すると…
- 消えた!💥
- でもすぐ 新しい Pod が作られる!🧟♂️✨ これが self-healing(自動回復) です🛟
Deployment は “Pod を直接守る” というより、「この数いるはず」 を守る仕組みです🧠 だから Pod は使い捨て感覚で OK 🙆♂️
ハンズオン③:replicas を増減して “強さ” を変える💪📈
kubectl scale deployment/my-api --replicas=3
kubectl get pods -l app=my-api
減らすのも同じ:
kubectl scale deployment/my-api --replicas=1
kubectl get pods -l app=my-api
感覚としてはこれ👇
- replicas=1:落ちたら一瞬止まる(作り直しはされるけど)😵
- replicas>=2:片方が落ちても、片方が生きてる☺️(※Service があると更に実感できる。次章!🧷)
ハンズオン④:ロールアウト(安全に更新)を体験🔄🧪
Deployment の “うまみ” は 更新の自動運転にもあります🚗💨 (止めずに、少しずつ入れ替える)
1) イメージタグを更新して apply 🏷️
deployment.yaml のイメージを :1.0.1 に変える:
image: YOUR_REGISTRY/YOUR_IMAGE:1.0.1
反映:
kubectl apply -f deployment.yaml
2) 更新の進み具合を見る👀
kubectl rollout status deployment/my-api
kubectl get rs
kubectl get pods -l app=my-api
- 新しい ReplicaSet が増える📈
- 古い ReplicaSet が減る📉
- Pod が “総入れ替え” ではなく 順番に差し替わる🔄
これは Deployment がやってくれるローリング更新の基本ムーブです📚 (Kubernetes)
ハンズオン⑤:やらかした!を“戻す”(Rollback)🧯⏪
1) 履歴を見る📜
kubectl rollout history deployment/my-api
2) ひとつ前に戻す⏪
kubectl rollout undo deployment/my-api
undo は公式コマンドとして用意されています🧯 (Kubernetes)
便利ワザ:再起動だけしたい(rollout restart)🔁
設定を変えた(ConfigMap/Secret など)けど、同じイメージで Pod を作り直したいことってあります。 そんな時はこれ👇
kubectl rollout restart deployment/my-api
kubectl rollout status deployment/my-api
公式の rollout restart です🔁 (Kubernetes)
よくある事故ポイント集😇💥(そして直し方)
1) Pod が増えない / 0 のまま😵
selectorとtemplate.labelsがズレてる可能性大🧷 → YAML を見直す(この章の最重要罠⚠️)
2) ImagePullBackOff 😭
- イメージ名・タグ間違い、またはレジストリ認証の問題🔐 → まずこれ👇
kubectl describe pod <Pod名>
3) CrashLoopBackOff 🤕
- アプリが起動直後に落ちてる → まずログ👇
kubectl logs <Pod名>
ミニ課題(やると理解が固定される)📌📝
- replicas=1 にして Pod を消す → “止まる感” を自分の目で確認😵
- replicas=2 に戻して Pod を消す → “戻る感” を確認😇
- イメージタグを 1.0.2 → 1.0.3 と2回更新して、
rollout historyが増えるのを見る📜✨ rollout undoで戻す(戻ったらget rsも見てね)⏪
AIで楽するポイント🤖✨(コピペでOK)
- 「この Deployment YAML、初心者がやりがちなミスを3つ指摘して」🧠
- 「
kubectl describeの出力を貼るので、原因候補を優先順位付きで」🔍 - 「CrashLoop のログを貼るので、次に打つ kubectl コマンドを順番に」🥋
- 「rollout が進まない。
kubectl rollout statusとget rsの見方を超かみ砕いて」🥄
次の第9章で Service を入れると、replicas>=2 の強さがさらに気持ちよく分かります🧷🚀 「Podが差し替わっても、同じ名前でつながる」世界へ突入です😎