Webhookの生成

Kubernetesには、Admission Webhookと呼ばれる拡張機能があります。 これは特定のリソースを作成・更新する際にWebhook APIを呼び出し、バリデーションやリソースの書き換えをおこなうための機能です。

kubebuilderコマンドでは、以下の3種類のオプションで生成するWebhookを指定することができます。

  • --programmatic-validation: リソースのバリデーションをおこなうためのWebhook
  • --defaulting: リソースのフィールドにデフォルト値を設定するためのWebhook
  • --conversion: カスタムリソースのバージョンアップ時にリソースの変換をおこなうためのWebhook

ここでは--programmatic-validation--defaultingを指定して、Tenantリソース用のWebhookを生成してみましょう。

$ kubebuilder create webhook --group multitenancy --version v1 --kind Tenant --programmatic-validation --defaulting
$ make manifests

以下のファイルが新たに追加されました。

├── api
│    └── v1
│        ├── tenant_webhook.go
│        └── zz_generated.deepcopy.go
├── config
│    └── webhook
│        ├── kustomization.yaml
│        ├── kustomizeconfig.yaml
│        ├── manifests.yaml
│        └── service.yaml
└── main.go

api/v1

tenant_webhook.goがWebhook実装の雛形になります。 このファイルにWebhookの実装を追加していくことになります。

zz_generated.deepcopy.goは自動生成されるコードなので編集しないようにしてください。

config/webhook

config/webhook下のファイルは、Webhook機能を利用するために必要なマニフェストになります。 基本的に編集する必要はありません。

main.go

main.goには、以下のようなWebhookの初期化をおこなうためのコードが追加されています。

if err = (&multitenancyv1.Tenant{}).SetupWebhookWithManager(mgr); err != nil {
    setupLog.Error(err, "unable to create webhook", "webhook", "Tenant")
    os.Exit(1)
}

kustomization.yamlの編集

kubebuilderコマンドで生成した直後の状態では、make manifestsコマンドでマニフェストを生成しても、Webhook機能が利用できるようにはなっていません。

config/default/kustomization.yamlファイルを編集する必要があります。

生成直後はbases../webhook../certmanagerpatchesStrategicMergemanager_webhook_patch.yamlwebhookcainjection_patch.yamlvarsがコメントアウトされていますが、これらのコメントを外します。

kustomization.yaml

bases:
# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
# crd/kustomization.yaml
- ../webhook
# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required.
- ../certmanager
patchesStrategicMerge:
# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
# crd/kustomization.yaml
- manager_webhook_patch.yaml

# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'.
# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks.
# 'CERTMANAGER' needs to be enabled to use ca injection
- webhookcainjection_patch.yaml
# the following config is for teaching kustomize how to do var substitution
vars:
# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix.
- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR
  objref:
    kind: Certificate
    group: cert-manager.io
    version: v1alpha2
    name: serving-cert # this name should match the one in certificate.yaml
  fieldref:
    fieldpath: metadata.namespace
- name: CERTIFICATE_NAME
  objref:
    kind: Certificate
    group: cert-manager.io
    version: v1alpha2
    name: serving-cert # this name should match the one in certificate.yaml
- name: SERVICE_NAMESPACE # namespace of the service
  objref:
    kind: Service
    version: v1
    name: webhook-service
  fieldref:
    fieldpath: metadata.namespace
- name: SERVICE_NAME
  objref:
    kind: Service
    version: v1
    name: webhook-service

results matching ""

    No results matching ""