Dev Study
← 研修トップ

宣言的に動かす — Kubernetes と Terraform に共通する仕組み

「望む状態を書けば、あとは道具がそうしてくれる」。半分だけ正しい言い方です。Kubernetes は比べ続け、Terraform は呼ばれたときだけ比べます。apply が返っても動いたとは限りません。状態ファイルは世界の写しで、plan は見積もりです。変えられない属性は作り直しになり、誰かが後から書けば宣言は上書きされます。戻すことさえ、新しい宣言を1つ出すことです。道具の使い方ではなく、宣言と世界のずれがどこで生まれ、誰が埋めるのかを、kubernetes.io と developer.hashicorp.com の逐語と、手元のコンテナで動かす k3s・Terraform の実演から積み上げます。

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