🐙

IstioのparentShutdownDurationが削除されていた話

2023/11/12に公開

背景

Kubernetesでistioを導入しているシステムにおいて、podを安全に停止する方法を調べていたところ、istioのparentShutdownDurationというパラメータに言及している記事をいくつか見つけました。

しかしながら、最新版のdocumentではproxy-configのパラメータにparentShutdownDurationが存在しません。調べてみると、istioのバージョン1.17のタイミングでdocumentから削除されているようのですが、リリースノートにも記載が見当たらず、ネットでも解説しているものがなかっため、廃止された背景について調査しました。

結論

parentShutdownDurationはenvoyのhot restartに関わるパラメータですが、istioがenvoyのhot restartを利用しなくなったため、parentShutdownDurationのパラメータも削除されました。
istioのhot restart自体はistioバージョン1.10の時点で削除されています。

parentShutdownDurationとは

envoyにはhot restartによる設定値更新の仕組みがあり、hot restartを実行すると、新しくenvoyのプロセスが起動され、一時的に新旧2つのenvoyプロセスが並列実行される状態になります。
旧プロセスはhot restartが開始してから--drain-time-sの秒数だけdrain状態となり、--parent-shutdown-time-sの秒数が経過すると強制的にshutdownされ、hot restartが完了します。

istioはenvoy実行時にparentShutdownDurationの値を--parent-shutdown-time-sに渡しています。つまり、parentShutdownDurationはenvoyがhot restartする時に旧プロセスをshutdownするまでの秒数を指します。(ちなみに、istioのdrainDurationの値が--drain-time-sに渡される)

削除された経緯

githubを確認したところ、2021年3月9日にDiable envoy hot restartというPRが作成されています。

このPRによると、以下の内容が述べられています。

  • 現状hot restartは利用していないので無効化する
  • hot restartを無効にすると単一pod上で複数のenvoyを実行するのがシンプルになる
  • envoy側の作業も軽減されるし、envoyへ付与する権限も少なくて済む

最初に紹介した記事では、istioのsidecarを終了するとenvoyにhot restartが実行されるとの記載があったのですが、実際には2021年時点で利用されていなかったということでしょうか。(ここはあまり自信ありません)
envoyの仕組みとしては、hot restartを利用せずともxDSというAPIを利用して設定値を動的に変更できるようなので、副作用が大きいhot restartは使われなくなっていったのかと推測されます。

とにかく、istioのバージョン1.10.0にこのPRが取り込まれ、envoyのhot restartが無効化されます。実装としては、envoyの起動オプションに--disable-hot-restartが渡されるようになります。

しかしながら、parentShutdownDurationのパラメータはhot restartにしか使われないにも関わらず、このタイミングでは削除されませんでした。そのまま1年半以上の月日が過ぎ、2022年12月3日にようやくparentShutdownDurationを削除するPRが作成され、2023年2月14日にリリースされたistioバージョン1.17.0に取り込まれます。
つまり、istioバージョン1.10〜1.16ではparentShutdownDurationのパラメータを設定できるものの動作しない状態だったということになります。

上記のPRはいずれもリリースノートに記載がありませんでした。リリースノートに記載がないとgithubのissueやPRを追わないといけないので、中々気付くのは難しいですね。

Discussion