我在 Google Kubernetes Engine (GKE) 中设置了一个集群,具有抢占式实例、TPU 支持以及每个节点 1 个容器。
每个容器每天大约两次,我会收到此错误,例如调用tf.io.gfile.glob(...)
:
tensorflow.python.framework.errors_impl.FailedPreconditionError: Error executing an HTTP request: libcurl code 6 meaning 'Couldn't resolve host name', error details: Couldn't resolve host 'www.googleapis.com' when reading gs://bucket/dir/dir
这只发生在 GKE 中,而不是直接在 Google Cloud 中的计算虚拟机上运行时发生。
这是我应该在 GKE 中期待并处理的事情(例如后退并重试),还是存在某种网络配置问题或其他我可以解决的潜在问题?
最佳答案
由于您的集群只有抢占式实例,系统 Pod 也会(至少)每 24 小时重新启动一次,包括 kube-dns
.
您有几个选择:
- 在该 GKE 中创建另一个节点池(当然,该节点池不必包含 TPU 节点,您可以尝试使用
n1-standard-1
,甚至更便宜的实例)集群来托管关键 Pod(例如 kube-dns),并添加nodeSelector
该节点池的字段到关键部署。例如:
nodeSelector:
cloud.google.com/gke-nodepool: critical-node-pool
kube-dns
副本的数量由kube-dns-autoscaler
部署决定。增加 kube-dns pod 的数量可以帮助您提高系统对节点抢占的弹性。您可以通过编辑kube-system
命名空间中的kube-dns-autoscaler
ConfigMap 来增加。
使用 kubectl edit configmap dns-autoscaler --namespace=kube-system 编辑 ConfigMap。查找这一行:linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16}'
。
正如所解释的here ,“min”字段表示 DNS 烘焙端的最小数量。您可以增加副本的最小数量,或调整其他参数以满足您的需求。
如果您使用自动缩放,请勿将kube-dns
副本的最小数量设置为高于该集群中的最小节点数,因为它会使节点保持在由于部署了kube-dns
,与您的应用程序工作负载无关。
关于python - 从 GKE 调用 tf.io.gfile 方法时经常出现 DNS 失败 : "Couldn' t resolve host 'www.googleapis.com' ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65043696/