Continuous Kubernetes compliance flow diagram showing admission-time policy enforcement with OPA/Kyverno, continuous CIS and Prowler scanning, and an immutable audit trail mapped to SOC 2, PCI DSS, and CIS controls

SOC 2 Compliance for Kubernetes: Controls, Evidence, and Automation (2026)

SOC 2, PCI DSS, and CIS Kubernetes compliance fail when treated as a yearly snapshot. Learn how to run continuous compliance as a stream — enforce policy at admission with OPA/Kyverno, scan continuously, and keep an immutable audit trail — so audits become an export, not an expedition.

Every team that runs production on Kubernetes eventually meets the same painful ritual: an auditor sends a 200-line evidence request, and three engineers spend two weeks taking screenshots of RBAC bindings, exporting kubectl output, and reconstructing who touched the payments namespace last quarter. That is the point-in-time audit scramble — and it is the single biggest reason Kubernetes compliance (SOC 2, PCI DSS, and CIS alike) feels like a tax instead of a control.

It does not have to work that way. The frameworks you are chasing were never designed to be satisfied once a year. SOC 2 asks whether your controls operate continuously across the audit period. CIS Kubernetes Benchmark controls describe a cluster's steady-state configuration. PCI DSS 4.0 explicitly pushes toward continuous validation. The mismatch is not the standard — it is that most teams implement compliance as a snapshot. This article shows how to flip it: treat kubernetes compliance and SOC 2 as a stream, enforced at admission, scanned continuously, and backed by an immutable audit trail — so the audit becomes an export, not an expedition.

Point-in-Time vs. Continuous Compliance: Why the Snapshot Fails

The traditional model collects evidence right before the audit window closes. It fails for a structural reason: Kubernetes is a control loop. Deployments roll, HPAs scale, new namespaces appear, an engineer patches a securityContext under incident pressure at 2 a.m. By the time the auditor reads your evidence, the cluster has drifted away from it. Industry data has long put the average time to detect a security gap in the hundreds of days — a window in which a non-compliant pod can run unnoticed across an entire audit period.

Continuous compliance closes that gap by moving the control to where the change happens:

  • Prevent at admission. A non-compliant workload never reaches etcd. The admission controller rejects it.
  • Detect continuously. Scheduled scans catch drift in already-running resources and in the cloud account underneath the cluster.
  • Prove with an audit trail. Every API write, every terminal command, every policy decision is logged immutably, so evidence is queried, not manufactured.

The CNCF ecosystem already gives you the primitives for all three: Pod Security Admission built into the API server, policy engines like Kyverno and OPA Gatekeeper, the native Kubernetes audit log, and benchmark scanners mapped to the CIS Kubernetes Benchmark. The hard part is not any single tool — it is wiring them into one continuous loop and keeping the evidence coherent across clusters. That orchestration layer is exactly where a platform earns its keep.

Map the Framework to a Control, Not a Vibe

Auditors do not accept "we use Kyverno" as evidence. They accept "control CC6.1 is enforced by policy X, which blocks Y, and here is the log proving it blocked Y 47 times this quarter." So start by mapping each framework requirement to a concrete, enforceable Kubernetes control.

Framework RequirementKubernetes ControlEnforced By
SOC 2 CC6.1 (logical access / least privilege)No wildcard ClusterRoles; namespaced RBAC; no cluster-admin to humansRBAC + admission policy
SOC 2 CC6.6 / CC7.2 (boundary protection, monitoring)Default-deny NetworkPolicy; continuous scan + alertingNetworkPolicy + scanner
PCI DSS Req 2 (secure configuration)Drop ALL capabilities; runAsNonRoot; read-only root FSPod Security Admission / Kyverno
PCI DSS Req 7 & 10 (need-to-know, audit trail)Namespace isolation for CDE; immutable API + terminal audit logsRBAC + audit logging
CIS 5.2 (Pod Security Standards)Enforce restricted profile; no privileged pods; no hostPathPod Security Admission
CIS 5.7 (no plaintext secrets in env)Secrets mounted from a manager, never inline envKyverno + External Secrets

The columns on the right are the work. The PCI DSS control language itself is published by the PCI Security Standards Council — read the actual requirement, then encode it. Below, we encode three of these as real, deployable policy-as-code.

