← 研修トップ
宣言的に動かす — Kubernetes と Terraform に共通する仕組み
「望む状態を書けば、あとは道具がそうしてくれる」。半分だけ正しい言い方です。Kubernetes は比べ続け、Terraform は呼ばれたときだけ比べます。apply が返っても動いたとは限りません。状態ファイルは世界の写しで、plan は見積もりです。変えられない属性は作り直しになり、誰かが後から書けば宣言は上書きされます。戻すことさえ、新しい宣言を1つ出すことです。道具の使い方ではなく、宣言と世界のずれがどこで生まれ、誰が埋めるのかを、kubernetes.io と developer.hashicorp.com の逐語と、手元のコンテナで動かす k3s・Terraform の実演から積み上げます。
- 1約 8 分比べ続ける者と、呼ばれたときだけ比べる者 — コントローラと plan宣言は望む状態の記録にすぎません。世界がそれに近づくのは、誰かが世界と比べて差を埋めたときだけです。
- 2約 7 分apply が返ったのは記録された時で、動いた時ではない — spec と statusKubernetes の apply が `created` を返すのは、望む状態(spec)が記録された時点です。動いているかは、コントローラが観測して書く status を見るまで分かりません。
- 3約 8 分2回流して同じになるのは、宣言に書いた部分だけ同じ宣言を2回流しても2回目は何もしない。これが成り立つのは、道具が記録と比べられる範囲だけです。
- 4約 9 分状態ファイルは世界の写しにすぎないTerraform の state は、構成に書いたリソースと世界の実体を結ぶ対応表に、属性の写しを添えたものです。世界そのものではありません。
- 5約 8 分plan は見積もり — 保存した計画が見張っているものterraform plan は、読んだ時点の世界に対して「適用したらこう動かす」という操作の列を提案するだけで、何も実行しません。保存した plan は、その時点の世界を前提にした見積もりです。
- 6約 8 分順序は参照から生まれる — 依存グラフと並列適用Terraform は、属性の参照を辺にした依存グラフを作り、依存が済んだ節から並列に進めます(既定で最大10)。順序が生まれるのは参照のある所だけで、参照の無いもの同士は同時に動きます。
- 7約 9 分置き換えか更新か — 変えられない属性は、作り直しになる宣言の1行を書き換えたとき、世界の側で起きるのは「その場で直す」か「壊して作り直す」かのどちらかです。属性ごとに「その場で変えられるか」を申告しているのは、Terraform ではプロバイダのスキーマ、Kubernetes では API サーバの検証とコントローラの作りです。
- 8約 8 分数えるのも送るのも、ラベルへの問い合わせ — セレクタと所属ReplicaSet が「自分の Pod」を数えるのも、Service が送り先を決めるのも、名前や作った履歴ではなく、その時点でセレクタに合うラベルを持つ Pod への問い合わせです。
- 9約 8 分生きているかと、受けられるかは別の問い — liveness と readinessreadiness プローブは「いま通信を送ってよいか」、liveness プローブは「作り直すべきか」を尋ねます。readiness が失敗しても再起動は起きず、Pod の Ready が false になるだけです。
- 10約 8 分予約と上限は、別の者が別の時点で使う数 — requests と limitsマニフェストの resources には requests と limits が並んで書かれますが、読む者も読む時点も違います。requests はスケジューラが Pod を置くときに合計で足し合わせる申告で、使用量ではありません。limits はカーネルが、動いている間に cgroup を通して強制します。
- 11約 7 分誰が最後に書いたか — 黙って戻す apply と、拒む apply同じフィールドに書き手が2人いると、宣言は「最後に書いた者の値」でしかありません。既定の kubectl apply は誰が値を変えたかを知らず、ファイルに書いた値へ黙って戻します。
- 12約 7 分戻すのも、新しい宣言を1つ出すこと「戻す」は過去へ移動する操作ではありません。過去の中身を持った新しい宣言を、もう1つ出す操作です。