アドミッション Webhook(Kubernetes の Webhook)はアドミッション コントローラの一種で、Kubernetes クラスタでこれを使用して、リクエストが永続化される前に、コントロール プレーンへのリクエストを検証または変更できます。サードパーティ アプリケーションでは、システムに不可欠なリソースと名前空間で動作する Webhook を使用するのが一般的です。Webhook が正しく構成されていなければ、コントロール プレーンのパフォーマンスと信頼性に影響する可能性があります。たとえば、サードパーティ アプリケーションによって作成された Webhook が正しく構成されていなければ、GKE でマネージド kube-system
Namespace でのリソースの作成や変更ができなくなり、クラスタの機能が低下する可能性があります。
Google Kubernetes Engine(GKE)はクラスタをモニタリングし、Recommender サービスを利用して、プラットフォームの使用を最適化できるようにガイダンスを提供します。クラスタの安定性とパフォーマンスを維持するために、次のシナリオに関する GKE の推奨事項をご覧ください。
- 動作しているが利用可能なエンドポイントがない Webhook。
- システムの重要なリソースと Namespace で動作するため、安全でないとみなされている Webhook。
このガイダンスを使用すると、構成ミスの可能性がある Webhook を確認し、必要に応じて更新する手順を確認できます。
Recommender から取得した分析情報と推奨事項を管理する方法については、分析情報と推奨事項で GKE の使用を最適化するをご覧ください。
クラスタに影響を与える可能性のある Webhook の構成ミスを特定する
クラスタのパフォーマンスと安定性に影響する可能性がある Webhook を識別する分析情報を取得するには、分析情報と推奨事項を表示するの手順に沿って操作します。分析情報は次の方法で取得できます。
- Google Cloud コンソールを使用する。
- Google Cloud CLI または Recommender API を使用して、サブタイプ
K8S_ADMISSION_WEBHOOK_UNSAFE
とK8S_ADMISSION_WEBHOOK_UNAVAILABLE
でフィルタリングする。
分析情報で Webhook を特定したら、検出された Webhook のトラブルシューティングの手順に沿って操作します。
GKE が構成ミスのある Webhook を検出した場合
クラスタが次のいずれかの条件に該当する場合、GKE は分析情報と推奨事項を生成します。
K8S_ADMISSION_WEBHOOK_UNAVAILABLE
: GKE クラスタに利用可能なエンドポイントがないことを報告する Webhook が 1 つ以上あります。手順に沿って、利用可能なエンドポイントがないことを報告している Webhook を確認します。K8S_ADMISSION_WEBHOOK_UNSAFE
: GKE クラスタにインターセプトするリソースに基づいて安全でないと判断された Webhook が 1 つ以上あります。手順に沿って、安全でないと判断された Webhook を確認します。次の Webhook は安全でないとみなされます。kube-system
Namespace の Pod やリースなどのリソースをインターセプトする Webhook。kube-node-lease
Namespace のリースをインターセプトする Webhook。Nodes
、TokenReviews
、SubjectAccessReviews
、CertificateSigningRequests
など、クラスタ スコープのシステム リソースをインターセプトする Webhook。
検出された Webhook のトラブルシューティング
以下の各セクションでは、構成ミスの可能性があるとして GKE によって検出された Webhook のトラブルシューティングの手順について説明します。
手順を実施して Webhook が正しく構成されると、推奨事項は 24 時間以内に解決され、コンソールに表示されなくなります。推奨事項のガイダンスを実施してから 24 時間未満の場合は、推奨事項に解決済みのマークを付けることができます。推奨事項を実施しない場合は、拒否することができます。
利用可能なエンドポイントがないと Webhook が報告する
Webhook が使用可能なエンドポイントがないと報告している場合、Webhook エンドポイントの背後にある Service には、実行されていない 1 つ以上の Pod があります。Webhook エンドポイントを利用できるようにするには、この Webhook エンドポイントの背後にある Service の Pod を見つけてトラブルシューティングを行います。
分析情報と推奨事項を表示し、トラブルシューティングする分析情報を一度に 1 つ選択します。GKE はクラスタごとに 1 つの分析情報を生成します。この分析情報には、調査が必要な損傷したエンドポイントがある Webhook が 1 つ以上表示されます。これらの Webhook のそれぞれについて、Service の名前、損傷したエンドポイント、最後にエンドポイントが呼び出された時刻も表示されます。
Webhook に関連する Service の処理元の Pod を見つけます。
コンソール
分析情報のサイドバー パネルから、正しく構成されていない Webhook の表が表示されます。Service の名前をクリックします。
kubectl
次のコマンドを実行して Service の説明を取得します。
kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
SERVICE_NAME と SERVICE_NAMESPACE をそれぞれサービスの名前と名前空間に置き換えます。
Webhook に Service 名が表示されない場合は、構成にリストされている名前と Service の実際の名前の不一致が原因で、エンドポイントが使用できない可能性があります。エンドポイントの可用性を修正するには、正しい Service オブジェクトと一致するように Webhook 構成の Service 名を更新します。
この Service の処理元の Pod を検査します。
コンソール
[Service の詳細] の [処理元の Pod] で、この Service の背後にある Pod のリストを確認します。
kubectl
Deployment または Pod を一覧表示して、実行されていない Pod を特定します。
kubectl get deployment -n SERVICE_NAMESPACE
または、次のコマンドを実行します。
kubectl get pods -n SERVICE_NAMESPACE -o wide
実行されていない Pod がある場合は、Pod のログを調べて、Pod が実行されていない理由を確認します。Pod に関する一般的な問題に対する手順については、デプロイされたワークロードに関する問題のトラブルシューティングをご覧ください。
安全でないとみなされる Webhook
Webhook がシステム管理の名前空間内のリソース、または特定のタイプのリソースをインターセプトしている場合、GKE はこれを安全でないものとみなし、これらのリソースのインターセプトを避けるために Webhook を更新することをおすすめします。
- 分析情報と推奨事項を表示する手順に沿って、トラブルシューティングする分析情報を 1 つずつ選択します。GKE はクラスタごとに 1 つの分析情報のみを生成します。この分析情報には、1 つ以上の Webhook 構成が一覧表示されます。各構成には 1 つ以上の Webhook が含まれます。表示された Webhook 構成ごとに、構成にフラグが付けられた理由が分析情報に表示されます。
Webhook の構成を確認します。
コンソール
分析情報のサイドバー パネルから、表が表示されます。各行には、Webhook 構成の名前と、この構成にフラグが付けられた理由が表示されます。
各構成を調べるには、名前をクリックして GKE のオブジェクト ブラウザ ダッシュボードでこの構成に移動します。
kubectl
次の
kubectl
コマンドを実行して Webhook 構成を取得します。CONFIGURATION_NAME は、Webhook 構成の名前に置き換えます。kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
このコマンドが何も返さない場合は、
validatingwebhookconfigurations
をmutatingwebhookconfigurations
に置き換えてコマンドを再実行します。webhooks
セクションに 1 つ以上の Webhook が表示されます。Webhook にフラグが付けられた理由に応じて、構成を編集します。
kube-system Namespace と kube-node-lease Namespace を除外する
scope
が*
の場合、Webhook にフラグが付けられます。または、スコープがNamespaced
で、次のいずれかの条件に当てはまる場合、Webhook にフラグが付けられます。次の例のように、
operator
条件はNotIn
であり、values
はkube-system
とkube-node-lease
を省略している場合:webhooks: - admissionReviewVersions: ... namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: NotIn values: - blue-system objectSelector: {} rules: - apiGroups: ... scope: '*' sideEffects: None timeoutSeconds: 3
Webhook が特定の名前空間でのみ動作するように、
scope
が*
ではなくNamespaced
に設定されていることを確認します。また、operator
がNotIn
の場合は、kube-system
とkube-node-lease
をvalues
に含めます(この例では、blue-system
を使用)。次の例のように、
operator
条件はIn
であり、values
にはkube-system
とkube-node-lease
が含まれている場合:namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: In values: - blue-system - kube-system - kube-node-lease
Webhook が特定の名前空間でのみ動作するように、
scope
が*
ではなくNamespaced
に設定されていることを確認します。operator
がIn
の場合は、values
にkube-system
とkube-node-lease
を含めないでください。この例では、operator
がIn
であるため、values
にはblue-system
のみを含める必要があります。
一致したリソースを除外する
次の例のように、
nodes
、tokenreviews
、subjectaccessreviews
、またはcertificatesigningrequests
がリソースの下に表示されている場合も、Webhook にフラグが付けられます。- admissionReviewVersions: ... resources: - 'pods' - 'nodes' - 'tokenreviews' - 'subjectacessreviews' - 'certificatesigningrequests' scope: '*' sideEffects: None timeoutSeconds: 3
リソース セクションから
nodes
、tokenreviews
、subjectaccessreviews
、certificatesigningrequests
を削除します。pods
はresources
に保持できます。