mirror of
https://github.com/sredevopsorg/deepseek-kubernetes-sandbox.git
synced 2026-11-03 01:13:24 +00:00
Update AGENT_SANDBOX_VERSION to v1.0.8 and the docs that quote the control-plane pin (example prerequisites, architecture, versioning table, minimal-single-tenant template comment, platform skill). The v1.0.8 release adds only one CRD field, spec.failedPodPolicy (Sandbox and SandboxTemplate, enum Retain|Recreate, default Retain), so the existing manifests keep their behavior: Retain is the default and neither the API version (v1beta1) nor any field we set changed. All five custom resources still validate against the v1.0.8 CRD schemas. Behavior changes in the controller itself (bounded MCP output, router kustomization, creation-latency metric timing) do not affect the platform because it uses neither the sandbox-router nor the MCP server. Co-authored-by: SREDevOpsAgents <agents@sredevops.org>
120 lines
5.2 KiB
YAML
120 lines
5.2 KiB
YAML
# Minimal single-tenant SandboxTemplate for DeepSeek Harness Web.
|
|
#
|
|
# This is the "just one DSH Web" quick-start template. For the full
|
|
# multi-tenant platform (warm pool, per-user claims, gateway, idle-suspend),
|
|
# see examples/dsh-agents-as-a-service/.
|
|
#
|
|
# Claims reference this template directly (spec.sandboxTemplateRef): there is
|
|
# no warm pool and no per-user platform here. See the README for the full
|
|
# quickstart; in short the prerequisites are:
|
|
# - Namespace dsh-demo.
|
|
# - Secret dsh-provider-keys in dsh-demo with key DEEPSEEK_API_KEY
|
|
# (injected via envFrom; the pod starts without it, only model calls fail).
|
|
# - Optional: Secret dsh-provider-keys-extra with additional provider keys
|
|
# (OPENROUTER_API_KEY, GEMINI_API_KEY, NVIDIA_API_KEY, ...). It is
|
|
# referenced with `optional: true`, so it may be absent.
|
|
# The agent-sandbox controller (v1.0.8, API v1beta1) must be installed.
|
|
apiVersion: extensions.agents.x-k8s.io/v1beta1
|
|
kind: SandboxTemplate
|
|
metadata:
|
|
name: dsh-web-template
|
|
namespace: dsh-demo
|
|
spec:
|
|
service: true # headless Service per Sandbox -> stable DNS (status.serviceFQDN)
|
|
# networkPolicyManagement is omitted, so the controller uses its Managed
|
|
# secure default (ingress only from the sandbox-router, public egress). This
|
|
# quickstart reaches the sandbox through `kubectl port-forward`, which is
|
|
# local to the pod. The multi-tenant example documents opt-in policies in
|
|
# examples/dsh-agents-as-a-service/docs/optional-hardening.md.
|
|
podTemplate:
|
|
spec:
|
|
# OPTIONAL: run under gVisor. gVisor breaks `kubectl port-forward`, so
|
|
# this quickstart's only access path will not work; use the multi-tenant
|
|
# gateway example or a Service/NodePort instead.
|
|
# runtimeClassName: gvisor
|
|
#
|
|
# OPTIONAL: pin to a dedicated node pool. Replace the placeholder with a
|
|
# node label; add a matching toleration if the pool is tainted.
|
|
# nodeSelector:
|
|
# dsh.example.com/node-pool: dsh
|
|
securityContext:
|
|
runAsNonRoot: true
|
|
runAsUser: 1000 # Matches the UID of the 'node' user
|
|
runAsGroup: 1000
|
|
fsGroup: 1000
|
|
# DSH's credentials plugin refuses to start when .credentials.yaml has
|
|
# any group/other permission bit (it creates the file 0600). The
|
|
# default kubelet fsGroup policy ("Always") rewrites it to 0660 on every
|
|
# pod start, so a recreated or resumed sandbox crash-loops; OnRootMismatch
|
|
# avoids that walk once the volume root already carries the ownership.
|
|
# Rationale in full at
|
|
# examples/dsh-agents-as-a-service/manifests/10-sandboxtemplate.yaml.
|
|
fsGroupChangePolicy: OnRootMismatch
|
|
containers:
|
|
- name: dsh-web
|
|
image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.3-r4
|
|
imagePullPolicy: IfNotPresent
|
|
ports:
|
|
- name: web
|
|
containerPort: 3080
|
|
envFrom:
|
|
- secretRef:
|
|
name: dsh-provider-keys # Secret with key DEEPSEEK_API_KEY
|
|
# Optional extra provider keys; an absent Secret is safe.
|
|
- secretRef:
|
|
name: dsh-provider-keys-extra
|
|
optional: true
|
|
env:
|
|
# Empty => DSH derives links from the request Host. Keep it empty
|
|
# when fronting the sandbox with a proxy/gateway.
|
|
- name: DSH_PUBLIC_URL
|
|
value: ""
|
|
# DSH Host/Origin-fences /api. Empty trusts only localhost, which
|
|
# is right for `kubectl port-forward`. Set this to the public host
|
|
# (e.g. dsh.example.com) if you front DSH with a proxy or Ingress,
|
|
# so requests forwarded with the browser's Host are accepted. The
|
|
# full example documents both exposure variants in
|
|
# examples/dsh-agents-as-a-service/manifests/exposure/README.md.
|
|
- name: DSH_TRUSTED_HOSTS
|
|
value: ""
|
|
volumeMounts:
|
|
- name: dsh-home
|
|
mountPath: /home/node/.dsh # DSH_HOME
|
|
# / is behind DSH's launch-token cookie (401 without it); use an
|
|
# unauthenticated path for probes. The startup probe gives a cold
|
|
# start (plugin activation on a small node, or the first resume of a
|
|
# suspended sandbox) up to 120s before liveness can restart it.
|
|
startupProbe:
|
|
httpGet:
|
|
path: /favicon.svg
|
|
port: 3080
|
|
periodSeconds: 5
|
|
failureThreshold: 24
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /favicon.svg
|
|
port: 3080
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 5
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /favicon.svg
|
|
port: 3080
|
|
initialDelaySeconds: 15
|
|
periodSeconds: 15
|
|
securityContext:
|
|
allowPrivilegeEscalation: false
|
|
capabilities:
|
|
drop: ["ALL"]
|
|
seccompProfile:
|
|
type: RuntimeDefault
|
|
volumeClaimTemplates:
|
|
- metadata:
|
|
name: dsh-home
|
|
spec:
|
|
accessModes: ["ReadWriteOnce"]
|
|
resources:
|
|
requests:
|
|
storage: 5Gi
|
|
# storageClassName omitted => cluster default
|