For the complete documentation index, see llms.txt. This page is also available as Markdown.

Using Seal Base Images with Kubernetes and Helm

Use Seal Base Images from Kubernetes manifests and Helm charts.

Kubernetes nodes pull images at pod-launch time, so the authentication and reference patterns from the previous two pages need to live in cluster-side configuration: an imagePullSecret for the credentials, and a FROM-equivalent image reference on each PodSpec. This page covers the manifest snippets and Helm value overrides for the common patterns.

Pre-requisites

Creating the imagePullSecret

The standard Kubernetes pattern for registry credentials is a Secret of type kubernetes.io/dockerconfigjson. Create it once per namespace where the workloads run:

kubectl create secret docker-registry seal-registry \
  --docker-server=<seal-registry> \
  --docker-username=<seal-username> \
  --docker-password=<seal-password> \
  --namespace=<your-namespace>

The secret's name (seal-registry here) is referenced from each PodSpec that pulls a sealed image. Pick a name and stick with it across the cluster; consistency matters more than the specific name.

For multi-namespace clusters, automate the secret distribution. Two common patterns:

  • A controller like Reflector mirrors the secret from a single source namespace to every other namespace that needs it.

  • Your IaC (Helmfile, Argo CD, Flux) provisions the secret as part of the namespace bootstrap.

Either way, the secret in each namespace must hold the same Seal credentials.

Referencing the secret from a PodSpec

The PodSpec lists pull secrets that the kubelet uses when fetching the image. For a Deployment using a sealed base image:

When the application is built on top of a Seal base image (the more common case), the cluster does not see the sealed base image at all: the build flattened it into the application image's layers, and the cluster only pulls the application image from your internal registry. The imagePullSecret in this case is only needed if your application image itself happens to live in Seal's registry, which is unusual.

When the cluster pulls a sealed image directly as a workload (also a valid pattern, especially for stateful images like Elasticsearch, Kafka, or Grafana that you run as-is), the imagePullSecret is what authorizes the pull:

Here the cluster does the pull at pod-launch time, and the imagePullSecret is load-bearing.

ServiceAccount-attached pull secret

For namespaces where most workloads need access to Seal's registry, attaching the pull secret to the namespace's default ServiceAccount removes the need to list it on every PodSpec:

Pods in that namespace that do not specify a serviceAccountName inherit the default ServiceAccount and its attached pull secrets. Pods that specify a different ServiceAccount need that ServiceAccount to also reference the secret.

Helm

For Helm charts you maintain, expose the registry reference and pull secret as values:

For third-party charts that ship with image.repository and image.tag (the convention is near-universal), repointing to a sealed image is a values override:

The base chart stays unmodified; the values file is the single seam where the sealed image enters.

Verifying signatures at admission time

For clusters that enforce signature-based admission policies (Kyverno, Sigstore Policy Controller, Gatekeeper with constraint templates), add a policy that requires Seal's cosign signature on any image pulled from <seal-registry>:

The full policy is registry-product-specific; the snippet above is illustrative. The intent is the same regardless: every pod whose image comes from Seal's registry must carry a valid cosign signature against Seal's published key.

Last updated