Webhook 検証は、Application Load Balancer(ALB)Ingress コントローラー 2.15.0 でサポートされています。ALB Ingress コントローラー 2.15.0 は、アドミッション Webhook を使用して API リクエストのパラメーターを検証できます。API リクエストに無効な構成が含まれている場合、システムはリクエストをインターセプトし、エラーメッセージを返します。これは、無効なパラメーター形式が原因で発生する調整エラーを防ぐのに役立ちます。このトピックでは、Webhook 検証の実装方法と一般的なエラーメッセージについて説明します。
Webhook 検証の実装方法
動的アドミッション Webhook
Kubernetes の動的アドミッション制御機能によって提供されるアドミッション Webhook は、Kubernetes 1.9 でサポートされています。クラスタにアドミッション Webhook のコンポーネントをデプロイした後、Webhook を使用して [API サーバー] に送信されるリクエストを検証できます。リクエストが [API サーバー] に送信されると、Webhook はリクエストをインターセプトし、リクエストが認証および承認された後、リクエストに必要なリソースオブジェクトが永続化される前に、リクエストを検証します。
Webhook 検証の利点
無効なリクエストをできるだけ早くインターセプトする: Webhook は、無効な構成を含む API リクエストをできるだけ早くインターセプトできます。これは、無効な作成リクエストを減らし、計算リソースとネットワークリソースの無駄を防止します。また、異常なクラスタ状態のリスクも軽減します。
コントローラーロジックの分離: Webhook は、検証を ALB Ingress コントローラーのロジックから分離します。これにより、ALB Ingress コントローラーはリソースのデプロイと管理に集中できます。これは、単一責任の原則に基づいてシステムをモジュール化するのに役立ちます。モジュール化されたシステムは、サービスのメンテナンスと拡張を容易にします。
セキュリティの向上: YAML 検証ロジックは、個別の Webhook サービスに基づいて実装されます。これにより、Webhook サービスを使用して、クラスタ内のリソース作成リクエストを集中管理および制御し、悪意のある構成や無効な構成のリスクを軽減できます。
無効な構成の認識を可能にする: Webhook 検証サービスは、無効なパラメーターをできるだけ早くインターセプトし、エラーメッセージを提供できます。エラーメッセージによって提供される情報に基づいて、問題のトラブルシューティングと修正を行うことができます。
Webhook コンポーネント
ValidatingAdmissionWebhook: [API サーバー] が Ingress の作成または更新リクエストを受信したときに呼び出される Webhook の URL を指定し、Webhook 検証をトリガーする操作とリソースを指定します。ValidatingAdmissionWebhook リソースは、ALB Ingress コントローラーと共にデプロイされます。
TLS 証明書: [API サーバー] と Webhook サービス間の通信を暗号化します。
Webhook Service: AdmissionReview リクエストを処理し、Ingress リソースを検証してから、
AdmissionResponse
を生成します。
Webhook インターセプト メッセージ
Webhook インターセプト メッセージの例
次の例は、Ingress YAML ファイルに無効な構成が含まれている場合に表示される Webhook インターセプト メッセージを示しています。インターセプト メッセージには、Webhook によって返されるエラーメッセージが含まれており、
listen-ports
アノテーションが無効な形式で指定されていることを示しています。エラーメッセージのエラーの詳細に基づいて、この問題を解決できます。コンソールに表示されるエラーメッセージ
[CLI] に表示されるエラーメッセージ
エラーメッセージの情報
リクエストはアドミッション検証に失敗しました。
admission webhook "validate.alb.ingress.kubernetes.io"
エラーメッセージは、構成を解析できないためリクエストが拒否されたことを示しています。原因は、リスナー構成の配列要素の末尾に無効な文字(:
)が追加されていることです。
次の表に、AlbConfig と Ingress に関連する検証エラーメッセージを示します。
リソースの種類 | エラーの種類 | エラーメッセージ |
AlbConfig | albconfig unmarsh failed | webhook validate albconfig alb: Unmarshal error : %v Please check the format of albconfig yaml |
無効なリスナー ポート | webhook validate albconfig alb: listener port number mustbetween [1:65535], or you should set listen port explicitly in listener config. Error listen port : 0 | |
無効なリスナー プロトコル | webhook validate albconfig alb: listener protocol is invalid : HTTPP, or you should set listen protocol explicitly in listener config. Please set protocol value HTTP or HTTPS or QUIC | |
Logstore 形式の検証 | webhook validate albconfig alb: logstore name should start with alb_ | |
タグ形式の検証 | webhook validate albconfig alb: empty tag key/value is invalid | |
IP アドレス種類の検証 | the value Interne is invalid. Please set the value as one of: [Internet Intranet] | |
IPv6 アドレス種類の検証 | the value Interne is invalid. Please set the value as one of: [Internet Intranet] | |
IP アドレスモード種類の検証 | the value Dynamicc is invalid. Please set the value as one of: [Dynamic Fixed] | |
インスタンスタイプの検証 | the value Standardd is invalid. Please set the value as one of: [Basic Standard StandardWithWaf] | |
アクセス制御 | webhook validate albconfig alb: aclEntry and aclIds cannot use together in listener | |
Ingress | backend-scheduler | the value of alb.ingress.kubernetes.io/backend-scheduler annotation is invalid : test. the value wlcc is invalid. Please set the value as one of: [wrr wlc sch uch] |
backend-protocol | the value of alb.ingress.kubernetes.io/backend-protocol annotation is invalid : test. the value wlcc is invalid. Please set the value as one of: [HTTP HTTPS gRPC] | |
healthcheck-protocol | the value of alb.ingress.kubernetes.io/healthcheck-protocol annotation is invalid : test. the value wlcc is invalid. Please set the value as one of: [HTTP HTTPS TCP gRPC] | |
healthcheck-method | the value of alb.ingress.kubernetes.io/healthcheck-method annotation is invalid : test. the value wlcc is invalid. Please set the value as one of: [GET HEAD POST] | |
healthcheck-httpcode | the value of alb.ingress.kubernetes.io/healthcheck-httpcode annotation is invalid : test. the value wlcc is invalid. Please set the value as one of: [http_2xx http_3xx http_4xx http_5xx] | |
healthcheck-httpversion | the value of alb.ingress.kubernetes.io/healthcheck-httpversion annotation is invalid : test. the value wlcc is invalid. Please set the value as one of: [HTTP1.1 HTTP1.0] | |
無効な listen-port 形式 | webhook validate ingress ingress: check ingress listen port invalid | |
パスにはキャレット(^)を含めることができません | webhook validate ingress ingress: path is invalid because path contains ^ character | |
カスタム転送アクション unmarsh failed | webhook validate ingress test: the value of actions annotation is invalid |