From scramble to stream. Writing these policies is straightforward; keeping them enforced consistently across every cluster, scanning continuously for drift, and producing the evidence an auditor will actually accept is the hard part. Atmosly Guardrails applies OPA/Kyverno policy enforcement, continuous vulnerability and security scanning, RBAC, and audit logging as one layer — so compliance runs as a stream, not an annual fire drill. Create a free Atmosly account and connect a cluster to see your current posture against CIS, SOC 2, and PCI in minutes.

See which SOC 2 controls your cluster fails — before the auditor does.

One-click, read-only scan mapped to SOC 2 and CIS. Free tier.

Scan your cluster →

Before wiring up enforcement, it helps to see the whole mapping in one place. The table below is the skeleton of a SOC 2 evidence program on Kubernetes: each Common Criteria item, the cluster control that satisfies it, and the artifact an auditor will accept as proof.

SOC 2 criterionKubernetes controlEvidence artifact
CC6.1 — Logical access securityRBAC least-privilege Roles, OIDC/SSO for kubectlRBAC manifests in Git + periodic access-review export
CC6.2 — Registration & deprovisioningNamespace-scoped bindings with expiry; no standing cluster-adminBinding create/expire history
CC6.3 — Access modificationRBAC changes via reviewed pull requests (GitOps)PR approval history + audit events at RequestResponse level
CC6.6 — Network segmentationDefault-deny NetworkPolicy per namespace with explicit allowsPolicy manifests + passing scan for the control
CC6.7 — Transmission securityTLS at ingress, mTLS between services where in scopeIngress/mesh configuration + certificate inventory
CC6.8 — Unauthorized softwareAdmission policy (Kyverno/Gatekeeper) + restricted Pod Security profilePolicy reports showing blocked violations
CC7.1 — Detection of misconfigurationsScheduled cluster posture scansDated scan reports with pass/fail per control
CC7.2 — Anomaly monitoringAPI audit logging + alerts on secret access, RBAC writes, execFired-alert and investigation records
CC8.1 — Change managementGitOps reconciliation; no manual kubectl to prodMerge history correlated with deploy records
A1.2 — Availability commitmentsResourceQuotas, PodDisruptionBudgets, tested backupsRestore-test records + quota manifests

Enforce at Admission: Policy as Code with Kyverno

Admission control is the most valuable place to spend compliance effort because it is preventive — a violation is never created, so there is nothing to remediate and nothing to explain to the auditor. Here is a production-grade Kyverno policy that enforces the security context controls behind PCI DSS Req 2 and CIS 5.2 for a payments service. Note it runs in Enforce mode (it blocks), excludes platform namespaces, and carries the control mapping in annotations so the policy is its own evidence.

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-hardened-securitycontext
  annotations:
    policies.kyverno.io/title: Hardened Security Context
    compliance.atmosly.io/controls: "CIS-5.2.x, PCI-DSS-2, SOC2-CC6.1"
spec:
  validationFailureAction: Enforce
  background: true
  rules:
    - name: block-privileged-and-root
      match:
        any:
          - resources:
              kinds: ["Pod"]
              namespaces: ["payments", "ledger", "prod-*"]
      validate:
        message: >-
          Pods in regulated namespaces must run as non-root, drop ALL
          capabilities, and disable privilege escalation (CIS 5.2 / PCI Req 2).
        pattern:
          spec:
            =(securityContext):
              runAsNonRoot: true
            containers:
              - securityContext:
                  privileged: "false"
                  allowPrivilegeEscalation: false
                  readOnlyRootFilesystem: true
                  capabilities:
                    drop: ["ALL"]

Pair this with the API-server-native Pod Security Admission controller set to the restricted profile as a defense-in-depth backstop. PSA gives you a baseline even if a policy engine pod is unhealthy; Kyverno gives you the granular, namespace-aware rules an auditor wants to see mapped to specific controls. On Kubernetes 1.33+, both are first-class — and crucially, neither relies on the long-removed PodSecurityPolicy API, which auditors in 2026 will flag if they see it in your runbooks.

Secrets: the control everyone fails on first

The most common PCI and SOC 2 finding in Kubernetes is secrets passed as plaintext environment variables. Block it at admission and you remove an entire class of findings:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-secret-env-vars
  annotations:
    compliance.atmosly.io/controls: "PCI-DSS-3, CIS-5.7, SOC2-CC6.1"
