現在、kubernetesシークレットファイルを更新する場合、変更を適用するには、kubectl apply -f my-secrets.yaml
。実行中のコンテナがあった場合、古いシークレットを使用しています。実行中のコンテナに新しいシークレットを適用するために、現在コマンドkubectl replace -f my-pod.yaml
。これが実行中のコンテナシークレットを更新するための最良の方法であるか、または何かが足りないのではないかと思っていました。
ありがとう。
ユーザーの秘密文書 はこう言っています:
マウントされたシークレットは自動的に更新されますボリュームですでに消費されているシークレットが更新されると、最終的に予測されるキーも更新されます。更新時間は、kubeletの同期期間によって異なります。
マウントされたシークレットが更新されます。問題はいつですか。シークレットのコンテンツが更新されても、アプリケーションがそれを自動的に消費するわけではありません。このシナリオでファイルの変更を監視し、それに応じて動作するのは、アプリケーションの仕事です。これを念頭に置いて、現在はもう少し作業が必要です。私が今考えている1つの方法は、 Kubernetesでスケジュールされたジョブを実行することです Kubernetes APIと通信して、 展開 。そうすれば、理論的には秘密を更新したいものを達成できます。それはどういうわけかエレガントではありませんが、これが現時点で私が念頭に置いている唯一の方法です。 Kubernetesの概念については、自分自身でさらに確認する必要があります。だから私と一緒に耐えてください。
ポッドmypodを実行していると仮定する[ポッド仕様でmysecretとしてシークレットをマウント]
既存のシークレットを削除できます
kubectl delete secret mysecret
更新されたファイルで同じシークレットを再作成します
kubectl create secret mysecret <updated file/s>
それから
kubectl apply -f ./mypod.yaml
mypod内の秘密を確認すると、更新されます。
K8sのバージョン> v1.15の場合:kubectl rollout restart deployment $deploymentname
:これにより、ダウンタイムを発生させることなくポッドが段階的に再起動されます。
誰か(私のような)が、これらの秘密を使用しているローリングアップデートポッドを強制する場合。これから issue 、トリックはコンテナー内のEnv変数を更新することです、そしてk8sは自動的にポッド全体をローリング更新します
kubectl patch deployment mydeployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"mycontainer","env":[{"name":"RESTART_","value":"'$(date +%s)'"}]}]}}}}'
設計上、Kubernetesは実行中のポッドにシークレットの更新をプッシュしません。ポッドのシークレット値を更新する場合は、ポッドを破棄して再作成する必要があります。それについてもっと読むことができます こちら 。