はじめに
Kubernetes のリソース作成フローの中で Admission Webhook はポリシ適用や自動変更の要となる重要な仕組みです。
本記事では、代表的な Admission Controller に Mutating Admission Webhook と Validating Admission Webhook がありますが、これらがどのタイミングで実行されるのかをまとめてみます。
Admission Webhook
Kubernetes における Admission Webhook はリソース要求処理フローの中で Kubernetes の API サーバ (kube-apiserver)がリクエストを受け取った後、etcd へ保存する前に実行される Admission Controller の一種です。
Admission Controller とは kube-apiserver がリクエストを処理する際に、リソースオブジェクトを操作(作成・変更・削除)するリクエストを検査・修正する仕組みです。
Admission Controller のうち、動的に登録・管理できるものは Webhook 型と呼ばれ、代表的なものに Mutating Webhook と Validating Webhook があります。
Admission Controller の位置づけ
kube-apiserver がリクエストを処理する際、以下のような流れで各フェーズが実行されます。
Admission Controller の種類
以下、2 種類の Admission Controller が kube-apiserver 内で順序立てて実行されます。
Mutating Admission Controller
- 機能
- リクエスト内容を変更・補完(Mutatate)する
- 代表例
- MutatingAdmissionWebhook
- DefaultStorageClass
- PodSecurity(一部)
Validating Admission Controller
- 機能
- リクエスト内容を検証(Validate)する
- 代表例
- ValidatingAdmissionWebhook
- ResourceQuota
- LimitRanger
Admission Controller の実行順序
結論から先に述べると、Admission Controller は Mutating → Defaulting → Validating の順番で実行されます。
① Mutating Admission Controller / Webhook
まず、リクエストされたオブジェクトを変更・補完します。
例:サイドカーコンテナの自動注入、ラベル自動付与
② Defaulting(デフォルト値の補完)
Kubernetes 内部ロジックにより、未指定フィールドにデフォルト値を設定します。
マニフェストに書かれていない内容も Live Manifests に存在するのはこの機能によるものです。
例:restartPolicy=Always
③ Validating Admission Controller / Webhook
最終的なオブジェクトを検証し、ポリシに違反していれば拒否します。
例:リソース制限・セキュリティルールの適用
Pod 作成時の典型的な処理フロー
以下は、Pod 作成時の典型的な処理フローになります。
基本的に Kubernetes では、「まず修正してから検証する」というパイプラインでリソースを制御しています。
Webhook の確認方法
クラスタ上で現在有効な Webhook 設定は、以下のコマンドで確認できます。
- Mutating Webhook の一覧
$ kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io
- Validating Webhook の一覧
$ kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io
各設定の rules や clientConfig を確認することで、どのリソースに対して、どの Webhook が適用されるかを確認することができます。
まとめ
Kubernetes における Admission Webhook の実行順は Mutating → Defaulting → Validating です。
| フェーズ | 種類 | 処理内容 |
|---|---|---|
| 1 | MutatingAdmissionWebhook | オブジェクトを変更・補完 |
| 2 | Defaulting(内部処理) | Kubernetes によるデフォルト値設定 |
| 3 | ValidatingAdmissionWebhook | 最終的な検証・ポリシ適用 |
