Webhook 使用時のコントロール プレーンの安定性を確保する


アドミッション 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_UNSAFEK8S_ADMISSION_WEBHOOK_UNAVAILABLE でフィルタリングする。

分析情報で Webhook を特定したら、検出された Webhook のトラブルシューティングの手順に沿って操作します。

GKE が構成ミスのある Webhook を検出した場合

クラスタが次のいずれかの条件に該当する場合、GKE は分析情報と推奨事項を生成します。

検出された Webhook のトラブルシューティング

以下の各セクションでは、構成ミスの可能性があるとして GKE によって検出された Webhook のトラブルシューティングの手順について説明します。

手順を実施して Webhook が正しく構成されると、推奨事項は 24 時間以内に解決され、コンソールに表示されなくなります。推奨事項のガイダンスを実施してから 24 時間未満の場合は、推奨事項に解決済みのマークを付けることができます。推奨事項を実施しない場合は、拒否することができます。

利用可能なエンドポイントがないと Webhook が報告する

Webhook が使用可能なエンドポイントがないと報告している場合、Webhook エンドポイントの背後にある Service には、実行されていない 1 つ以上の Pod があります。Webhook エンドポイントを利用できるようにするには、この Webhook エンドポイントの背後にある Service の Pod を見つけてトラブルシューティングを行います。

  1. 分析情報と推奨事項を表示し、トラブルシューティングする分析情報を一度に 1 つ選択します。GKE はクラスタごとに 1 つの分析情報を生成します。この分析情報には、調査が必要な損傷したエンドポイントがある Webhook が 1 つ以上表示されます。これらの Webhook のそれぞれについて、Service の名前、損傷したエンドポイント、最後にエンドポイントが呼び出された時刻も表示されます。

  2. Webhook に関連する Service の処理元の Pod を見つけます。

    コンソール

    分析情報のサイドバー パネルから、正しく構成されていない Webhook の表が表示されます。Service の名前をクリックします。

    kubectl

    次のコマンドを実行して Service の説明を取得します。

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    SERVICE_NAMESERVICE_NAMESPACE をそれぞれサービスの名前と名前空間に置き換えます。

    Webhook に Service 名が表示されない場合は、構成にリストされている名前と Service の実際の名前の不一致が原因で、エンドポイントが使用できない可能性があります。エンドポイントの可用性を修正するには、正しい Service オブジェクトと一致するように Webhook 構成の Service 名を更新します。

  3. この 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. 分析情報と推奨事項を表示する手順に沿って、トラブルシューティングする分析情報を 1 つずつ選択します。GKE はクラスタごとに 1 つの分析情報のみを生成します。この分析情報には、1 つ以上の Webhook 構成が一覧表示されます。各構成には 1 つ以上の Webhook が含まれます。表示された Webhook 構成ごとに、構成にフラグが付けられた理由が分析情報に表示されます。
  2. Webhook の構成を確認します。

    コンソール

    分析情報のサイドバー パネルから、表が表示されます。各行には、Webhook 構成の名前と、この構成にフラグが付けられた理由が表示されます。

    各構成を調べるには、名前をクリックして GKE のオブジェクト ブラウザ ダッシュボードでこの構成に移動します。

    kubectl

    次の kubectl コマンドを実行して Webhook 構成を取得します。CONFIGURATION_NAME は、Webhook 構成の名前に置き換えます。

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    このコマンドが何も返さない場合は、validatingwebhookconfigurationsmutatingwebhookconfigurations に置き換えてコマンドを再実行します。

    webhooks セクションに 1 つ以上の Webhook が表示されます。

  3. Webhook にフラグが付けられた理由に応じて、構成を編集します。

    kube-system Namespace と kube-node-lease Namespace を除外する

    scope* の場合、Webhook にフラグが付けられます。または、スコープが Namespaced で、次のいずれかの条件に当てはまる場合、Webhook にフラグが付けられます。

    • 次の例のように、operator 条件は NotIn であり、valueskube-systemkube-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 に設定されていることを確認します。また、operatorNotIn の場合は、kube-systemkube-node-leasevalues に含めます(この例では、blue-system を使用)。

    • 次の例のように、operator 条件は In であり、values には kube-systemkube-node-lease が含まれている場合:

      namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values:
            - blue-system
            - kube-system
            - kube-node-lease
      

      Webhook が特定の名前空間でのみ動作するように、scope* ではなく Namespaced に設定されていることを確認します。operatorIn の場合は、valueskube-systemkube-node-lease を含めないでください。この例では、operatorIn であるため、values には blue-system のみを含める必要があります。

    一致したリソースを除外する

    次の例のように、nodestokenreviewssubjectaccessreviews、または certificatesigningrequests がリソースの下に表示されている場合も、Webhook にフラグが付けられます。

    - admissionReviewVersions:
    ...
      resources:
      - 'pods'
      - 'nodes'
      - 'tokenreviews'
      - 'subjectacessreviews'
      - 'certificatesigningrequests'
      scope: '*'
    sideEffects: None
    timeoutSeconds: 3
    

    リソース セクションから nodestokenreviewssubjectaccessreviewscertificatesigningrequests を削除します。podsresources に保持できます。

次のステップ