このページでは、Google Distributed Cloud で問題のある Webhook または安全でない Webhook の問題を解決する方法について説明します。
さらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。問題のある Webhook のタイプ
アドミッション Webhook(Kubernetes の Webhook)はアドミッション コントローラの一種で、Kubernetes クラスタでこれを使用して、リクエストが永続化される前に、コントロール プレーンへのリクエストを検証または変更できます。サードパーティ アプリケーションでは、システムに不可欠なリソースと名前空間で動作する Webhook を使用するのが一般的です。Webhook が正しく構成されていなければ、コントロール プレーンのパフォーマンスと信頼性に影響する可能性があります。たとえば、サードパーティ アプリケーションによって作成された Webhook が正しく構成されていなければ、Google Distributed Cloud でマネージド kube-system
Namespace でのリソースの作成や変更ができなくなり、クラスタの機能が低下する可能性があります。
問題のある Webhook には次のタイプが含まれます。
- 動作しているが利用可能なエンドポイントがない Webhook。手順に沿って、利用可能なエンドポイントがない Webhook を確認します。
システムの重要なリソースと Namespace で動作するため、安全でないとみなされている Webhook。
次の Webhook は安全でないとみなされます。
kube-system
Namespace で Pod とリースをインターセプトする Webhook。kube-node-lease
Namespace でリースをインターセプトする Webhook。Nodes
、TokenReviews
、SubjectAccessReviews
、CertificateSigningRequests
リソースをインターセプトする Webhook。
手順に沿って、安全でないと判断された Webhook を確認します。
使用可能なエンドポイントがない Webhook
Webhook に使用可能なエンドポイントがない場合、Webhook エンドポイントの背後にある Service に、実行されていない Pod が 1 つ以上あります。Webhook エンドポイントを利用できるようにするには、この Webhook エンドポイントの背後にある Service の Pod を見つけてトラブルシューティングを行います。
Webhook に関連する Service の処理元の Pod を見つけます。次のコマンドを実行して Service の説明を取得します。
kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
次のように置き換えます。
- SERVICE_NAME は、Service の名前に置き換えます。
- SERVICE_NAMESPACE は、Namespace の名前に置き換えます。
Webhook に Service 名が表示されない場合は、構成にリストされている名前と Service の実際の名前の不一致が原因で、エンドポイントが使用できない可能性があります。エンドポイントの可用性を修正するには、正しい Service オブジェクトと一致するように Webhook 構成の Service 名を更新します。
この Service の処理元の Pod を検査します。Deployment を一覧表示して、実行されていない Pod を特定します。
kubectl get deployment -n SERVICE_NAMESPACE
または、次のコマンドを実行して Pod の一覧を取得します。
kubectl get pods -n SERVICE_NAMESPACE -o wide
実行されていない Pod がある場合は、Pod のログを調べて、Pod が実行されていない理由を確認します。
安全でないとみなされる Webhook
Webhook がシステム管理の Namespace 内のリソースをインターセプトしている場合は、これらのリソースのインターセプトを避けるために Webhook を更新することをおすすめします。
Webhook の構成を確認します。次の
kubectl
コマンドを実行して Webhook 構成を取得します。kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
CONFIGURATION_NAME は、Webhook 構成の名前に置き換えます。
このコマンドが何も返さない場合は、
validatingwebhookconfigurations
をmutatingwebhookconfigurations
に置き換えてコマンドを再実行します。出力の
webhooks
セクションに、1 つ以上の Webhook が表示されます。Webhook が安全でないと判断された理由に応じて、構成を編集します。
kube-system Namespace と kube-node-lease Namespace を除外する
scope
が*
の場合、またはスコープがNamespaced
で、次のいずれかの条件を満たしている場合、Webhook は安全でないとみなされます。次の例のように、
operator
条件はNotIn
であり、values
はkube-system
とkube-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
に設定されていることを確認します。operator
がNotIn
の場合、kube-system
とkube-node-lease
がvalues
に含まれていることを確認します。次の例のように、
operator
条件はIn
であり、values
にはkube-system
とkube-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
に設定されていることを確認します。operator
がIn
の場合、kube-system
とkube-node-lease
がvalues
に含まれていないことを確認します。
一致したリソースを除外する
次の例のように、
nodes
、tokenreviews
、subjectaccessreviews
、certificatesigningrequests
がリソースの下にリストされている場合にも、Webhook は安全でないとみなされます。- admissionReviewVersions: ... resources: - 'pods' # keep, remove everything else - 'nodes' - 'tokenreviews' - 'subjectacessreviews' - 'certificatesigningrequests' scope: '*' sideEffects: None timeoutSeconds: 3
リソース セクションから
nodes
、tokenreviews
、subjectaccessreviews
、certificatesigningrequests
を削除します。