[GKE] podを新規作成した際、初期化コマンドを実行させたい場合
新たしいデプロイを起動しPodが立ち上がった際、サイト名などの初期設定を自動で行いたいので、いろいろ試した結果のメモ
目次
結論
必ず自動起動されるrc.local (今回はrc.entryというスクリプト)のスクリプト内に実行してほしいShellをネストして起動させた
https://qiita.com/hnishi/items/6a5b8b67d807f8dfe44e
トライしてだめだったこと
デプロイを作成した際にyamlにcommandを記載しておけば、pod起動時にコマンドを実行させることができる
https://qiita.com/petitviolet/items/41aa9abe106a29ba4667
なぜだめだったか
初期設定を行うスクリプトをShellで書いており、yaml内のcommandでShellを指定、確かPOD起動時にはコマンドが実行されていたが、CrashLoopBackOffが発生しきちんと起動することがなかった
原因
KubernetesはPodのプロセスが落ちると、自動的にそれを検知し、Pod の状態が異常であるとみなして Pod を再起動してしまう仕様になっている。
https://neos21.hatenablog.com/entry/2019/04/23/080000
なので、こちらが作成した自動設定スクリプトの処理が終了しプロセスが落ちた段階でPodが再起動するようになっていたため
とりあえずプロセスが落ちないように対処してみたけど
プロセスを永続化(ずっと起動しつづける)させるには、シェルの最後に
tail -f /dev/null
を実行して、ひたすらtailさせることがメジャーな様子。
自動設定するスクリプトの最後に「tail -f /dev/null 」をつけてみて、再度yaml内のcommandで実行させてみた
結果、自動設定するスクリプトが終わらず次のrc.localが起動しなかったため、起動してほしいサービスが起動しないことに、、これって順番に起動するんだっけ
yaml内のcommandはあきらめた
ということで、いろいろやってみたがyaml内のcommandでのスクリプトの自動起動は諦め、そもそも自動起動していたrc.localで自作スクリプトを起動してもらうことにした。