im-server-test ArgoCD patch
The live StatefulSet is owned by the ArgoCD Application im-server-test.
Copy statefulset-performance-patch.yaml into that application's Git source
and reference it from the test overlay:
patches:
- path: statefulset-performance-patch.yaml
Also include backend-debug-metrics-rbac.yaml as a resource in the test
overlay. It grants the existing argocd/backend-debug service account
namespaced read access to Pod metrics so the load-test collector can run
kubectl top pods -n im-server-system:
resources:
- backend-debug-metrics-rbac.yaml
After ArgoCD sync, verify the effective configuration:
kubectl -n im-server-system get statefulset im-server -o jsonpath='{.spec.template.spec.containers[0].resources}'
kubectl -n im-server-system get statefulset im-server -o jsonpath='{.spec.template.spec.containers[0].livenessProbe.httpGet.path}'
kubectl -n im-server-system get statefulset im-server -o jsonpath='{.spec.template.spec.containers[0].env}'
kubectl -n im-server-system get statefulset im-server -o jsonpath='{.spec.template.spec.dnsConfig.options}'
kubectl auth can-i list pods.metrics.k8s.io \
--as=system:serviceaccount:argocd:backend-debug \
-n im-server-system
Expected values are requests 2 CPU / 512Mi, limits 2 CPU / 1Gi, and
liveness path /livez. The MySQL pool environment must be
MYSQL_MAX_OPEN_CONNS=24, MYSQL_MAX_IDLE_CONNS=8,
MYSQL_REGISTRY_MAX_OPEN_CONNS=4, and MYSQL_REGISTRY_MAX_IDLE_CONNS=2.
The MySQL connection lifetime must be MYSQL_CONN_MAX_LIFETIME_SECONDS=1800.
The WebSocket heartbeat environment must be WS_PING_PERIOD_SECONDS=15 and
WS_PONG_WAIT_SECONDS=90.
The Pod DNS options must be ndots:1, timeout:2, and attempts:2. Keeping
ClusterFirst preserves short Kubernetes service-name resolution, while the
lower ndots value prevents fully qualified internal and external dependency
names from being expanded through every cluster search suffix first.
The application repository's deploy workflow waits for reconciliation and
fails if ArgoCD restores different values.
After the rollout, verify the generated resolver configuration on every Pod:
for pod in im-server-0 im-server-1 im-server-2; do
echo "--- ${pod}"
kubectl -n im-server-system exec "${pod}" -- cat /etc/resolv.conf
done
The output must retain the cluster DNS nameserver and search domains, with
options ndots:1 timeout:2 attempts:2. This mitigation reduces amplified DNS
traffic from the application Pods. If lookup timeouts remain under load,
CoreDNS capacity or NodeLocal DNSCache must be changed in the cluster
infrastructure repository by an administrator with kube-system access.