spec:
  validationFailureAction: Enforce
  rules:
    - name: no-secretkeyref-in-env
      match:
        any:
          - resources: { kinds: ["Pod"], namespaces: ["payments", "ledger"] }
      validate:
        message: "Inject secrets via mounted volumes from a secret manager, not env vars."
        foreach:
          - list: "request.object.spec.containers"
            deny:
              conditions:
                any:
                  - key: "{{ element.env[].valueFrom.secretKeyRef || `[]` | length(@) }}"
                    operator: GreaterThan
                    value: 0

Detect Continuously: Scan the Cluster and the Cloud Beneath It

Admission control stops new violations. Continuous scanning catches the rest: resources that predate your policies, drift introduced by a break-glass change, and — critically — misconfiguration in the cloud account that hosts the cluster. SOC 2 and PCI scope does not stop at the API server; an over-permissive IAM role or a public S3 bucket holding cardholder data is just as much a finding as a privileged pod.

Two complementary scan surfaces cover this:

  • Kubernetes posture. Benchmark scanners evaluate live cluster state against the CIS Kubernetes Benchmark, NSA/CISA hardening guidance, and MITRE ATT&CK for Kubernetes, producing a pass/fail control summary with a compliance score. Atmosly runs Kubescape-based scans against frameworks including CIS to score posture and surface specific failed controls with remediation.
  • Cloud account posture. For the AWS substrate, Atmosly runs Prowler security scans mapping account configuration to PCI-DSS, SOC 2, ISO 27001, HIPAA, and CIS — catching the IAM, S3, RDS, and EKS-CIS findings that live below Kubernetes.

A useful pattern is to run a fast, scriptable CIS check in CI for early signal, then rely on the platform's scheduled cluster-wide scans for the authoritative, historical record:

# Pre-merge sanity check against the CIS Kubernetes Benchmark
kube-bench run --targets node,policies \
  --json | jq '.Controls[].tests[].results[]
    | select(.status=="FAIL")
    | {id: .test_number, desc: .test_desc, remediation: .remediation}'

# Continuous, historical posture is owned by the platform scan,
# which stores results per-scan so you can prove trend over the audit period.

The output of a one-off kube-bench run is a screenshot; the output of a scheduled platform scan with retained history is evidence of a continuously operating control — which is precisely what a SOC 2 Type II auditor is testing for.

Prove It: RBAC, Network Policy, and the Audit Trail

Enforcement and scanning generate the controls; the audit trail makes them defensible. Three pillars carry most of the SOC 2 and PCI evidence burden.

Least-privilege RBAC (SOC 2 CC6.1, PCI Req 7)

No human should hold cluster-admin, and no Role should use wildcards in regulated namespaces. Define narrow, purpose-built roles and review them as code. For a deep, example-driven treatment of role design, our Kubernetes RBAC authorization guide walks through least-privilege patterns; the compliance-relevant rule is simply that every binding is reviewable and attributable:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: payments
  name: payments-deployer
rules:
  - apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get", "list", "watch", "update", "patch"]
  # Deliberately NO "*" verbs, NO secrets read, NO pods/exec.

Default-deny networking (SOC 2 CC6.6, PCI Req 1)

A cardholder-data namespace should reject all traffic it has not explicitly allowed. Pair the enforced restricted Pod Security profile (see our guide on implementing Pod Security Standards) with a default-deny NetworkPolicy so segmentation is provable, not aspirational.

Immutable audit logging (SOC 2 CC7.2, PCI Req 10)

PCI Req 10 and SOC 2 CC7.2 both demand a tamper-evident record of who did what. Configure the Kubernetes API server's audit policy to capture metadata for every write and request bodies for sensitive verbs:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  # Full request+response for secret and RBAC changes in regulated namespaces
  - level: RequestResponse
    namespaces: ["payments", "ledger"]
    resources:
      - group: ""
        resources: ["secrets"]
      - group: "rbac.authorization.k8s.io"
        resources: ["roles", "rolebindings", "clusterrolebindings"]
  # Metadata for everything else that writes
  - level: Metadata
    verbs: ["create", "update", "patch", "delete"]
  - level: None  # drop the noise: reads of non-sensitive resources
    verbs: ["get", "list", "watch"]

