2016-05-19 42 views
30

我知道有一些關於在配置映射更改時自動重啓窗格的功能的討論,但就我所知,這在Kubernetes 1.2中尚未提供。在Kubernetes中配置更新時重新啓動窗格?

那麼我想要做的是與使用配置圖的pod關聯的deployment資源的「滾動重啓」。是否有可能以及如何在Kubernetes中強制重新啓動部署而不改變實際模板中的任何內容?這是目前最好的方式嗎?還是有更好的選擇?

回答

17

在配置圖更新中爲信息包發送信號是作品中的一項功能(https://github.com/kubernetes/kubernetes/issues/22368)。

您可以隨時編寫自定義pid1,通知配置圖已更改並重新啓動您的應用程序。

您還可以:例如:在2個容器中掛載相同的配置映射,如果配置映射內容的散列值發生變化,則在第二個容器中公開http健康檢查,並將其作爲第一個容器的活性探測器因爲一個容器中的容器共享相同的網絡名稱空間)。當探針失敗時,kubelet會爲您重新啓動您的第一個容器。

當然,如果您不關心Pod上的哪些節點,您可以簡單地刪除它們,複製控制器將爲您「重啓」它們。

+0

「刪除豆莢」的意思是:收集所有豆莢名稱,刪除一個,等到更換,刪除第二個,等到更換等。正確嗎? –

+0

使用部署我會縮小比例然後提高。儘管如此,你仍然會有這麼小的停機時間。你可以在一行中做到這一點,以減少......'kubectl scale deployment/update-demo --replicas = 0; kubectl scale deployment/update-demo --replicas = 4;' –

+0

如果你不想找到所有的豆莢,並且不關心停機時間 - 只需刪除RC然後重新創建RC。 – Drew

41

目前針對此問題的最佳解決方案(在兄弟答案中鏈接的https://github.com/kubernetes/kubernetes/issues/22368中引用很深)是使用部署,並將您的ConfigMaps視爲不可變的。

當您想更改您的配置時,請創建一個新的ConfigMap,並將您的部署指向新的ConfigMap。如果新配置中斷,則部署將拒絕縮減您的工作副本集。如果新配置有效,那麼您的舊ReplicaSet將被縮放爲0個副本並被刪除,並且新Pod將以新配置啓動。

不像編輯ConfigMap那麼快,但更安全。

+1

這也是我們採取的方法 – Johan

3

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

很多時候configmaps或祕密被注入在容器中的配置文件。根據應用程序的不同,可能需要重新啓動才能使用後續的helm upgrade進行更新,但如果部署規範本身沒有更改,則應用程序會繼續與舊配置一起運行,從而導致部署不一致。

kind: Deployment 
spec: 
    template: 
    metadata: 
     annotations: 
     checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }} 
[...] 

在我的情況,因爲某些原因,$.Template.BasePath沒有工作,但$.Chart.Name

sha256sum功能可與include功能一起使用,以確保部署的模板部分,如果另一個規範的變化進行更新作用:

spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: admin-app 
     annotations: 
     checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }} 
0

另一種方式是把它粘到部署的命令部分:

... 
command: [ "echo", " 
    option = value\n 
    other_option = value\n 
" ] 
... 

另外,使其更ConfigMap類,使用一個額外的部署,這將只是主機在command節的配置,並在其上執行kubectl create同時加入一個獨特的「版本」,以它的名字(如計算的哈希內容),並修改所有使用該配置的部署:

... 
command: [ "/usr/sbin/kubectl-apply-config.sh", " 
    option = value\n 
    other_option = value\n 
" ] 
... 

我可能會發布kubectl-apply-config.sh如果它結束了工作。

相關問題