web-dev-qa-db-ja.com

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

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

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

73
Johan

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

Confimapが変更され、アプリを再起動したことに気づくカスタムpid1をいつでも作成できます。

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

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

35
Prashanth B

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

構成を変更する場合は、変更したい新しいConfigMapを作成し、新しいConfigMapで展開をポイントします。新しい構成が壊れている場合、展開は作業中のReplicaSetの縮小を拒否します。新しい構成が機能する場合、古いReplicaSetは0レプリカにスケーリングされて削除され、新しいポッドは新しい構成で開始されます。

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

94
Symmetric

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

多くの場合、コンテナ内の構成ファイルとしてconfigmapまたはシークレットが挿入されます。アプリケーションに応じて、後続の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 }}
14
quanta

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

https://github.com/stakater/Reloader

Configmapまたはシークレットを定義して、それらが更新されると、展開のローリング更新が実行されるのを監視できます。以下に例を示します。

展開foofoo-configmapという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
...
9
George Miller

展開に関係のないメタデータラベルを更新できます。ローリング更新をトリガーします

例えば:

metadata:
  labels:
    configmap-version: 1
5
Maoz Zadok