Flagger(Kubernetesでカナリアリリースを実現するツール)では、イメージの取得できないような状況で、約10分間ほど待たないとカナリーが失敗判定になりません。イメージが取得できないのであればもっと早く失敗判定を下してほしいところです。この10分という待ち時間は、Flaggerの「progressDeadlineSeconds
」パラメータが関係しています。本稿では、この設定値がCanaryデプロイメントにどう影響するのか、そしてどのように調整できるのかを解説していきます。
Flaggerにおける進行状況デッドラインの仕組み
Flaggerは、Kubernetesのカナリアリリースを自動化するツールです。その中核となる機能の一つが、カナリーデプロイメントの自動管理です。
カナリーデプロイメントが進行する際、Flaggerは定期的にデプロイメントの状態をチェックし、問題があれば自動的にロールバックします。この「問題があると判断するまでの時間」を決めているのが、「progressDeadlineSeconds
」というパラメータです。
デフォルト値は10分
Flaggerのコードを見ると、progressDeadlineSeconds
のデフォルト値は600秒(10分)に設定されています:
// GetProgressDeadlineSeconds returns the progress deadline (default 600s)
func (c *Canary) GetProgressDeadlineSeconds() int {
if c.Spec.ProgressDeadlineSeconds != nil {
return int(*c.Spec.ProgressDeadlineSeconds)
}
return ProgressDeadlineSeconds // この定数が600に設定されている
}
つまり、何も設定しなければ、デプロイメントに問題が発生してから10分間待ってからロールバックが行われます。
ImagePullBackOff
と10分間の関係
ImagePullBackOff
のようなエラーが発生すると、KubernetesはDeploymentのAvailable
コンディションをFalse
に設定し、その理由としてMinimumReplicasUnavailable
を記録します。同時に、このコンディションの「LastUpdateTime
」も更新されます。
FlaggerはこのLastUpdateTime
を基準にして、progressDeadlineSeconds
で指定された時間(デフォルト600秒)が経過したかどうかをチェックします:
if available != nil && available.Status == "False" && available.Reason == "MinimumReplicasUnavailable" {
from := available.LastUpdateTime
delta := time.Duration(deadline) * time.Second
retriable = !from.Add(delta).Before(time.Now())
}
簡単に言えば:
-
ImagePullBackOff
が発生→デプロイメントの状態が更新される - Flaggerがその状態を検出→
LastUpdateTime
からのカウントダウン開始 -
progressDeadlineSeconds
(デフォルト600秒)経過→「リトライ不可能」と判断 - Canaryデプロイメントを失敗と見なし、ロールバック実行
これが、ImagePullBackOff
などのエラーが発生してから約10分後にCanaryが失敗となる仕組みです。
デッドライン時間を調整する方法
デプロイ失敗に早く気づきたい場合、この待ち時間を短縮できます。Canary CRのspec.progressDeadlineSeconds
パラメータを使って、進行状況デッドラインを設定しましょう:
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: my-app
namespace: default
spec:
# 進行状況デッドラインを180秒(3分)に設定
progressDeadlineSeconds: 180
# その他の設定は省略
この設定により、ImagePullBackOff
などのエラーが発生した場合、3分後にはロールバックが開始されます。
まとめ
Flaggerの「progressDeadlineSeconds
」は、デプロイメントの進行状況を監視し、問題が発生した場合にタイムアウトで判断するための重要なパラメータです。デフォルトの10分という時間が長いと感じるなら、Canary CRでこの値を調整することで、より迅速にエラーを検出し、ロールバックさせることができます。
最後までお読みくださりありがとうございました。
Xでは、Kubernetes関連の小ネタを投稿していますので、よかったらフォローお願いします!
また会社ではKubernetesエンジニアを募集しているので、よかったら見てみてください!