Skip to main content

Operations: upgrade, uninstall, backup, troubleshooting

Upgrade​

Helm installs CRDs on the first install only and never upgrades them, so apply the CRDs first:

kubectl apply --server-side --force-conflicts -f crds/ # from the release you are upgrading to
helm upgrade gryvia oci://ghcr.io/zyvorai/charts/gryvia -n gryvia-system --reset-then-reuse-values --version <new>

--reset-then-reuse-values (Helm 3.14 or later) starts from the new chart's defaults and applies the values you set before. Do not upgrade to a newer chart with --reuse-values: Helm then keeps the old chart's defaults, so a setting added since (such as nvidia.enabled: false) is missing, and Helm enables a sub-chart whose condition is missing. The chart refuses such values and names the missing key. --reuse-values is fine for changing settings without changing the chart version.

Without a checkout, each release also carries the CRDs as one file:

kubectl apply --server-side --force-conflicts -f https://github.com/zyvorai/gryvia/releases/download/<tag>/gryvia-crds.yaml

(gryvia-crds.yaml is the concatenation of crds/*.yaml, built by the release workflow, with a .sha256 next to it. It is attached by the release job and has not been published yet: no release has been cut with it.)

Roll back with helm rollback gryvia <revision> -n gryvia-system. Helm does not downgrade CRDs: the newer CRDs stay, which is safe for objects that were valid before.

Automated upgrade test​

scripts/upgrade-test.sh runs this procedure end to end on a kind cluster, and the Upgrade and rollback workflow (.github/workflows/upgrade.yml) runs it nightly, on demand and when the script changes. It installs the previous version (the newest release if its chart can be pulled from ghcr.io, otherwise the chart and images built from origin/main), creates the demo data plus a tenant and a quota, upgrades to the checkout, and asserts that every gryvia.io object keeps its spec, gryvia status --brief prints OK, the gateway login works, helm rollback leaves healthy deployments and intact objects, and that a backup, a deletion and a restore give back the same objects. Run it yourself with scripts/upgrade-test.sh --dry-run (prints the steps) or, with kind and docker, scripts/upgrade-test.sh --base-ref origin/main~1. It tests the kind demo configuration (GPU add-ons off), not your values, so read the changelog and try your own upgrade on a staging cluster first.

Gryvia is alpha and gryvia.io/v1alpha1 may change between releases; read the changelog before upgrading. Two changes are breaking: the Fabric* → Gryvia* kind rename and the move from gryvia.io/v1 to gryvia.io/v1alpha1: objects created under the old kinds (FabricAIJob, ...) or the old v1 version are not converted. Export them, change kind: and apiVersion: and re-apply, then delete the old CRDs (scripts/rename-kinds.sh and scripts/rename-version.sh document the mapping).

The self-signed certificate (gryvia-tls) and the API key Secret are kept across upgrades. Open dashboard tabs reload themselves once when a new version is deployed.

Uninstall​

helm uninstall gryvia -n gryvia-system

CRDs, your custom resources and the gryvia-tls Secret are kept on purpose. To remove everything, including data:

kubectl get crd -o name | grep '\.gryvia\.io$' | xargs kubectl delete # deletes every Gryvia object
kubectl delete namespace gryvia-system

Back up​

Gryvia keeps its state in Kubernetes custom resources. Export them all:

scripts/backup-crs.sh export gryvia-backup.yaml

Restore with scripts/backup-crs.sh restore gryvia-backup.yaml (it is kubectl apply -f; status fields are recomputed by the operators). The export strips resourceVersion, uid, status and the other fields the API server owns, because a plain kubectl get -o yaml dump cannot re-create a deleted object (the API server rejects a resourceVersion on create). It contains no namespaces, Secrets or CRDs: back up the gryvia-api-key Secret if you generated a random key, and apply the CRDs first on a new cluster. The round trip (export, delete, restore, compare) is part of the automated upgrade test.

Troubleshooting​

SymptomWhat to check
Pods stuck in ImagePullBackOffThe images are pulled from global.imageRegistry (default ghcr.io/zyvorai). Check the tag exists, or set imagePullSecrets for a private mirror.
Dashboard shows "Wrong username or password."Sign in as admin with the API key. Read a generated key with kubectl -n gryvia-system get secret gryvia-api-key -o jsonpath='{.data.GRYVIA_API_KEY}' | base64 -d.
"Too many sign-in attempts"Sign-in is limited to 10 per minute per client address. Wait a minute.
Browser certificate warningExpected with the default self-signed certificate. See Authentication and TLS to use your own.
A page says "Gryvia was updated"A new version was deployed while the tab was open. Reload.
Nodes show phase Failed with "node not found"The GryviaGpuNode names a Kubernetes node that does not exist (the kind demo data is fictional). Register real nodes.
GPU or network pages say no source is connectedThey need the collectors and operators that feed them (DCGM exporter, network-intelligence, security operator). The page names what is missing.
A job stays Pendingkubectl -n <ns> describe gryviaaijob <name> shows the scheduling reason, for example no node with the requested GPU type or a quota limit.
Operators restart or lose leadershipkubectl -n gryvia-system logs deploy/gryvia-gpu-operator (and -ai-, -quota-). Leader election uses leases in gryvia-system.

Collect logs for a bug report with kubectl -n gryvia-system logs -l app=gryvia-api-gateway --tail=200 and the operator deployments above; remove secrets before sharing.