diff --git a/degraded-example/Readme.md b/degraded-example/Readme.md new file mode 100644 index 0000000000..7fa8542939 --- /dev/null +++ b/degraded-example/Readme.md @@ -0,0 +1,14 @@ +# Degraded Example + +This folder contains Kubernetes manifests for a degraded application. The purpose of this app is to demonstrate how ArgoCD displays and manages degraded resources. + +## Purpose +The `degraded-example` app is designed to help users understand how ArgoCD handles and displays issues such as: +- Image pull errors +- Misconfigured services +- Missing dependencies (e.g., ConfigMaps, Secrets) +- Storage and scheduling issues + +These examples simulate real-world problems that can occur in Kubernetes deployments. + +--- \ No newline at end of file diff --git a/degraded-example/examples/conflicting-rules.yml b/degraded-example/examples/conflicting-rules.yml new file mode 100644 index 0000000000..467cc1c81d --- /dev/null +++ b/degraded-example/examples/conflicting-rules.yml @@ -0,0 +1,23 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: conflicting-rules-ingress +spec: + rules: + - host: example.com + http: + paths: + - path: /path + pathType: Prefix + backend: + service: + name: service-a + port: + number: 80 + - path: /path # Duplicate path causing conflict + pathType: Prefix + backend: + service: + name: service-b + port: + number: 80 diff --git a/degraded-example/examples/headless-service.yml b/degraded-example/examples/headless-service.yml new file mode 100644 index 0000000000..9a074a3146 --- /dev/null +++ b/degraded-example/examples/headless-service.yml @@ -0,0 +1,18 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: invalid-statefulset +spec: + serviceName: missing-headless-service # Service does not exist + replicas: 1 + selector: + matchLabels: + app: invalid-statefulset + template: + metadata: + labels: + app: invalid-statefulset + spec: + containers: + - name: main-container + image: nginx:latest diff --git a/degraded-example/examples/insufficient-resources.yml b/degraded-example/examples/insufficient-resources.yml new file mode 100644 index 0000000000..b383cf000d --- /dev/null +++ b/degraded-example/examples/insufficient-resources.yml @@ -0,0 +1,23 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: insufficient-resources + labels: + app: insufficient-resources +spec: + replicas: 1 + selector: + matchLabels: + app: insufficient-resources + template: + metadata: + labels: + app: insufficient-resources + spec: + containers: + - name: main-container + image: nginx:latest + resources: + requests: + memory: "10Ti" # Exceeds cluster capacity + cpu: "5000" # Exceeds cluster capacity diff --git a/degraded-example/examples/insufficient-volume-claims.yml b/degraded-example/examples/insufficient-volume-claims.yml new file mode 100644 index 0000000000..3d662a78f7 --- /dev/null +++ b/degraded-example/examples/insufficient-volume-claims.yml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: insufficient-pvc-statefulset +spec: + serviceName: some-service + replicas: 3 + selector: + matchLabels: + app: insufficient-pvc-statefulset + template: + metadata: + labels: + app: insufficient-pvc-statefulset + spec: + containers: + - name: main-container + image: nginx:latest + volumeMounts: + - name: data + mountPath: /data + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi + storageClassName: non-existent-storage-class # Causes PVC failure diff --git a/degraded-example/examples/invalid-backend.yml b/degraded-example/examples/invalid-backend.yml new file mode 100644 index 0000000000..4bc0887643 --- /dev/null +++ b/degraded-example/examples/invalid-backend.yml @@ -0,0 +1,16 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: invalid-ingress +spec: + rules: + - host: example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: non-existent-service # Service does not exist + port: + number: 80 diff --git a/degraded-example/examples/invalid-key.yml b/degraded-example/examples/invalid-key.yml new file mode 100644 index 0000000000..0e73926df1 --- /dev/null +++ b/degraded-example/examples/invalid-key.yml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: invalid-configmap +data: + invalid-key$: "This key is invalid" # Invalid key name diff --git a/degraded-example/examples/invalid-metrics.yml b/degraded-example/examples/invalid-metrics.yml new file mode 100644 index 0000000000..0d92736147 --- /dev/null +++ b/degraded-example/examples/invalid-metrics.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: invalid-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: some-deployment + minReplicas: 1 + maxReplicas: 10 + metrics: + - type: Resource + resource: + name: invalid-metric # Invalid resource metric + target: + type: Utilization + averageUtilization: 50 diff --git a/degraded-example/examples/invalid-nodeselector.yml b/degraded-example/examples/invalid-nodeselector.yml new file mode 100644 index 0000000000..02759947a8 --- /dev/null +++ b/degraded-example/examples/invalid-nodeselector.yml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Pod +metadata: + name: degraded-pod +spec: + nodeSelector: + invalid-key: invalid-value # Node selector does not match any node + containers: + - name: main-container + image: nginx:latest diff --git a/degraded-example/examples/invalid-portconfiguration.yml b/degraded-example/examples/invalid-portconfiguration.yml new file mode 100644 index 0000000000..b808e8a3bf --- /dev/null +++ b/degraded-example/examples/invalid-portconfiguration.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: invalid-port-service +spec: + selector: + app: some-app + ports: + - protocol: TCP + port: 80 + targetPort: 9999 # No container listens on this port diff --git a/degraded-example/examples/invalid-rules.yml b/degraded-example/examples/invalid-rules.yml new file mode 100644 index 0000000000..ca946a2153 --- /dev/null +++ b/degraded-example/examples/invalid-rules.yml @@ -0,0 +1,14 @@ +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: invalid-networkpolicy +spec: + podSelector: {} + policyTypes: + - Ingress + - Egress + ingress: + - from: + - namespaceSelector: + matchLabels: + non-existent-label: value # No matching namespace diff --git a/degraded-example/examples/invalid-schedule.yml b/degraded-example/examples/invalid-schedule.yml new file mode 100644 index 0000000000..7ab8da62cd --- /dev/null +++ b/degraded-example/examples/invalid-schedule.yml @@ -0,0 +1,14 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: invalid-cronjob +spec: + schedule: "invalid-schedule" # Invalid cron expression + jobTemplate: + spec: + template: + spec: + containers: + - name: main-container + image: nginx:latest + restartPolicy: OnFailure diff --git a/degraded-example/examples/invalid-schema.yml b/degraded-example/examples/invalid-schema.yml new file mode 100644 index 0000000000..3fb9ad3e80 --- /dev/null +++ b/degraded-example/examples/invalid-schema.yml @@ -0,0 +1,21 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: invalid-crd.example.com +spec: + group: example.com + names: + kind: InvalidCRD + plural: invalidcrds + singular: invalidcrd + scope: Namespaced + versions: + - name: v1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: string # Invalid schema (should be an object) diff --git a/degraded-example/examples/invalid-selector.yml b/degraded-example/examples/invalid-selector.yml new file mode 100644 index 0000000000..e7fa4bfa7b --- /dev/null +++ b/degraded-example/examples/invalid-selector.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: degraded-app-service +spec: + selector: + app: non-existent-selector # Selector mismatch to cause Service issues + ports: + - protocol: TCP + port: 80 + targetPort: 8080 diff --git a/degraded-example/examples/invalid-volumemount.yml b/degraded-example/examples/invalid-volumemount.yml new file mode 100644 index 0000000000..81fd2dba30 --- /dev/null +++ b/degraded-example/examples/invalid-volumemount.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Pod +metadata: + name: invalid-volume-pod +spec: + containers: + - name: main-container + image: nginx:latest + volumeMounts: + - mountPath: /data + name: missing-volume # Volume not defined diff --git a/degraded-example/examples/missing-configmap.yml b/degraded-example/examples/missing-configmap.yml new file mode 100644 index 0000000000..8a80ca3cad --- /dev/null +++ b/degraded-example/examples/missing-configmap.yml @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: degraded-app-config + labels: + app: degraded-app-config +spec: + replicas: 1 + selector: + matchLabels: + app: degraded-app-config + template: + metadata: + labels: + app: degraded-app-config + spec: + containers: + - name: main-container + image: nginx:latest + envFrom: + - configMapRef: + name: missing-configmap # ConfigMap not created diff --git a/degraded-example/examples/missing-image.yml b/degraded-example/examples/missing-image.yml new file mode 100644 index 0000000000..cc3dbfe93f --- /dev/null +++ b/degraded-example/examples/missing-image.yml @@ -0,0 +1,11 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: missing-image-job +spec: + template: + spec: + containers: + - name: main-container + image: missing-image:latest # Non-existent image + restartPolicy: Never diff --git a/degraded-example/examples/missing-secret.yml b/degraded-example/examples/missing-secret.yml new file mode 100644 index 0000000000..30d57ea1e4 --- /dev/null +++ b/degraded-example/examples/missing-secret.yml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: invalid-serviceaccount +secrets: +- name: missing-secret # Secret not created diff --git a/degraded-example/examples/non-existing-image.yml b/degraded-example/examples/non-existing-image.yml new file mode 100644 index 0000000000..1b5185af65 --- /dev/null +++ b/degraded-example/examples/non-existing-image.yml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: degraded-app + labels: + app: degraded-app +spec: + replicas: 2 + selector: + matchLabels: + app: degraded-app + template: + metadata: + labels: + app: degraded-app + spec: + containers: + - name: main-container + image: non-existent-image:latest # Non-existent image to cause ImagePullBackOff + ports: + - containerPort: 8080 diff --git a/degraded-example/examples/unavailable-storageclass.yml b/degraded-example/examples/unavailable-storageclass.yml new file mode 100644 index 0000000000..6cec04e8ba --- /dev/null +++ b/degraded-example/examples/unavailable-storageclass.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: degraded-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: non-existent-storage-class # Invalid storage class diff --git a/degraded-example/examples/zero-replicas.yml b/degraded-example/examples/zero-replicas.yml new file mode 100644 index 0000000000..e41da0da40 --- /dev/null +++ b/degraded-example/examples/zero-replicas.yml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + name: zero-replicas-replicaset +spec: + replicas: 0 # No pods will be created + selector: + matchLabels: + app: zero-replicas-replicaset + template: + metadata: + labels: + app: zero-replicas-replicaset + spec: + containers: + - name: main-container + image: nginx:latest