Workload annotations

Every pod annotation the c8s admission webhook reads — the opt-in, certificate and SAN overrides, secret and volume requests, nginx reload, and discovery output — plus the container, volume, and RuntimeClass names c8s reserves.

The c8s admission webhook reads these annotations off a pod template and injects accordingly. All of them are namespaced confidential.ai/. Only the first is required; setting any other without it is rejected at admission.

Opt in

AnnotationDefaultEffect
confidential.ai/cw— (required)The workload id, not a boolean. Opts the pod into injection, is mirrored as a pod label so the operator-managed headless Service can select it, and derives the Service name c8s-<value> and the certificate SAN c8s-<value>.<namespace>.svc.
confidential.ai/c8s-injectedStamped by the webhook after a successful mutation so re-invocation is a no-op. Do not set it yourself.

The value is an identity, not a flag.

confidential.ai/cw: my-inference yields the Service c8s-my-inference, which is what tls-lb dials over the RA-TLS mesh. A value like "true" would only produce a Service named c8s-true. Use a stable name that is a valid DNS-1035 label once prefixed with c8s-; an id that cannot form one yields no Service at all.

Certificate

The injected c8s-cert sidecar writes the pod's mesh leaf. These override where and how.

AnnotationDefaultEffect
confidential.ai/c8s-sanderived from the cw idOverride the DNS SAN get-cert requests. For workloads adopted into c8s whose clients already dial an existing Service name.
confidential.ai/c8s-cert-volumec8s-certsName of the volume the cert is written to.
confidential.ai/c8s-cert-dir/etc/c8s/certsDirectory the cert and key land in.
confidential.ai/c8s-cert-filetls.crtCertificate filename.
confidential.ai/c8s-key-filetls.keyPrivate-key filename.
confidential.ai/c8s-renew-interval6hRenewal interval for the issued certificate. A Go duration.

Secrets and volumes

AnnotationDefaultEffect
confidential.ai/c8s-secretsComma-separated NAME=/store/path pairs. Injects the c8s-secret fetcher sidecar and the c8s-secrets volume. See Use application secrets.
confidential.ai/c8s-secret-dir/run/c8s/secretsWhere the secret files land.
confidential.ai/c8s-volumesComma-separated NAME=/store/path pairs. NAME selects the node device by its c8s-vol-<NAME> serial. Injects the c8s-volume sidecar. See Create an encrypted volume.
confidential.ai/c8s-volume-dir/run/c8s/volumesWhere opened volumes are mounted, one directory each.

Both are rejected at admission under Pod-as-CVM — the node-side machinery they need does not exist inside a per-pod guest.

nginx reload

For a workload that must be signalled when its certificate is renewed.

AnnotationDefaultEffect
confidential.ai/c8s-reload-nginxfalseReload nginx after a certificate is written.
confidential.ai/c8s-reload-watch-pathsAdditional paths to watch for change.
confidential.ai/c8s-reload-watch-volumeVolume holding the watched paths.
confidential.ai/c8s-reload-watch-mount-pathWhere that volume is mounted.

Discovery output

For a pod that publishes its own attestation discovery document.

AnnotationDefaultEffect
confidential.ai/c8s-discovery-outPath the discovery document is written to.
confidential.ai/c8s-discovery-volumeVolume it is written to.
confidential.ai/c8s-discovery-mount-pathWhere that volume is mounted.
confidential.ai/c8s-discovery-cds-cert-urlURL the document advertises for the CDS certificate.
confidential.ai/c8s-discovery-mesh-ca-urlURL the document advertises for the mesh CA bundle.
confidential.ai/c8s-discovery-public-tls-modecdscds or webpki — which certificate the front door serves publicly.

get-cert process identity

AnnotationDefaultEffect
confidential.ai/c8s-get-cert-run-as-user65532runAsUser for the injected container.
confidential.ai/c8s-get-cert-run-as-group65532runAsGroup.
confidential.ai/c8s-get-cert-run-as-non-roottruerunAsNonRoot.
confidential.ai/c8s-get-cert-verbosefalseVerbose get-cert logging.

The cluster-wide defaults behind these are set at install with the --webhook-get-cert-* flags — see the CLI reference.

Reserved names

A pod that declares any of these itself is rejected at admission. They are reserved because the webhook rebuilds them on every call, so a pre-declared one would either be silently replaced or let a host-authored spec choose where released plaintext lands.

NameKindWhat it is
c8s-certcontainerthe get-cert sidecar that obtains the mesh leaf
c8s-cert-waitcontainerthe gate that blocks the workload until the first cert is written
c8s-secretcontainerthe secret fetcher
c8s-volumecontainerthe encrypted-volume fetcher
c8s-certsvolumedefault destination for the mesh leaf
c8s-secretsvolumememory-backed, mounted read-only into every container
c8s-volume-<NAME>volumeone per requested volume, default-medium emptyDir
c8s-workload-claimsvolumethe admission inventory's socket directory

The c8s-secrets volume must be a memory-backed emptyDir if pre-declared at all; a c8s-volume-<NAME> must be a default-medium emptyDir. A hostPath or PVC in either position is refused — it would write released plaintext to storage the host reads. See Reserved containers and volumes.

RuntimeClasses

Injected under --cvm-mode=pod, selected by the cluster's --hardware-platform and by whether the pod requests an nvidia.com/* resource. These are a fixed contract with the RuntimeClasses the chart installs and with the kata-enforcement policy — a custom class is rejected.

RuntimeClassSelected when
kata-qemu-snpSEV-SNP, no GPU
kata-qemu-snp-nvidiaSEV-SNP, pod requests a GPU
kata-qemu-tdxIntel TDX, no GPU
kata-qemu-tdx-nvidiaIntel TDX, pod requests a GPU
kata-qemuVM-isolated but not confidential

See also