Google Container Engine 中的間歇性 DNS 故障
$$ Question rewritten with details of findings. $$ 我正在執行一個 Google Container Engine 集群,其中包含大約 100 個容器,每天執行大約 100,000 個 API 呼叫。一些 pod 在 DNS 解析中開始出現 50% 的故障。我對此進行了深入研究,它僅發生在正在執行的節點上的 pod 上
kube-dns
。我還注意到,這只發生在系統中的節點因記憶體不足而關閉之前。後台 resque 作業附加到 Google API,然後將數據上傳到 S3。當我看到失敗的作業時,它們會以“名稱解析暫時失敗”而失敗。“accounts.google.com”和“s3.amazonaws.com”會發生這種情況。
當我登錄伺服器並嘗試使用 , 連接到這些(或其他主機)時,
host
它似乎工作得很好。當我連接到 rails 控制台並執行在隊列中失敗的相同程式碼時,我不會發生失敗。然而,正如我所說,這些後台故障似乎是間歇性的(大約 50% 的時間是在節點 running 上執行的工作人員)。nslookup``dig``kube-dns
到目前為止,我的臨時修復是刪除失敗的 Pod,讓 kubernetes 重新調度它們,並繼續這樣做,直到 kubernetes 將它們調度到一個未執行的節點
kube-dns
。順便說一句,刪除故障節點並不能解決此問題。它只是導致 kubernetes 將所有內容移動到其他節點並移動了問題。
我通過升級到 Kubernetes 1.4 解決了這個問題。
1.4 版本包括幾個修復,以防止 kubernetes 在記憶體不足的情況下崩潰。我認為這有助於降低遇到此問題的可能性,儘管我不相信核心問題已解決(除非問題是
kube-dns
由於節點命中時 kubernetes 系統不穩定導致其中一個實例崩潰或無響應哎呀)。
對我來說,問題確實是 kube-dns 被調度到記憶體壓力高的節點,不斷導致它當機。我所做的是創建一個 kube-system 服務專有的節點池。我通過 kubectl 編輯了部署並為它們設置了一個節點選擇器,因此它們將始終被安排到一個獨占的節點池中,並且不會與我的服務競爭資源。