Johnman.md

プログラミングのことや個人的なことを書きます。たぶん。

skaffold v1.36.1までskaffold.yamlのstatusCheckフィールドが使えなかった

仕事でKubernetes上でアプリケーションを動かしていて、デプロイにskaffoldを使っています。 実際に自分が開発しているサービスについては下記のブログが詳しいです。

tech.gunosy.io

そのskaffoldのバージョンを上げた際にStateful Setのステータスチェックが走り、それをskaffold.yamlで無効化しようとしてできなかったのでその原因と対処法について書いておきます。

問題

skaffoldはデプロイ時(skaffold devskaffold 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.yamlstatusCheck: false を指定すれば無効化できると書いてありました*2

現在の構成ではAPIが動くDeploymentとFluentdが動くStateful Setは別のskaffold.yamlで管理しており、CIではデプロイを同じJobで行っています。そのため、--status-check=false では時間通りに終わるDeploymentのステータスチェックも無効化されてしまいます。今回はStateful Setのみ無効化したかったので、skaffold.yamlstatusCheck: false を指定することにしました。

しかし、実際に skaffold run を実行したところ、skaffold.yamlの設定を無視してステータスチェックが実行されてしまいました。

原因

これは statusCheck: falseでの設定よりもCLI--status-check オプションが優先されることが原因です。 本来 --status-check オプションのデフォルト値はnullであるはずなのですが、誤ってtrueが設定されていました。

そのため、statusCheck: false を指定しても --status-check のデフォルト値が優先され、ステータスチェックが実行されてしまいます。

skaffoldのリポジトリにもissueを投げました。

github.com

対処法

デフォルトでtrueになっているのが原因なので、--status-check の値をnullにすればskaffold.yamlの設定を見るようになります。 具体的には、下記のように空を指定することで対処できます。

skaffold run --status-check=

いつ修正されるか

上述したissueでも触れているんですが、最新のmainブランチのコードを見たところ問題は修正されていました*3

そのため、v1.37.0からは問題なく statusCheck: false が使えるようになっています。

過去のバージョンを使っている人が同じ問題に当たったときの参考になれば幸いです。