本页面介绍了如何解决 Google Distributed Cloud 的 Kubernetes API 服务器 (kube-apiserver
) 的问题。
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 延迟时间:
在控制台中,转到 Cloud Monitoring 页面。
选择 Metrics Explorer。
选择
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 临时容器可用于将调试容器注入现有命名空间,如下所示:
从有问题的客户端运行的位置,使用
kubectl
执行具有高详细程度的请求。例如,对/healthz
的GET
请求通常不需要身份验证:kubectl get -v999 --raw /healthz
如果请求失败或
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 将请求回送至自身或通过创建超出其处理数量的请求来放大负载。