Kubernetesでconfigmapが更新されたときにポッドを再起動しますか?


120

構成マップが変更/更新されたときに、Kubernetesポッドとデプロイメントに関連付けられたポッドを自動的に再起動するにはどうすればよいですか?


構成マップが変更されたときにポッドを自動的に再起動する機能について話がありましたが、私の知る限り、これはKubernetes 1.2ではまだ利用できません。

つまり、私がやりたいことは、構成マップを使用するポッドに関連付けられたデプロイメントリソースの「ローリングリスタート」です。実際のテンプレートで何も変更せずに、Kubernetesでデプロイメントのローリング再起動を強制することは可能ですか?これは現在それを行うための最良の方法ですか、それともより良いオプションがありますか?


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...私のために仕事をしてください
maciek

回答:


60

構成マップの更新時にポッドに信号を送ることは、機能(https://github.com/kubernetes/kubernetes/issues/22368)の機能です。

いつでも、confimapが変更されたことを通知してアプリを再起動するカスタムpid1を作成できます。

たとえば、同じ構成マップを2つのコンテナーにマウントし、構成マップの内容のハッシュが変更された場合に失敗する2番目のコンテナーでhttpヘルスチェックを公開し、それを最初のコンテナーの活性プローブとして押し出します(ポッドは同じネットワーク名前空間を共有します)。プローブが失敗すると、kubeletは最初のコンテナを再起動します。

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


「ポッドの削除」とは、すべてのポッド名を収集し、1つを削除して、交換されるまで待機し、2番目のポッドを削除し、交換されるまで待機するなどです。
Torsten Bronger、2016年

6
展開を使用して、それを縮小してから拡大します。ただし、それでもダウンタイムはわずかです。あなたはそれを減らすために一行でそれをすることができます... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Nick H

すべてのポッドを検索する必要がなく、ダウンタイムを気にしない場合は、RCを削除してから、RCを再作成します。
2016年

1
これは、マウントされているボリュームが更新され、ポッド全体を再起動せずにポッド上のファイルを再度読み取る必要があることを意味しますか?
マットウィリアムソン

@NickH迅速かつ汚い、幸いなことに、私の場合、ダウンタイムは許容範囲内でした。
ChocolateAndCheese

129

この問題に対する現在の最善の解決策(兄弟の回答でリンクされているhttps://github.com/kubernetes/kubernetes/issues/22368で詳細に参照されています)は、Deploymentsを使用して、ConfigMapが不変であると見なすことです。

構成を変更する場合は、必要な変更を加えた新しいConfigMapを作成し、デプロイメントを新しいConfigMapに向けます。新しい構成が壊れている場合、Deploymentは作業中のReplicaSetのスケールダウンを拒否します。新しい構成が機能する場合、古いレプリカセットは0レプリカにスケーリングされて削除され、新しいポッドが新しい構成で開始されます。

ConfigMapを適切に編集するほど速くはありませんが、はるかに安全です。


2
これも私たちが採用したアプローチです
Johan

4
新しい実験ツールのことを言及する価値kustomize:あなたが手動で新しいconfigmap作成する必要はありません。つまり、支持体には、自動的に決定論configmapハッシュを作成github.com/kubernetes-sigs/kustomize/blob/...を
対称

これは、Spinnakerが裏で行うことなので、使用する場合、これについて心配する必要はありません。
ガス

32

私がそれをするために見つけた最良の方法は、リローダーを実行することです

監視する構成マップまたはシークレットを定義して、それらが更新されると、デプロイメントのローリング更新が実行されます。次に例を示します。

デプロイfooとと呼ばれるConfigMapがありfoo-configmapます。configmapが変更されるたびにデプロイメントのポッドをロールしたいとします。あなたはリローダーを実行する必要があります:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

次に、デプロイメントでこの注釈を指定します。

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...

Reloaderはkubernetes> = 1.9と互換性があります
jacktrade

31

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 }}

8
ヘルムにのみ適用される一般Kubernetesの使用には適用されません
EMII Khaos

2
回答は役に立ちますが、おそらくこの質問には関係ありません
Anand Singh Kunwar

helm3は最近リリースされました。したがって、リンクは古くなっています。masterブランチを指します。以下のURLは、(現在は)最新につながるhelm:2つのドキュメントgithub.com/helm/helm/blob/release-2.16/docs/...
マルセル・ホイヤー

クールなソリューション。私の場合、sha256sumに65文字が含まれていたため、sha1sumに変更しましたDeployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters。代替はですが| trunc 63、sha1sumは「よりユニーク」である必要があります。
イプタイザー

11

デプロイメントに関連しないメタデータラベルを更新できます。ローリング更新をトリガーします

例えば:

metadata:
  labels:
    configmap-version: 1

メタデータに関するドキュメントを探しています:ラベル:configmap-version:1
c4f4t0r

7
メタデータラベルの変更はポッドの再起動をトリガーしません
ダンカーター

この回答には賛成意見があるため、質問する必要があります。メタデータを更新すると、Kubernetesクラスターはローリング更新をトリガーしますか?@ maoz-zadok
titus

1
メタデータラベルが下にある限り、これは機能すると思いますtemplate.spec
Saikiran Yerram

1

Deploymentがサブチャートにあり、それを制御する値が親チャートの値ファイルにあるというこの問題がありました。これは、再起動をトリガーするために使用したものです。

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

これは明らかに、再起動をトリガする任意の値の変化が、それは我々の状況のために働きます。元々子チャートにあったものは、子チャート自体のconfig.yamlが変更された場合にのみ機能します。

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}

0

私は量子の解決を行い、それは完全に機能します。しかし、ポッドが実際に再起動していないということを理解していません...ポッドはまだ同じですが、変更があります!

例:ポッドは50分から実行されており、何かを変更してオンラインで変更すると、ブラウザで確認できますが、ポッドはまだ+50分実行されています。Helm3を使用しています... configmapの更新を再開せずにこれが可能になる理由を知っていますか?


1
OK!私はそれを見つけました...ボリュームとしてconfigmapをマウントして動的に更新したので...これが「チェックサム」を実行すると、ポッドが再起動しませんが、変更はそこにあります!私は良い解決策:)
イブラヒムイェシレイ

-1

別の方法は、それをデプロイメントのコマンドセクションに挿入することです。

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

または、それをConfigMapのようにするには、commandセクションでその構成をホストkubectl createし、その名前に一意の「バージョン」を追加し(コンテンツのハッシュの計算など)、すべての変更を加えながら実行する追加のDeploymentを使用します。その構成を使用するデプロイメント:

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

kubectl-apply-config.shうまくいったら投稿します。

(それをしないでください、それはあまりにも悪く見えます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.