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リソースの状態を検知しているのでしょうか?
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 # 🌟 設定する