kubectl logs -n vault vault-0
kubectl get pvc -n vault
# Check Bound statuskubectl exec -n vault vault-0 -- vault operator unseal <KEY1>
kubectl exec -n vault vault-0 -- vault operator unseal <KEY2>
kubectl exec -n vault vault-0 -- vault operator unseal <KEY3>export VAULT_TOKEN=$(jq -r .root_token ~/blogstack-k8s/security/vault/init-scripts/init-output.json)CA=$(kubectl get secret ingress-nginx-admission -n ingress-nginx -o jsonpath='{.data.ca}')
kubectl patch validatingwebhookconfiguration ingress-nginx-admission \
--type='json' \
-p='[{"op": "add", "path": "/webhooks/0/clientConfig/caBundle", "value":"'$CA'"}]'
kubectl patch application ghost -n argocd \
-p '{"operation": {"sync": {"revision": "HEAD"}}}' --type mergeTUNNEL_TOKEN=$(kubectl get secret cloudflared-token -n cloudflared -o jsonpath='{.data.token}' | base64 -d)
echo "Token length: ${#TUNNEL_TOKEN}" # 184
docker run --rm docker.io/cloudflare/cloudflared:2025.10.0 \
tunnel --no-autoupdate run --token "$TUNNEL_TOKEN"
# Should see: Connection registeredWith metrics:
docker run --rm -p 2000:2000 \
-e TUNNEL_METRICS=0.0.0.0:2000 \
docker.io/cloudflare/cloudflared:2025.10.0 \
tunnel --no-autoupdate run --token "$TUNNEL_TOKEN"
curl http://localhost:2000/metricskubectl logs -n cloudflared -l app=cloudflared
# Common causes:
# - Invalid token
# - Tunnel deleted (check Cloudflare Dashboard)kubectl logs -n blog deployment/ghost --tail=100
# Common causes:
# - MySQL connection failed
# - MySQL Service has no ready endpoints (e.g., mysql-0 NotReady)
# - database__connection__password mismatch
# Check MySQL endpoint readiness (Service -> EndpointSlice)
kubectl get pod -n blog mysql-0
kubectl get endpointslice -n blog -l kubernetes.io/service-name=mysql
# If mysql-0 is NotReady due to mysql-exporter secret sync failure
kubectl get secret -n blog mysql-exporter-secret
kubectl describe vaultstaticsecret -n blog mysql-exporter-secret
# Check MySQL passwords
kubectl get secret -n blog ghost-env -o jsonpath='{.data.database__connection__password}' | base64 -d
kubectl get secret -n blog mysql-secret -o jsonpath='{.data.password}' | base64 -d
# Must matchkubectl get pods -n blog
kubectl get ingress -n blog
kubectl describe ingress ghost -n blogkubectl logs -n blog deployment/ghost | grep -i mail
# Check SMTP config
kubectl get secret -n blog ghost-env -o jsonpath='{.data.mail__options__auth__pass}' | base64 -d
# Check Vault
vault kv get -format=json kv/blog/prod/ghost | jq -r '.data.data | keys | .[]' | grep mail__kubectl describe pod mysql-0 -n blog
# Events: Check PVC Bound
kubectl get pvc -n blog
# STATUS: Boundkubectl exec -n blog mysql-0 -- mysql \
-u root \
-p$(kubectl get secret -n blog mysql-secret -o jsonpath='{.data.root_password}' | base64 -d) \
-e "SELECT 1;"kubectl get applications -n argocd
kubectl describe application <app-name> -n argocd | grep -A 10 "Message:"
# Manual sync
kubectl patch application <app-name> -n argocd \
-p '{"operation":{"sync":{"revision":"HEAD"}}}' --type mergekubectl apply -f ./clusters/prod/project.yaml
kubectl delete application blogstack-root -n argocd
kubectl apply -f ./iac/argocd/root-app.yaml# Check vmagent config
kubectl get configmap -n observers vmagent-scrape -o yaml
# Check vmagent logs
kubectl logs -n observers deploy/vmagentTarget services:
kubectl get svc -n blog mysql-exporter
kubectl get svc -n ingress-nginx
kubectl get svc -n cloudflared
kubectl get svc -n vault- Verify the datasource: Configuration → Data Sources → VictoriaMetrics → Save & Test
- Check vmsingle access:
kubectl port-forward -n observers svc/vmsingle 8428:8428 & # http://localhost:8428/vmui
- Confirm blackbox targets in vmagent config
- Check blackbox-exporter status:
kubectl get pods -n observers -l app.kubernetes.io/instance=blackbox-exporter
kubectl get vaultstaticsecret -n vso
kubectl describe vaultstaticsecret <name> -n vso
# Restart VSO
kubectl delete pod -n vso -l app.kubernetes.io/name=vault-secrets-operator
# Check after 30s
kubectl get secrets -n blog# Check DNS
dig yourdomain.com +short
# Check Cloudflare Tunnel
kubectl logs -n cloudflared -l app=cloudflared | grep "Connection registered"
# Check ingress
kubectl get ingress -n blog
# Check Ghost pod
kubectl get pods -n blogkubectl run -it --rm debug --image=busybox --restart=Never -- nslookup mysql.blog.svc.cluster.localdf -h /var/lib/rancher/k3s/storage
# Clean if <50GB free
# Remove unused images
sudo k3s crictl rmi --prune# All pod status
kubectl get pods -A > pods-status.txt
# Specific pod logs
kubectl logs -n <namespace> <pod-name> > pod-log.txt
# Events
kubectl get events -A --sort-by='.lastTimestamp' > events.txt