skaffold v1.36.1までskaffold.yamlのstatusCheckフィールドが使えなかった
仕事でKubernetes上でアプリケーションを動かしていて、デプロイにskaffoldを使っています。 実際に自分が開発しているサービスについては下記のブログが詳しいです。
そのskaffoldのバージョンを上げた際にStateful Setのステータスチェックが走り、それをskaffold.yamlで無効化しようとしてできなかったのでその原因と対処法について書いておきます。
問題
skaffoldはデプロイ時(skaffold dev
や skaffold run
など)に、含まれているWorkloadsリソースのステータスチェックを実行します*1。
Deploymentであれば kubectl rollout status deployment
を実行して正常終了するまで監視するという感じです。
今回はskaffoldのバージョンを1.15.0から現時点での最新版である1.36.1に上げました。その際に、以前までは実行されていなかったStateful Setのステータスチェックが走るようになり、それにかかる時間が非常に長い影響で skaffold run
がタイムアウトしCIが失敗するという状況になってしまいました。
ドキュメントを見たところ、skaffold run
のオプションとして --status-check=false
を指定するか、skaffold.yamlで statusCheck: false
を指定すれば無効化できると書いてありました*2。
現在の構成ではAPIが動くDeploymentとFluentdが動くStateful Setは別のskaffold.yamlで管理しており、CIではデプロイを同じJobで行っています。そのため、--status-check=false
では時間通りに終わるDeploymentのステータスチェックも無効化されてしまいます。今回はStateful Setのみ無効化したかったので、skaffold.yamlで statusCheck: false
を指定することにしました。
しかし、実際に skaffold run
を実行したところ、skaffold.yamlの設定を無視してステータスチェックが実行されてしまいました。
原因
これは statusCheck: false
での設定よりもCLIの --status-check
オプションが優先されることが原因です。
本来 --status-check
オプションのデフォルト値はnullであるはずなのですが、誤ってtrueが設定されていました。
そのため、statusCheck: false
を指定しても --status-check
のデフォルト値が優先され、ステータスチェックが実行されてしまいます。
skaffoldのリポジトリにもissueを投げました。
対処法
デフォルトでtrueになっているのが原因なので、--status-check
の値をnullにすればskaffold.yamlの設定を見るようになります。
具体的には、下記のように空を指定することで対処できます。
skaffold run --status-check=
いつ修正されるか
上述したissueでも触れているんですが、最新のmainブランチのコードを見たところ問題は修正されていました*3。
そのため、v1.37.0からは問題なく statusCheck: false
が使えるようになっています。
過去のバージョンを使っている人が同じ問題に当たったときの参考になれば幸いです。