2017-06-01 22 views
1

當其他Pod通過服務連接到服務時(使用ClusterIP)重新啓動Pod時,我們遇到了一個較小的問題。當吊艙出現故障時,會出現一些小的時間間隔(約200毫秒),在這種情況下,某些客戶端請求失敗,因爲他們仍嘗試連接到剛剛斷開的吊艙。這會導致一些「連接被拒絕」錯誤。我們可以通過添加睡眠秒鐘的preStop鉤子來避免它。不幸的是,爲每個部署都做這件事很難。Pod重新啓動時的競爭條件

這可能是一個已知的問題?任何想法如何解決這個一般?

對我來說,它看起來像某種競爭條件

我們使用Kubernetes V1.5.3(又名莢消失之前,它的正確從其端點註銷)。

這是解決辦法的樣子(簡化):

apiVersion: apps/v1beta1 
kind: StatefulSet 

spec: 
    template: 
    spec: 
     containers: 
     - name: solr 
     lifecycle: 
      preStop: 
      exec: 
       command: 
       - /bin/sleep 
       - "1" 

example in the docs實際顯示的問題。它開始關閉進程並同時刪除端點。所以它可能已經在端點註冊之前關閉了。

回答

0

我發現了一個post說一個常見的問題,可能是您的情況:

比方說,你Dockerfile用CMD在外殼的形式結束:

CMD MYAPP

shell表單使用/ bin/sh -c myapp運行命令,因此得到SIGTERM的進程 實際上是/ bin/sh,而不是它的子myapp。 根據你正在運行的實際shell,它可能或不可能 傳遞信號給它的孩子。

它可能是你的應用程序被猛烈的殺害導致〜200ms連接失敗。也許嘗試在文章中提出的選項?

+0

在我們的環境中情況並非如此。我們對沒有任何中間殼程序已經非常挑剔。 – svenwltr