feat: health check for ArgoCD
This commit is contained in:
parent
469a0faec4
commit
63e129f46f
|
|
@ -0,0 +1,76 @@
|
|||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: argocd-cm
|
||||
namespace: argocd
|
||||
data:
|
||||
# Health check for actions.summerwind.dev/v1alpha1 Runner
|
||||
resource.customizations.health.actions.summerwind.dev_Runner: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.ready == true and obj.status.phase == "Running" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "Runner is ready and running"
|
||||
elseif obj.status.phase == "Pending" or obj.status.phase == "Created" then
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner is starting up"
|
||||
elseif obj.status.phase == "Failed" then
|
||||
hs.status = "Degraded"
|
||||
hs.message = obj.status.message or "Runner has failed"
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner status: " .. (obj.status.phase or "Unknown")
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for runner status"
|
||||
end
|
||||
return hs
|
||||
|
||||
# Health check for actions.github.com/v1alpha1 EphemeralRunner
|
||||
resource.customizations.health.actions.github.com_EphemeralRunner: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.phase == "Running" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "EphemeralRunner is running"
|
||||
elseif obj.status.phase == "Pending" then
|
||||
hs.status = "Progressing"
|
||||
hs.message = "EphemeralRunner is pending"
|
||||
elseif obj.status.phase == "Failed" then
|
||||
hs.status = "Degraded"
|
||||
hs.message = obj.status.message or "EphemeralRunner has failed"
|
||||
elseif obj.status.phase == "Finished" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "EphemeralRunner has finished"
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "EphemeralRunner status: " .. (obj.status.phase or "Unknown")
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for EphemeralRunner status"
|
||||
end
|
||||
return hs
|
||||
|
||||
# Health check for actions.github.com/v1alpha1 AutoScalingRunnerSet
|
||||
resource.customizations.health.actions.github.com_AutoScalingRunnerSet: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.currentReplicas ~= nil and obj.status.desiredReplicas ~= nil then
|
||||
if obj.status.currentReplicas == obj.status.desiredReplicas then
|
||||
hs.status = "Healthy"
|
||||
hs.message = string.format("Runners: %d/%d", obj.status.currentReplicas, obj.status.desiredReplicas)
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = string.format("Scaling runners: %d/%d", obj.status.currentReplicas, obj.status.desiredReplicas)
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Initializing runner set"
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for status"
|
||||
end
|
||||
return hs
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: argocd-cm
|
||||
namespace: argocd
|
||||
data:
|
||||
resource.customizations.health.actions.summerwind.dev_Runner: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.ready == true and obj.status.phase == "Running" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "Runner is ready and running"
|
||||
elseif obj.status.phase == "Pending" or obj.status.phase == "Created" then
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner is starting up"
|
||||
elseif obj.status.phase == "Failed" then
|
||||
hs.status = "Degraded"
|
||||
hs.message = obj.status.message or "Runner has failed"
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner status: " .. (obj.status.phase or "Unknown")
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for runner status"
|
||||
end
|
||||
return hs
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
# ArgoCD Health Check Configuration for Actions Runner Controller
|
||||
|
||||
This document explains how to configure ArgoCD to properly recognize the health status of Runner resources.
|
||||
|
||||
## Problem
|
||||
|
||||
By default, ArgoCD doesn't understand the health status of custom resources like `Runner`. Even when a Runner Pod is up and running, ArgoCD may show the status as "Progressing" instead of "Healthy".
|
||||
|
||||
## Solution
|
||||
|
||||
Add a custom health check configuration to ArgoCD's ConfigMap to interpret the Runner resource's status fields.
|
||||
|
||||
### 1. Apply the Custom Health Check
|
||||
|
||||
Apply the following configuration to your ArgoCD installation:
|
||||
|
||||
```bash
|
||||
kubectl apply -f argocd-runner-health.yaml
|
||||
```
|
||||
|
||||
Or, if you already have an `argocd-cm` ConfigMap, add the following to the `data` section:
|
||||
|
||||
```yaml
|
||||
data:
|
||||
resource.customizations.health.actions.summerwind.dev_Runner: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.ready == true and obj.status.phase == "Running" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "Runner is ready and running"
|
||||
elseif obj.status.phase == "Pending" or obj.status.phase == "Created" then
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner is starting up"
|
||||
elseif obj.status.phase == "Failed" then
|
||||
hs.status = "Degraded"
|
||||
hs.message = obj.status.message or "Runner has failed"
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner status: " .. (obj.status.phase or "Unknown")
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for runner status"
|
||||
end
|
||||
return hs
|
||||
```
|
||||
|
||||
### 2. Restart ArgoCD Server
|
||||
|
||||
After applying the configuration, restart the ArgoCD server to load the new health check:
|
||||
|
||||
```bash
|
||||
kubectl rollout restart deployment argocd-server -n argocd
|
||||
```
|
||||
|
||||
## Health Status Mapping
|
||||
|
||||
The custom health check maps Runner statuses to ArgoCD health statuses as follows:
|
||||
|
||||
| Runner Status | ArgoCD Health Status | Description |
|
||||
| -- | -- | -- |
|
||||
| `ready: true` and `phase: Running` | Healthy | Runner is fully operational |
|
||||
| `phase: Pending` or `Created` | Progressing | Runner is starting up |
|
||||
| `phase: Failed` | Degraded | Runner has encountered an error |
|
||||
| Other states | Progressing | Runner is in transition |
|
||||
|
||||
## Verification
|
||||
|
||||
After configuration, you can verify the health status in ArgoCD:
|
||||
|
||||
1. Check the ArgoCD UI - Runner resources should show as "Healthy" when ready
|
||||
2. Use the ArgoCD CLI:
|
||||
```bash
|
||||
argocd app get <your-app-name> --refresh
|
||||
```
|
||||
|
||||
## Alternative Approach: Patching the ConfigMap
|
||||
|
||||
If you need to patch an existing ConfigMap:
|
||||
|
||||
```bash
|
||||
kubectl patch configmap argocd-cm -n argocd --type merge -p '{"data":{"resource.customizations.health.actions.summerwind.dev_Runner":"hs = {}\nif obj.status ~= nil then\n if obj.status.ready == true and obj.status.phase == \"Running\" then\n hs.status = \"Healthy\"\n hs.message = \"Runner is ready and running\"\n elseif obj.status.phase == \"Pending\" or obj.status.phase == \"Created\" then\n hs.status = \"Progressing\"\n hs.message = \"Runner is starting up\"\n elseif obj.status.phase == \"Failed\" then\n hs.status = \"Degraded\"\n hs.message = obj.status.message or \"Runner has failed\"\n else\n hs.status = \"Progressing\"\n hs.message = \"Runner status: \" .. (obj.status.phase or \"Unknown\")\n end\nelse\n hs.status = \"Progressing\"\n hs.message = \"Waiting for runner status\"\nend\nreturn hs"}}'
|
||||
```
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
# Example values for configuring ArgoCD health checks when using Helm
|
||||
|
||||
# If you're deploying ArgoCD using the official Helm chart,
|
||||
# you can add these health checks to your values.yaml:
|
||||
|
||||
server:
|
||||
config:
|
||||
resource.customizations.health.actions.summerwind.dev_Runner: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.ready == true and obj.status.phase == "Running" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "Runner is ready and running"
|
||||
elseif obj.status.phase == "Pending" or obj.status.phase == "Created" then
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner is starting up"
|
||||
elseif obj.status.phase == "Failed" then
|
||||
hs.status = "Degraded"
|
||||
hs.message = obj.status.message or "Runner has failed"
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Runner status: " .. (obj.status.phase or "Unknown")
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for runner status"
|
||||
end
|
||||
return hs
|
||||
|
||||
resource.customizations.health.actions.github.com_EphemeralRunner: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.phase == "Running" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "EphemeralRunner is running"
|
||||
elseif obj.status.phase == "Pending" then
|
||||
hs.status = "Progressing"
|
||||
hs.message = "EphemeralRunner is pending"
|
||||
elseif obj.status.phase == "Failed" then
|
||||
hs.status = "Degraded"
|
||||
hs.message = obj.status.message or "EphemeralRunner has failed"
|
||||
elseif obj.status.phase == "Finished" then
|
||||
hs.status = "Healthy"
|
||||
hs.message = "EphemeralRunner has finished"
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "EphemeralRunner status: " .. (obj.status.phase or "Unknown")
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for EphemeralRunner status"
|
||||
end
|
||||
return hs
|
||||
|
||||
resource.customizations.health.actions.github.com_AutoScalingRunnerSet: |
|
||||
hs = {}
|
||||
if obj.status ~= nil then
|
||||
if obj.status.currentReplicas ~= nil and obj.status.desiredReplicas ~= nil then
|
||||
if obj.status.currentReplicas == obj.status.desiredReplicas then
|
||||
hs.status = "Healthy"
|
||||
hs.message = string.format("Runners: %d/%d", obj.status.currentReplicas, obj.status.desiredReplicas)
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = string.format("Scaling runners: %d/%d", obj.status.currentReplicas, obj.status.desiredReplicas)
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Initializing runner set"
|
||||
end
|
||||
else
|
||||
hs.status = "Progressing"
|
||||
hs.message = "Waiting for status"
|
||||
end
|
||||
return hs
|
||||
Loading…
Reference in New Issue