テックカリキュラム

Admission Webhookの内部API仕様 ── Kubernetes API Serverとの通信プロトコルを徹底解説

Admission Webhookの内部API仕様 ── Kubernetes API Serverとの通信プロトコルを徹底解説

はじめに

KubernetesのAdmission Webhookは、API Serverと外部サービスを連携させることで、リソース作成・更新時の制御を実現する仕組みです。

OPA GatekeeperやKyvernoなども、このAdmission Webhook API仕様を利用して動作しています。

本記事では、Webhookの内部API仕様を以下の観点から詳細に解説します。

  • AdmissionReviewリクエストの構造
  • Webhookレスポンス仕様
  • MutatingとValidatingの違い
  • failurePolicyやtimeoutの挙動
  • セキュリティ(TLS / CAバンドル)

1. Admission Webhookの全体フロー

 kubectl apply ↓ API Server ↓ Mutating Webhook (0..n回) ↓ Validating Webhook (0..n回) ↓ etcd保存 or 拒否 

WebhookはHTTPS経由でAPI Serverから呼び出されます。


2. AdmissionReview リクエスト構造

API ServerはWebhookへAdmissionReviewオブジェクトをPOSTします。

基本JSON構造

{ "apiVersion": "admission.k8s.io/v1", "kind": "AdmissionReview", "request": { "uid": "12345-abcde", "kind": { "group": "", "version": "v1", "kind": "Pod" }, "resource": { "group": "", "version": "v1", "resource": "pods" }, "namespace": "default", "operation": "CREATE", "userInfo": { "username": "admin", "groups": ["system:masters"] }, "object": { // 作成されるPodの完全なSpec }, "oldObject": null, "dryRun": false } } 

主要フィールド解説

フィールド説明
uidリクエスト識別子(レスポンスに必須)
operationCREATE / UPDATE / DELETE / CONNECT
object新しいリソース内容
oldObjectUPDATE時の旧リソース
dryRunドライラン実行かどうか

3.AdmissionReview レスポンス仕様

Webhookは以下の形式でレスポンスを返します。

Validating Webhook レスポンス例

{ "apiVersion": "admission.k8s.io/v1", "kind": "AdmissionReview", "response": { "uid": "12345-abcde", "allowed": false, "status": { "message": "privilegedコンテナは禁止されています" } } } 

フィールド解説

フィールド説明
uidリクエストと一致させる必要あり
allowedtrue=許可, false=拒否
status.messageエラーメッセージ

4.Mutating WebhookのPatch仕様

Mutating Webhookはリソースを書き換えることができます。

レスポンス例(JSON Patch)

{ "response": { "uid": "12345-abcde", "allowed": true, "patchType": "JSONPatch", "patch": "W3sib3AiOiJhZGQiLCJwYXRoIjoiL3NwZWMvY29udGFpbmVycy8wL2VudiIsInZhbHVlIjpbeyJuYW1lIjoiRU5WIiwidmFsdWUiOiJwcm9kIn1dfV0=" } } 

※ patchはBase64エンコードされたJSONPatchです。

JSONPatchの中身(デコード後)

[ { "op": "add", "path": "/spec/containers/0/env", "value": [{"name":"ENV","value":"prod"}] } ] 

5. Webhook設定(ValidatingWebhookConfiguration)

apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: name: my-webhook webhooks: - name: validate.example.com clientConfig: service: name: webhook-service namespace: default path: "/validate" caBundle: <base64-encoded-ca> rules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE"] resources: ["pods"] failurePolicy: Fail timeoutSeconds: 5 

6. failurePolicyの内部挙動

設定Webhook障害時の挙動
FailWebhookが応答しない場合、リクエスト拒否
IgnoreWebhook障害時でも処理継続

セキュリティ系Webhookでは通常Failが推奨されます。


7. timeoutSeconds

Webhook呼び出しは同期処理です。タイムアウトを超えるとfailurePolicyに従います。

  • デフォルト:10秒
  • 推奨:2〜5秒

8.TLSとセキュリティ要件

Admission Webhookは<strong>HTTPS必須</strong>です。

必要条件:

  • サーバ証明書(Webhook側)
  • CA証明書をWebhookConfigurationに埋め込み
  • API Serverが証明書を検証
caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...

9. 実行順序と注意点

  • Mutating → Validating の順番
  • 複数Webhookは順番保証なし
  • 再帰的Mutationに注意
  • 副作用のあるWebhookは禁止

10.パフォーマンスとスケーリング

Webhookは同期処理のため:

  • 遅いWebhookはクラスタ全体に影響
  • Replica数を増やし冗長化
  • 水平スケーリング設計が重要

まとめ

  • AdmissionReviewがWebhook通信の基本単位
  • allowed=falseで拒否可能
  • MutatingではJSONPatchを使用
  • failurePolicyとtimeoutが可用性に直結
  • TLS必須でセキュア通信

Admission Webhookの内部仕様を理解することで、GatekeeperやKyvernoの動作原理も明確になります。