The API audit log covers the control plane. Human access through a terminal is the other half — and the half auditors probe hardest, because kubectl exec into a payments pod is direct access to regulated data. Atmosly's secure web terminal enforces dual-layer RBAC before access and records every command with user attribution and timestamps, giving you the "who ran what, where, and when" trail that closes the PCI Req 10 and SOC 2 CC7.2 evidence gap without manual collection.

What the SOC 2 Framework Scan Checks for You

Most of the technical half of that mapping table is machine-verifiable, which means the recurring evidence a Type II period demands does not have to be assembled by hand. In Atmosly, the one-click security scan includes a dedicated SOC 2 framework view covering roughly 64 machine-checkable controls mapped to the Common Criteria — access configuration, workload security context, segmentation, logging posture. What that yields for the audit file:

  • Failures with field paths. Each failed control names the affected Kind, name, namespace, and the exact manifest field to change.
  • Guided fixes, human in the loop. AI analysis generates the verify-and-fix commands, pre-loaded into an audited, namespace-scoped terminal where an engineer reviews and runs them.
  • Evidence as a by-product. The re-scan that confirms the fix is itself the dated before/after pair CC7.1 and CC7.2 ask for — run it quarterly, export the reports, and the evidence file builds itself.

Two structural features close the criteria that scans alone cannot:

  • RBAC that expires by construction. Roles created through the platform carry automatic expiry (30 days by default, enforced by a reaper), so CC6.2's deprovisioning requirement is met structurally rather than by quarterly cleanup.
  • A platform audit trail. Every action — scans, remediation commands, role changes — lands in a trail with actor and timestamp, complementing the API server's own audit log.

Scope honesty, as always: this covers configuration and compliance posture, not image CVEs or runtime detection — pair Trivy and Falco for those layers, per the fuller stack in our 50-practice security checklist. And where SOC 2 sits among the other frameworks your clusters may face is mapped in our Kubernetes compliance guide.

Wiring It Into a 2026 Platform: GitOps, IDPs, and AIOps

None of this should live in a wiki of manual steps. In a 2026 platform-engineering model, your policies, RBAC, NetworkPolicies, and audit config are version-controlled and reconciled through GitOps — the policy library is reviewed in pull requests, and the cluster's live state is continuously driven back to the approved baseline. That reconciliation loop is a continuous compliance control: drift is corrected automatically and the Git history is itself change-management evidence.

Layer on AIOps and the loop tightens further: continuous health and security monitoring surfaces a failing control or a risky misconfiguration in near real time, with root-cause context, instead of waiting for the next quarterly scan. The point of an integrated Kubernetes security and compliance platform is to collapse the five tools above — admission policy, PSA, RBAC, scanning, and audit logging — into a single pane where the evidence is already correlated by cluster, namespace, and workload. That is what turns "we passed the audit" into "we are always in a passable state."

A practical note on scope: a platform like Atmosly supports your continuous controls and audit-readiness — it enforces policy, scans against CIS/SOC 2/PCI mappings, and keeps the trail. It does not, by itself, make you "SOC 2 certified"; certification is an attestation issued by an auditor against controls you operate. What the platform does is make those controls operate continuously and make the evidence trivial to produce. For the broader cloud-account view, our overview of cloud security compliance and industry regulations connects the cluster-level controls here to account-level posture.

A 30-Day Path from Scramble to Stream

  1. Week 1 — Map. Translate your in-scope SOC 2 / PCI / CIS controls into the table above. Pick the regulated namespaces (CDE) explicitly.
  2. Week 2 — Enforce. Deploy Pod Security Admission (restricted) and Kyverno policies in Audit mode first, then flip the critical ones to Enforce. Roll out RBAC and default-deny NetworkPolicies.
  3. Week 3 — Scan. Turn on scheduled cluster scans (CIS) and cloud-account scans (Prowler mappings). Triage and fix the failing controls; let the score climb.
  4. Week 4 — Prove. Enable API audit logging and terminal command auditing with retention that covers your audit period. Wire alerts on policy denials and new critical findings.

At the end of the month, the auditor's evidence request stops being a scramble. It becomes a query against a system that has been enforcing, scanning, and logging the whole time. That is the difference between kubernetes compliance and SOC 2 as a project and as a property of your platform.

Conclusion

