第05章:マニフェスト入門(YAMLの読み方と“宣言型”)📄✨
この章は 「Kubernetesの設計図=マニフェスト(YAML)」を、読めて・少し書けて・安全に適用できる ようになる回です😊 コマンド暗記よりも “読み方の型” を先に作るよ〜!🧠🔧
この章でできるようになること ✅🎯
- YAMLを見て「何のリソースで、何がしたいか」をざっくり読める 👀✨
apiVersion / kind / metadata / specの4点セットを理解する 📦kubectl applyで作成・更新できる(=宣言型の入口)🚪kubectl diffと--dry-run=clientで 事故らず 変更できる 🧯kubectl explainで「このフィールド何?」を自力で調べられる 🔎
まず「宣言型」ってなに?🤔🧾
Kubernetesはざっくりこういう世界観です👇
- 命令型:「今すぐこれをやって!」(手順を指示)🗣️
- 宣言型:「こういう状態にしておいて!」(理想の状態を宣言)🧙♂️✨
マニフェストは後者。 つまり “理想の完成図(desired state)” を書く → Kubernetesが 現実を寄せてくる って感じです💪
この「理想を宣言する」思想がKubernetesのど真ん中です。
マニフェストの必須フィールドとして apiVersion / kind / metadata / spec が挙げられてます。(Kubernetes)
YAMLミニ基礎(ここでコケるの、だいたいこれ)🥲🧱
1) インデントが命(基本はスペース)🫠
- YAMLは インデントで構造が決まる
- 同じ階層はインデントを揃える(タブは避けるのが安全)⚠️
2) 配列(リスト)は - で始まる 📌
例:containers は配列なので - が出ます。
3) 文字列のクォートは「困ったら付ける」🧷
コロン : や {} や # が混ざると誤解されがちなので、怪しい文字列はクォートすると安心😌
Kubernetesマニフェストの“4大パーツ”🧩
マニフェストを見たら、まずこれを探す!👇
apiVersion:どのAPIグループ/バージョン?🧬kind:何の種類?(Pod / Service / Deployment…)📦metadata:名前・ラベル・namespaceなど名札🏷️spec:理想の状態(何をどう動かすか)🧠
この4つは公式にも「必要なフィールド」としてまとめられてます。(Kubernetes)
逆にいうと、最初は
specの細部がわからなくてもOK! 「kind と metadata.name と spec の雰囲気」が読めれば勝ちです🎉
重要:status は基本 “書かない” 🙅♂️📛
kubectl get -o yaml で出したYAMLには status が出てきたりします。
でも status は クラスタ側が記録する“結果” なので、基本は触りません✋
まずは1個、手で作ってみよう(超ミニPod)🐣🚀
0) 作業用フォルダとファイル📁
ファイル名は例:05-hello-pod.yaml
1) マニフェストを書く ✍️
apiVersion: v1
kind: Pod
metadata:
name: hello-pod
labels:
app: hello
spec:
containers:
- name: hello
image: node:24-alpine
ports:
- containerPort: 3000
command: ["node"]
args:
- "-e"
- "require('http').createServer((req,res)=>{res.end('hello k8s');}).listen(3000)"
kind: Pod→ Podを作るよ!📦metadata.name→ 名前はhello-pod🏷️spec.containers[]→ コンテナの配列(ここで-が出る)📌image: node:24-alpine→ Node 24 は Active LTS 扱い(2026-02時点)🟢(nodejs.org)
2) “事故らない”チェック(dry-run)🧯✅
いきなり適用せず、まず クライアント側でdry-run します。
kubectl apply --dry-run=client -f 05-hello-pod.yaml
--dry-run=client は「実際には送らず、送る予定の内容をプレビューできる」系の用途として案内されています。(Kubernetes)
さらに出力も見たいなら:
kubectl apply --dry-run=client -f 05-hello-pod.yaml -o yaml
3) 差分も見ておく(diff)🧠🔍
「いまのクラスタ」と「ファイル」の差分を見ます。
kubectl diff -f 05-hello-pod.yaml
kubectl diff は差分がある/ないで終了コードも変わります(CIで便利)🧪(Kubernetes)
4) いよいよ適用(apply)🚀
kubectl apply -f 05-hello-pod.yaml
apply は「存在しなければ作成、あれば更新」という流れで動きます。(Kubernetes)
確認!
kubectl get pod hello-pod -o wide
kubectl logs hello-pod
ポートフォワードしてブラウザ/HTTPで確認もできます📡
kubectl port-forward pod/hello-pod 3000:3000
別ターミナルで:
curl http://localhost:3000
5) “宣言型っぽさ” を体験しよう(更新してapply)🔁✨
hello k8s の文字を変えてみて👇
- "require('http').createServer((req,res)=>{res.end('hello manifest!!');}).listen(3000)"
そしてもう一回:
kubectl diff -f 05-hello-pod.yaml
kubectl apply -f 05-hello-pod.yaml
kubectl logs hello-pod
これが 「完成図を更新 → 現実が追従」 の体験です😎
「このフィールド何…?」を解決する最強コマンド🔎💪
kubectl explain
マニフェストはフィールド名が多くて迷子になります😵💫 そんな時に 公式の“構造説明”をその場で引ける のがこれ!
kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers
kubectl explain pod.spec.containers.ports
kubectl explain はサーバが提供する OpenAPI 情報からフィールド構造を説明してくれます。(Kubernetes)
よくあるミス集(最短で直す)🧯🛠️
A) mapping values are not allowed...(だいたいコロン周り)😇
- 文字列に
:が混ざってる → クォートで囲う - インデントがズレてる → 近い行のスペースを確認
B) spec: containers: ... の階層ミス(インデント)🫠
containersがspecの下にいない- name:の位置がずれてる
C) “配列なのに - がない” 🙃
containersやportsは配列になりがち-を忘れると別構造として解釈される
AIで楽するポイント(でも丸投げしない🤖🧠)
AIは 「整形」「説明」「ミス探し」 が得意です💪✨ おすすめの使い方👇
1) YAML読解係にする📖
「このYAMLがやってることを日本語で3行で」 「kindごとに目的を箇条書きで」📝
2) “よくあるミス”検知係にする🧯
kubectl applyのエラー全文- 問題のYAML
を貼って「原因候補3つ+直し方」で出してもらう👍
3) でも最後に自分で確認する✅
AIはフィールド名を それっぽく 作ることがあるので、最後に
kubectl explain ...で存在確認 🔎(Kubernetes)kubectl apply --dry-run=client ...で安全確認 🧯(Kubernetes)
この2枚ガードが超おすすめです💯
ミニ課題(10〜15分)⏱️🎒
課題1:ラベルを増やす🏷️
metadata.labels に tier: demo を追加して、diff → apply してみよう!
課題2:ポートをわざと壊して直す😈➡️😇
containerPort: 3000 を containerPort: "3000"(文字列)にしてみる
→ dry-run や apply でどう怒られるか見る
→ 元に戻す
課題3:kubectl explain で “自力で調べる”🔍
kubectl explain pod.spec を見て
「containers以外にどんな項目があるか」眺めてみる👀(Kubernetes)
片付け(消すのも大事)🧹
kubectl delete -f 05-hello-pod.yaml
まとめ🎉
- マニフェストは 理想の状態を宣言する設計図 🧾✨
- まずは
apiVersion / kind / metadata / specを読む癖!(Kubernetes) - 変更は dry-run → diff → apply の順で安全運転🧯🚦(Kubernetes)
- わからないフィールドは kubectl explain で殴る🔎💥(Kubernetes)
次の章(6章)では、マルチノード前提で 「イメージをクラスタに届ける」 が主役になります📦🚚 マニフェストが読めるようになると、そこがめちゃスムーズになりますよ〜!😄