2016-05-19 13 views
30

設定が変更されたときに自動的にポッドを再起動する機能について話がありましたが、これはKubernetes 1.2ではまだ利用できません。Kubernetesでconfigmapを更新するときにポッドを再起動しますか?

私がしたいと思うのは、コンフィグマップを消費するポッドに関連付けられたdeploymentリソースの「ローリング再開」です。実際のテンプレートで何も変更せずにKubernetesで展開を強制的に再起動することは可能でしょうか?これは現在、これを行う最善の方法ですか、より良い選択肢がありますか?

答えて

17

設定マップの更新時にポッドに信号を送ることは、作品の特長です(https://github.com/kubernetes/kubernetes/issues/22368)。

いつでもconfimapが変更されたことに気付くカスタムpid1を書き込んで、あなたのアプリを再起動することができます。

次のことが可能にも例えば:、2つの容器で同じ設定マップをマウントコンフィグマップの内容変更のハッシュ場合は失敗第二の容器にHTTPヘルスチェックを露出させ、そして第一容器(の生存性プローブとしてそれを突き出しますポッド内のコンテナは同じネットワーク名前空間を共有するため)。プローブが失敗すると、kubeletが最初のコンテナを再起動します。

もちろん、ポッドがどのノードにあるか気にしない場合、それらを削除するだけでレプリケーションコントローラがそれらを「再起動」します。

+0

「ポッドを削除する」とは、すべてのポッド名を収集し、1つを削除し、置換するまで待ってから2番目のものを削除し、置き換えられるまで待つなどです。 –

+0

デプロイメントを使用して、それをスケールダウンしてからアップします。あなたはまだダウンタイムの小さな量を持っています。あなたはそれを減らすために1行で行うことができます... 'kubectl scale deployment/update-demo --replicas = 0; –

+0

ポッドをすべて見つけずにダウンタイムを気にしない場合は、RCを削除してからRCを再作成してください。 – Drew

41

この問題(現在の兄弟回答ではhttps://github.com/kubernetes/kubernetes/issues/22368の深い参照)の現在の最適な解決策は、Deploymentsを使用し、ConfigMapsを変更不能にすることです。

設定を変更する場合は、変更を加えて新しいConfigMapを作成し、新しいConfigMapで配置を指示します。新しい設定が壊れている場合、Deploymentは動作中のレプリカセットの縮小を拒否します。新しい設定が機能する場合、古いReplicaSetは0個の複製にスケールされて削除され、新しい設定で新しいポッドが開始されます。

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で更新する必要がある場合は再起動が必要な場合がありますが、デプロイメント仕様自体が変更されない場合、アプリケーションは古い設定で動作し続け、デプロイメントが一貫しません。

sha256sum機能は、別の仕様が変更された場合の展開テンプレートセクションが更新されていることを確認するためにinclude機能と一緒に使用することができます。私の場合は

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

は、いくつかの理由のため、$.Template.BasePathは動作しませんでしたが、$.Chart.Nameい:

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を投稿します。

関連する問題