フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

ArgoCD Notificationで失敗検知の時間を短くする方法

f:id:lirlia:20210917203459p:plain

ArgoCD Notificationでmanifestの適用後の失敗検知をしていると、10分経たないと通知がされません。これを短くする方法です。

方法

Statefulset / DaemonSetの場合はExceededの処理がArgoCDに見当たらなかったのでその状態にならなさそう。

Deploymentの場合

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment
spec:
  progressDeadlineSeconds: 30 # 🌟 設定する

説明

ArgoCD NotificationはArgoCDが対象のリソースの状態を成功ー>失敗のように切り替えたことを検知して通知を飛ばします。

そのためArgoCD側で早く状態の差分を検知する必要があります。ではArgoCDはどのようにkubernetesリソースの状態を検知しているのでしょうか?

gitops-engine/health.go at 2c97a96cab1b9386728feed92e0fa31547ea2a98 · argoproj/gitops-engine · GitHub

func GetHealthCheckFunc(gvk schema.GroupVersionKind) func(obj *unstructured.Unstructured) (*HealthStatus, error) {
    switch gvk.Group {
    case "apps":
        switch gvk.Kind {
        case kube.DeploymentKind:
            return getDeploymentHealth
        case kube.StatefulSetKind:
            return getStatefulSetHealth
        case kube.ReplicaSetKind:
            return getReplicaSetHealth
        case kube.DaemonSetKind:
            return getDaemonSetHealth
        }
    case "extensions":
        switch gvk.Kind {
        case kube.DeploymentKind:
            return getDeploymentHealth
        case kube.IngressKind:
            return getIngressHealth
        case kube.ReplicaSetKind:
            return getReplicaSetHealth
        case kube.DaemonSetKind:
            return getDaemonSetHealth
        }
    case "argoproj.io":
        switch gvk.Kind {
        case "Workflow":
            return getArgoWorkflowHealth
        }
    case "apiregistration.k8s.io":
        switch gvk.Kind {
        case kube.APIServiceKind:
            return getAPIServiceHealth
        }
    case "networking.k8s.io":
        switch gvk.Kind {
        case kube.IngressKind:
            return getIngressHealth
        }
    case "":
        switch gvk.Kind {
        case kube.ServiceKind:
            return getServiceHealth
        case kube.PersistentVolumeClaimKind:
            return getPVCHealth
        case kube.PodKind:
            return getPodHealth
        }
    case "batch":
        switch gvk.Kind {
        case kube.JobKind:
            return getJobHealth
        }
    case "autoscaling":
        switch gvk.Kind {
        case kube.HorizontalPodAutoscalerKind:
            return getHPAHealth
        }
    }
    return nil
}

ここで行われています。Deploymentをみてみると、その裏側はrollout時の結果を見ていることがさらにコードを読み解いていくとわかります。

より細かく説明すると Deploymentの「.status.conditions」が「ProgressDeadlineExceeded」かどうかを判定しています。

ということでKubernetesのrolloutがいかに早く状態の変更を行うかにかかっているわけです。(ArgoCD Notification -> ArgoCD -> Kuberneteと追ってきましたね)

ということでrolloutの .status.conditions を早く検知するための設定が .spec.progressDeadlineSeconds になります。

つまりこのように設定すれば良いことになります。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment
spec:
  progressDeadlineSeconds: 30 # 🌟 設定する