Google Distributed Cloud Webhook に関する問題のトラブルシューティング

このページでは、Google Distributed Cloud で問題のある Webhook または安全でない Webhook の問題を解決する方法について説明します。

さらにサポートを必要とされる場合は、Cloud カスタマーケアにお問い合わせください。

問題のある Webhook のタイプ

アドミッション Webhook、または Kubernetes の Webhookは、アドミッション コントローラの一種で、Kubernetes クラスタでこれを使用して、リクエストが永続化される前に、コントロール プレーンへのリクエストを検証または変更できます。サードパーティ アプリケーションでは、システムに不可欠なリソースと名前空間で動作する Webhook を使用するのが一般的です。Webhook が正しく構成されていなければ、コントロール プレーンのパフォーマンスと信頼性に影響する可能性があります。たとえば、サードパーティ アプリケーションによって作成された Webhook が正しく構成されていなければ、Google Distributed Cloud でマネージド kube-system Namespaceでのリソースの作成や変更ができなくなり、クラスタの機能が低下する可能性があります。

問題のある Webhook には次のタイプが含まれます。

使用可能なエンドポイントがない Webhook

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

  1. Webhook に関連する Service にサービスを提供する Pod を見つけます。次のコマンドを実行して Service の説明を取得します。

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    次のように置き換えます。

    • SERVICE_NAME は、Service の名前に置き換えます。
    • SERVICE_NAMESPACE は、名前空間の名前に置き換えます。

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

  2. この Service にサービスを提供する Pod を検査します。Deployment を一覧表示して、実行されていない Pod を特定します。

    kubectl get deployment -n SERVICE_NAMESPACE
    

    または、次のコマンドを実行して Pod を一覧表示します。

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    実行されていない Pod については、Pod のログを調べて、Pod が実行されていない理由を確認します。

安全でないとみなされる Webhook

Webhook がシステム管理名前空間内のリソースをインターセプトする場合は、これらのリソースをインターセプトしないように Webhook を更新することをおすすめします。

  1. Webhook の構成を確認します。次の kubectl コマンドを実行して、Webhook の構成を取得します。

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    CONFIGURATION_NAME は Webhook 構成の名前に置き換えます。

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

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

  2. Webhook が安全でないとみなされる理由に応じて、構成を編集します。

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

    scope* の場合、またはスコープが Namespaced で、次のいずれかの条件を満たしている場合、Webhook は安全でないとみなされます。

    • 次の例のように、operator 条件は NotIn であり、valueskube-systemkube-node-lease を省略している場合:

      webhooks:
      - admissionReviewVersions:
        ...
        namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: NotIn
            values:
            - blue-system # add 'kube-system' and 'kube-node-lease' if `NotIn`
        objectSelector: {}
        rules:
        - apiGroups:
          ...
          scope: '*' # 'Namespaced'
        sideEffects: None
        timeoutSeconds: 3
      

      Webhook が特定の名前空間でのみ動作するように、scope* ではなく Namespaced に設定されていることを確認します。operatorNotIn の場合、kube-systemkube-node-leasevalues に含まれていることを確認します。

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

      namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values:
            - blue-system
            - kube-system # remove as operator is `In`
            - kube-node-lease # remove as operator is `In`
      

      Webhook が特定の名前空間でのみ動作するように、scope* ではなく Namespaced に設定されていることを確認します。operatorIn の場合、kube-systemkube-node-leasevalues に含まれていないことを確認します。

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

    次の例のように、nodestokenreviewssubjectaccessreviewscertificatesigningrequests がリソースの下にリストされている場合にも、Webhook は安全でないとみなされます。

    - admissionReviewVersions:
    ...
        resources:
        - 'pods' # keep, remove everything else
        - 'nodes'
        - 'tokenreviews'
        - 'subjectacessreviews'
        - 'certificatesigningrequests'
        scope: '*'
      sideEffects: None
      timeoutSeconds: 3
    

    リソース セクションから nodestokenreviewssubjectaccessreviewscertificatesigningrequests を削除します。

次のステップ

さらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。