SOC 2, PCI DSS, and the CIS Kubernetes Benchmark are not asking you to take better screenshots. They are asking you to operate controls continuously — and Kubernetes, as a reconciliation engine, is built to do exactly that. Enforce at admission with policy as code, scan the cluster and the cloud beneath it on a schedule, keep an immutable RBAC-and-audit trail, and reconcile it all through GitOps. Do that, and compliance stops being a periodic scramble and becomes a stream you can prove on demand. Start free with Atmosly and turn your next audit into an export.

Frequently Asked Questions

What does SOC 2 compliance mean for Kubernetes?
SOC 2 is an attestation over the Trust Services Criteria — most commonly the Security Common Criteria — that customers request from vendors. For Kubernetes it means mapping criteria like CC6.1 (access), CC6.6 (segmentation), CC7.2 (monitoring), and CC8.1 (change management) to concrete cluster controls and producing dated evidence they operated throughout the audit period.
What is the difference between SOC 2 Type I and Type II for a Kubernetes platform?
A Type I report attests that controls were designed and in place at a point in time; a Type II report attests they operated effectively over a period, typically 6–12 months. Type II is what enterprise customers usually demand, and it is why point-in-time screenshots fail — you need recurring, dated checks across the whole period.
Which Kubernetes controls map to SOC 2 Common Criteria?
The core set: RBAC least privilege with no standing cluster-admin (CC6.1–CC6.3), default-deny NetworkPolicies (CC6.6), TLS/mTLS for data in transit (CC6.7), admission policy plus restricted Pod Security (CC6.8), scheduled posture scans (CC7.1), API audit logging with alerts (CC7.2), and GitOps change management (CC8.1).
What evidence do SOC 2 auditors accept for Kubernetes controls?
Auditors want dated, attributable artifacts: RBAC manifests and access-review exports, NetworkPolicy manifests with passing scans, admission policy reports showing blocked violations, scan reports across the period, audit-log retention, fired-alert investigation records, and PR history correlated with deployments.
Does running on EKS make us SOC 2 compliant?
No. AWS's certification covers the infrastructure AWS operates — the control plane and hosts. Everything you configure — audit logging (off by default on EKS), RBAC, network policy, pod security, secrets encryption — is on your side of the shared responsibility model and is exactly what your own SOC 2 audit examines.
How does policy as code help with SOC 2 on Kubernetes?
Admission control with policy as code (Kyverno or OPA Gatekeeper) blocks non-compliant workloads before they exist — no privileged pods, no unapproved registries, mandatory security contexts. It converts controls from documents into enforced platform behavior, and the policy reports double as CC6.8 evidence.
How often should compliance scans run for a SOC 2 Type II period?
Quarterly is the working minimum, because Type II covers a period and each dated scan becomes evidence for its slice of it. Add scans after cluster upgrades, RBAC changes, and major workload rollouts — the events most likely to silently break a control mid-period.
What role do Kubernetes audit logs play in SOC 2?
API audit logs are the primary CC7.2 artifact: a tamper-evident record of who accessed what, when, with alerts on sensitive events like secret reads and RBAC writes. They must be enabled (off by default on EKS), shipped to durable storage, and retained across the audit period — an expired log is a gap in the evidence.
What is the most common SOC 2 finding in Kubernetes environments?
Standing privileged access — cluster-admin bindings that accumulate and never expire — which fails the access criteria the moment an auditor samples them. Time-boxed, namespace-scoped roles with automatic expiry close it structurally: deprovisioning happens by construction instead of by quarterly cleanup.
How much of SOC 2 can be checked automatically on Kubernetes?
Roughly 60–70% of the technical criteria are machine-verifiable from cluster state — access configuration, segmentation, workload security, logging posture. The remainder is organizational: risk assessments, vendor management, HR controls, and incident-response process live outside the cluster no matter the tooling.
How does GitOps satisfy SOC 2 change management?
GitOps turns CC8.1 change management into a by-product of operating: every change to policies, RBAC, and workloads is a reviewed pull request, the reconciler applies only what is merged, and the merge history correlated with deploy records is the change-management evidence itself — no manual kubectl trail to reconstruct.
How do we prepare for a first SOC 2 audit on Kubernetes?
Treat the report date as the end of a period, not a deadline for a project: enable audit logging and admission policy now, scan and remediate on a cadence, and file each dated artifact as it is produced. Teams that operate this loop walk into the audit with the evidence already collected — the audit becomes an export.