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 Requirement | Kubernetes Control | Enforced By |
|---|---|---|
| SOC 2 CC6.1 (logical access / least privilege) | No wildcard ClusterRoles; namespaced RBAC; no cluster-admin to humans | RBAC + admission policy |
| SOC 2 CC6.6 / CC7.2 (boundary protection, monitoring) | Default-deny NetworkPolicy; continuous scan + alerting | NetworkPolicy + scanner |
| PCI DSS Req 2 (secure configuration) | Drop ALL capabilities; runAsNonRoot; read-only root FS | Pod Security Admission / Kyverno |
| PCI DSS Req 7 & 10 (need-to-know, audit trail) | Namespace isolation for CDE; immutable API + terminal audit logs | RBAC + audit logging |
| CIS 5.2 (Pod Security Standards) | Enforce restricted profile; no privileged pods; no hostPath | Pod Security Admission |
| CIS 5.7 (no plaintext secrets in env) | Secrets mounted from a manager, never inline env | Kyverno + 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.
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.
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
- Week 1 — Map. Translate your in-scope SOC 2 / PCI / CIS controls into the table above. Pick the regulated namespaces (CDE) explicitly.
- Week 2 — Enforce. Deploy Pod Security Admission (
restricted) and Kyverno policies inAuditmode first, then flip the critical ones toEnforce. Roll out RBAC and default-deny NetworkPolicies. - 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.
- 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.