0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flaggerの`progressDeadlineSeconds`とは何か?`ImagePullBackOff`でも10分待たされる理由

Posted at

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())
}

簡単に言えば:

  1. ImagePullBackOffが発生→デプロイメントの状態が更新される
  2. Flaggerがその状態を検出→LastUpdateTimeからのカウントダウン開始
  3. progressDeadlineSeconds(デフォルト600秒)経過→「リトライ不可能」と判断
  4. 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エンジニアを募集しているので、よかったら見てみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?