排查 Kubernetes API 服务器问题

本页面介绍如何解决 Google Distributed Cloud Virtual for Bare Metal 的 Kubernetes API 服务器 (kube-apiserver) 的问题。

如果您需要其他帮助,请与 Cloud Customer Care 联系。

Webhook 超时和失败的 webhook 调用

这些错误可能通过几种不同的方式出现。如果您遇到以下任何症状,则可能是 webhook 调用失败:

  • 连接遭拒:如果 kube-apiserver 报告调用 webhook 的超时错误,则日志中会报告以下错误:

    failed calling webhook "server.system.private.gdc.goog":
    failed to call webhook: Post "https://root-admin-webhook.gpc-system.svc:443/mutate-system-private-gdc-goog-v1alpha1-server?timeout=10s":
    dial tcp 10.202.1.18:443: connect: connection refused
    
  • 已超出上下文截止期限:您可能还会在日志中看到以下错误:

    failed calling webhook "namespaces.hnc.x-k8s.io": failed to call webhook: Post
    "https://hnc-webhook-service.hnc-system.svc:443/validate-v1-namespace?timeout=10s\":
    context deadline exceeded"
    

如果您认为遇到 webhook 超时或失败的 webhook 调用,请使用以下任一方法确认问题:

  • 检查 API 服务器日志,看看是否存在网络问题。

    • 检查日志是否存在与网络相关的错误,例如 TLS handshake error
    • 检查 IP/端口是否与 API 服务器配置为响应的内容匹配。
  • 按照以下步骤监控 webhook 延迟时间:

    1. 在控制台中,转到 Cloud Monitoring 页面。

      转到 Cloud Monitoring 页面

    2. 选择 Metrics Explorer

    3. 选择 apiserver_admission_webhook_admission_duration_seconds 指标。

如需解决此问题,请查看以下建议:

  • Webhook 可能需要额外的防火墙规则。如需了解详情,请参阅如何针对特定应用场景添加防火墙规则

  • 如果 webhook 需要更多时间才能完成,您可以配置自定义超时值。由于 webhook 延迟时间会增加 API 请求延迟时间,因此应尽快进行评估。

  • 如果 webhook 错误阻止集群可用性,或者 webhook 可以无害地移除和缓解这种情况,请检查是否可以将 failurePolicy 暂时设置为 Ignore 或移除违规 webhook。

API 服务器拨号失败或延迟

此错误可能通过几种不同的方式出现:

  • 外部域名解析错误:外部客户端可能会返回消息中包含 lookup 的错误,例如:

    dial tcp: lookup kubernetes.example.com on 127.0.0.1:53: no such host
    

    此错误不适用于集群中运行的客户端。系统会注入 Kubernetes Service IP,因此无需解析。

  • 网络连接错误:客户端可能会在尝试 API 服务器拨号时输出一般网络连接错误,如以下示例所示:

    dial tcp 10.96.0.1:443: connect: no route to host
    dial tcp 10.96.0.1:443: connect: connection refused
    dial tcp 10.96.0.1:443: connect: i/o timeout
    
  • 连接到 API 服务器的延迟时间较长:与 API 服务器的连接可能成功,但请求在客户端超时。在这种情况下,客户端通常会输出包含 context deadline exceeded 的错误消息。

如果与 API 服务器的连接完全失败,请尝试在客户端报告错误的同一环境中进行连接。Kubernetes 临时容器可用于将调试容器注入现有命名空间,如下所示:

  1. 从有问题的客户端运行的位置,使用 kubectl 执行具有高详细程度的请求。例如,对 /healthzGET 请求通常不需要身份验证:

    kubectl get -v999 --raw /healthz
    
  2. 如果请求失败或 kubectl 不可用,您可以从输出中获取网址,然后使用 curl 手动执行请求。例如,如果从先前输出获得的服务主机是 https://192.0.2.1:36917/,您可以发送类似的请求,如下所示:

    # Replace "--ca-cert /path/to/ca.pem" to "--insecure" if you are accessing
    # a local cluster and you trust the connection cannot be tampered.
    # The output is always "ok" and thus contains no sensentive information.
    
    curl -v --cacert /path/to/ca.pem https://192.0.2.1:36917/healthz
    

    此命令的输出通常表示连接失败的根本原因。

    如果连接成功但速度缓慢或超时,则表示 API 服务器过载。如需确认这一点,请在控制台中查看 API Server Request Rate 并请求 Cloud Kubernetes > Anthos > Cluster > K8s Control Plane 中的延迟时间指标。

如需解决这些连接失败或延迟时间问题,请查看以下补救选项:

  • 如果集群发生网络连接错误,则容器网络接口 (CNI) 插件可能存在问题。此问题通常是暂时性的,在 Pod 重新创建或重新安排后会自行解决。

  • 如果网络连接错误来自集群外部,请检查客户端是否已正确配置为访问集群,或再次生成客户端配置。如果连接通过代理或网关,请检查通过同一机制的另一个连接是否可行。

  • 如果 API 服务器过载,则通常意味着许多客户端同时访问 API 服务器。由于节流以及优先级和公平性功能,单个客户端不能使 API 服务器过载。查看工作负载的以下方面:

    • 适用于 Pod 级层。与更高级别的资源相比,错误创建和忘记 Pod 的情况更常见。
    • 通过错误的计算调整副本的数量。
    • Webhook 将请求回送至自身或通过创建超出其处理数量的请求来放大负载。

后续步骤

如果您需要其他帮助,请与 Cloud Customer Care 联系。