# Customer deployment template. Replace image with your reviewed image digest.
# Existing workloads must move to guard-workloads or receive equivalent policies.
apiVersion: v1
kind: Namespace
metadata:
  name: guard-system
  labels:
    pod-security.kubernetes.io/enforce: restricted
---
apiVersion: v1
kind: Namespace
metadata:
  name: guard-workloads
  labels:
    pod-security.kubernetes.io/enforce: restricted
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: guard-audit
  namespace: guard-system
spec:
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prompt-guard
  namespace: guard-system
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels: { app: prompt-guard }
  template:
    metadata:
      labels: { app: prompt-guard }
    spec:
      automountServiceAccountToken: false
      # Exceeds the gateway's 45-second drain window, avoiding routine SIGKILL.
      terminationGracePeriodSeconds: 90
      securityContext:
        runAsNonRoot: true
        runAsUser: 10001
        runAsGroup: 10001
        fsGroup: 10001
        seccompProfile: { type: RuntimeDefault }
      containers:
        - name: gateway
          image: REPLACE_WITH_YOUR_REGISTRY_IMAGE_AT_SHA256_DIGEST
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            capabilities: { drop: [ALL] }
          ports: [{ containerPort: 8443 }]
          readinessProbe:
            tcpSocket: { port: 8443 }
            initialDelaySeconds: 3
            periodSeconds: 10
          resources:
            requests: { cpu: 100m, memory: 128Mi }
            limits: { cpu: "1", memory: 256Mi }
          env:
            - { name: GUARD_POLICY_FILE, value: /policy/policy.json }
            - { name: GUARD_TLS_KEY_FILE, value: /secrets/tls-key.pem }
            - { name: GUARD_TLS_CERT_FILE, value: /secrets/tls-cert.pem }
            - { name: GUARD_CLIENT_CA_FILE, value: /secrets/client-ca.pem }
            - { name: GUARD_AUDIT_KEY_FILE, value: /secrets/audit-private.pem }
            - { name: GUARD_AUDIT_FILE, value: /audit/events.jsonl }
            - { name: OPENAI_KEY_FILE, value: /secrets/openai.key }
            - { name: ANTHROPIC_KEY_FILE, value: /secrets/anthropic.key }
            - { name: GEMINI_KEY_FILE, value: /secrets/gemini.key }
          volumeMounts:
            - { name: policy, mountPath: /policy, readOnly: true }
            - { name: secrets, mountPath: /secrets, readOnly: true }
            - { name: audit, mountPath: /audit }
      volumes:
        - name: policy
          secret: { secretName: guard-policy, defaultMode: 288 }
        - name: secrets
          secret: { secretName: guard-secrets, defaultMode: 288 }
        - name: audit
          persistentVolumeClaim: { claimName: guard-audit }
---
apiVersion: v1
kind: Service
metadata: { name: prompt-guard, namespace: guard-system }
spec:
  selector: { app: prompt-guard }
  ports: [{ port: 8443, targetPort: 8443 }]
---
# Every workload in this namespace can reach only the gateway and cluster DNS.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: { name: gateway-only-egress, namespace: guard-workloads }
spec:
  podSelector: {}
  policyTypes: [Egress]
  egress:
    - to:
        - namespaceSelector:
            matchLabels: { kubernetes.io/metadata.name: guard-system }
          podSelector:
            matchLabels: { app: prompt-guard }
      ports: [{ protocol: TCP, port: 8443 }]
    - to:
        - namespaceSelector:
            matchLabels: { kubernetes.io/metadata.name: kube-system }
          podSelector:
            matchLabels: { k8s-app: kube-dns }
      ports: [{ protocol: UDP, port: 53 }, { protocol: TCP, port: 53 }]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: { name: gateway-boundary, namespace: guard-system }
spec:
  podSelector: {}
  policyTypes: [Ingress, Egress]
  ingress:
    - from:
        - namespaceSelector:
            matchLabels: { kubernetes.io/metadata.name: guard-workloads }
      ports: [{ protocol: TCP, port: 8443 }]
  egress:
    - to:
        - namespaceSelector:
            matchLabels: { kubernetes.io/metadata.name: kube-system }
          podSelector:
            matchLabels: { k8s-app: kube-dns }
      ports: [{ protocol: UDP, port: 53 }, { protocol: TCP, port: 53 }]
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
              [
                10.0.0.0/8,
                172.16.0.0/12,
                192.168.0.0/16,
                127.0.0.0/8,
                169.254.0.0/16,
              ]
      ports: [{ protocol: TCP, port: 443 }]
