Skip to content
All blog posts

Concept and method · Blog

Kubernetes Penetration Testing - Do your Kubernetes controls actually block anything?

The presence of a NetworkPolicy object does not show that traffic is separated, and a visible Pod Security label does not show that a request is blocked. This playbook sets out end to end a Kubernetes penetration testing method whose premise is that every test turns a declaration into a verified decision: safe test levels, the evidence model, a thirteen-phase testing flow, attack path scenarios, rating and rollback.

The most common mistake in Kubernetes security testing is confusing seeing that a control exists with proving that it works. A NetworkPolicy object is present; but does it actually separate traffic? A Pod Security label is visible; but is it enforce, or only warn? An admission webhook is configured; but when it is unreachable, does it reject the request, or quietly accept it?

This playbook rests on a single principle: the job of every test is to turn a declaration into a verified decision. Seeing a label, a policy or a webhook is only the first piece of evidence; the real evidence is a demonstration that the decision is actually applied to a safe test object. What follows sets out how to test each link in the path from a low-privilege starting point to cluster-wide impact, from discovery through identity and authorization, from admission to node security.


1. The purpose of the test: which questions must be answered with evidence?

By the end of the assessment, each of these questions must be answerable with evidence rather than assumption. As a researcher, these questions drive your test:

  • Who can reach the cluster, from where, and with which identity?
  • What can a compromised low-privilege identity actually do?
  • Can a breach in one namespace move to other namespaces, the control plane or a node?
  • When an unsafe workload is submitted, which layer stops it?
  • Through which paths can secrets and tokens be exposed?
  • Are network policies merely defined, or do they actually separate traffic?
  • Can an untrusted image be run?
  • Is suspicious behavior detected and turned into a meaningful alert?
  • Can everything created during the test be fully reversed?

Frame every finding by the answer it gives to one of these questions.


2. Method first: the safe testing model

You have to settle how you will test before you settle what you will test. The reputation of offensive security is not measured by how far you can go, but by your ability to stop where you should.

2.1 Test levels (S0–S4)

Every activity sits at a level according to the risk it poses to production. Agree the highest level your scope permits, in writing, up front.

Level Approach Example activity Production risk
S0 Document and architecture review Data flow, responsibility, policy design None
S1 Read-only discovery Inventory, RBAC resolution, manifest review Very low
S2 Isolated, reversible verification Test namespace, synthetic workload, canary secret, traffic matrix Low
S3 Controlled advanced verification Separate node pool, manifests carrying host access risk, admission bypass attempts Medium to high
S4 Destructive / resilience testing Resource exhaustion, node/pod disruption High

S3 and S4 are not part of the default scope. Reading real secrets in production, collecting real tokens, establishing persistence, making changes on a host and consuming resources without control are not done.

2.2 The “stop at the first safe evidence” rule

You do not have to exploit a chain to the end to show its risk. The lowest-impact evidence available is enough:

  • For secret access: reading a pre-placed canary value rather than the real one.
  • For command execution: showing only the identity and runtime context (at the whoami level).
  • For host access: confirming the presence of an approved, harmless canary file rather than reading file contents.
  • For network access: receiving a fixed response from a test endpoint rather than application data.
  • For privilege escalation: confirming the API decision with a server-side dry run or a temporary scope, rather than creating a durable administrative binding.

The chain stops the moment the evidence exists. Having obtained access is not permission to read more data.

2.3 Stop conditions

Testing stops and the relevant parties are notified if any of the following appears: unexpected restarts, latency or error rates in a production workload; an accidental write outside the test namespace; contact with real business data or a production token; a security control mistaking test traffic for a real attack and starting automated response; a rollback step failing; any possibility of moving into an out-of-scope system.

2.4 The test namespace standard

Use a separate, time-boxed namespace for every check that requires writing. It must carry at least: a unique engagement identifier, a responsible owner, an automatic expiry, a non-production data label, a default-deny network policy, a resource quota and the most restrictive Pod Security profile.

Evaluate a manifest that is expected to be blocked with a dry run first. Create it for real only if the dry run does not produce sufficient evidence and S2/S3 approval exists.


3. The evidence model: how do you record a finding?

A screenshot on its own is weak evidence. Fill in this template for every test:

Test ID:
Time (UTC):
Test level (S0–S4):
Test identity / principal:
Request sent or area examined:
Expected safe outcome:
Observed outcome:
Verdict: PASS / FAIL / PARTIAL / BLOCKED / N/A
Evidence summary or digest:
Potential impact:
Rollback step and its verification:

Sensitive values are never written into evidence in plain text: secrets are fully masked, and only the type, resource reference, length and, where needed, a one-way digest are kept. Tokens, certificate private keys and registry credentials never appear in any report.

Verdicts: PASS (safe behavior demonstrated), FAIL (risk safely confirmed), PARTIAL (some layers protect, others only warn), BLOCKED (could not be tested because of permission, access or the test window), N/A (not applicable given the architecture, with a reason). Remember: BLOCKED is not PASS. An area you could not test must stay visible in the report.


4. The end-to-end testing flow

From here on, this is the playbook proper, advancing along trust boundaries. Under each heading you get what is tested, how it is safely verified, the expected safe outcome and the finding criterion together.

Phase 0 Derive the trust boundaries

The map comes before the commands. The goal is not an inventory but a single-page trust boundary diagram that answers “which identity can cross which trust boundary?” Place these onto it: API access paths and management networks; identity providers and group mappings; namespace/tenant boundaries; ingress, egress and service-to-service traffic; node pools; the registry and deployment chain; secret sources and workload identity; the audit, event and alert pipeline; backup components.

This map is the reference that will set the severity of every later finding.

Phase 1 Read-only discovery (S1)

Test ID What is tested How Finding criterion
K8S-DISC-01 Version and scope inventory API version, enabled API groups, node OS and runtime family are recorded; on a managed control plane, provider and customer responsibility are separated Unsupported component, unclear ownership, missing patch process
K8S-DISC-02 Namespaces and ownership For each namespace, the owner, environment class, data class and lifecycle are established; system and application namespaces are separated Unowned namespace, unclear tenant boundary, absent security label
K8S-DISC-03 Workloads and exposure Pod/Deployment/DaemonSet/Service/Ingress are correlated; externally exposed services and DaemonSets running at host level are prioritized External service with unknown owner, unexpected host integration, idle workload
K8S-DISC-04 Sensitive data references Without reading Secret/ConfigMap values, it is established which workload uses them and how (env, volume, image pull, workload identity) Broad sharing, access crossing the namespace boundary, sensitive data held in a ConfigMap

Phase 2 The API and control plane access surface

K8S-API-01 Network access boundary. Measure reachability of the API endpoint from the internet, the corporate network and the workload network separately; confirm that the permitted source networks are genuinely narrowed and that the TLS trust chain is valid. Expected: the API is reachable only from defined management paths. Finding: unnecessary public access, a broad source network, an unverifiable certificate.

K8S-API-02 Anonymous access. Compare the responses unauthenticated requests receive on /api, /apis, version, health and resource endpoints; examine the permissions of system:anonymous and system:unauthenticated. Expected: 401/403 for sensitive resources, and only the minimum health information deliberately exposed. Finding: namespace, pod, log, metric or configuration data obtainable without an identity.

K8S-API-03 TLS and client identity. Assess old protocols, weak cipher suites, expired certificates and the risk of shared client certificate use. Finding: a long-lived or shared administrative certificate, an unmanaged certificate lifecycle.

K8S-API-04 Audit coverage. Confirm that authentication failures, RBAC denials, secret access, exec/attach/port-forward, RBAC changes and admission decisions are recorded; look for logs that are immutable or shipped to a separate trust domain. Finding: a critical event not recorded, or not traceable back to a user.

Phase 3 Authentication and RBAC

Looking at role names is not enough in RBAC; roles, bindings, group membership, aggregated roles and impersonation have to be resolved together.

K8S-RBAC-01 Effective permission matrix. Produce a matrix for at least these principals: read-only user, developer, namespace administrator, deployment automation, operator/controller service account, node identity, emergency administrator, unauthenticated user. The matrix must be at the level of verb × resource × subresource × namespace, and must carry these rows separately: pods/exec, pods/attach, pods/portforward, pods/ephemeralcontainers, secrets, serviceaccounts/token, roles/rolebindings, clusterroles/clusterrolebindings, certificatesigningrequests, nodes/proxy, impersonate, escalate, bind.

K8S-RBAC-02 Wildcard roles. Find rules using * for verbs, resources or API groups; assess whether several low-risk permissions combine to produce high impact. Finding: a wildcard that cannot be explained by a business need.

K8S-RBAC-03 Indirect privilege escalation. The real issue here is the risk of the combination, not of an individual permission:

Permission combination Why is it critical?
Creating a pod + selecting a strong service account A more privileged identity can be used through the pod
Creating a pod + acceptance of hostPath/privileged The node trust boundary can be crossed
Updating a workload An image, command or volume can be injected into an existing pod
Creating a DaemonSet Code can be distributed to every node
Creating a serviceaccounts/token Another workload identity can be impersonated
Creating a RoleBinding + binding a strong role Privileges can be escalated inside the namespace
bind / escalate A role above the current boundary can be produced
impersonate One can act as another user, group or service account
Approving a CSR A new client or node identity can be minted
nodes/proxy Node functions outside API-level RBAC can be reached

How it is safely verified: use only the test namespace and a low-impact, temporary service account; measure whether it would be accepted with a dry run. Do not bind administrative permission durably.

K8S-RBAC-04 Forgotten bindings. Rate of default service account use, bindings pointing at deleted teams, direct user bindings, the expiry and approval mechanism for emergency permissions, and roles granted to system groups by accident.

K8S-RBAC-05 Token lifecycle. Automatic token mounting should be off for pods that do not need it; look for short-lived, audience-bound, rotatable tokens; check that tokens do not leak into logs, env or volumes. Safe verification: only a synthetic service account and a time-boxed token; a real token is never recorded as evidence.

Phase 4 Admission and policy enforcement

K8S-ADM-01 Pod Security profiles. Examine the enforce/warn/audit labels in every application namespace; record whether the profile version is pinned or tracked to latest. Finding: use of audit/warn only, an absent profile, a broad exception.

K8S-ADM-02 Real blocking test. In an isolated namespace, submit minimal manifests carrying each of the following properties separately, and with a dry run first - if you put several violations into a single manifest you cannot tell which control made the decision:

  • privileged: true
  • allowPrivilegeEscalation: true
  • root user
  • host network / PID / IPC
  • hostPath
  • adding dangerous Linux capabilities
  • unconfined seccomp
  • a disallowed image source or a mutable tag

K8S-ADM-03 Fail-open and blind spots. Test these: while the admission component is unreachable, is the request accepted (fail-open) or rejected (fail-closed)? Are there blind spots caused by namespace or object selectors? Does behavior differ between CREATE and UPDATE/PATCH? Does the policy change when a controller object is submitted instead of a pod? Are ephemeral containers and subresources covered? Expected: critical policies behave fail-closed and cover equivalent workload-creation paths consistently.

K8S-ADM-04 Exception management. Every exception must have an owner, a rationale, a narrow scope and an expiry date; expired ones must be retested.

Phase 5 Pod and container security

Look for each control read-only in existing manifests, and also pair it with whether a new violation is blocked at the admission layer.

Test ID Control Safe expectation Finding criterion
K8S-POD-01 Privileged container Forbidden, or a very narrow exception privileged: true in an application workload
K8S-POD-02 User identity Non-root, fixed UID UID 0 or absent runAsNonRoot
K8S-POD-03 Privilege escalation Explicitly disabled allowPrivilegeEscalation on or unset
K8S-POD-04 Linux capabilities All dropped, required ones added individually Broad or dangerous capability
K8S-POD-05 Seccomp Runtime default or an approved profile Unconfined or absent profile
K8S-POD-06 LSM profile (AppArmor/SELinux) A mandatory profile suited to the environment Disabled or uncontrolled profile
K8S-POD-07 Root filesystem Read-only; writable paths on separate volumes Entire root fs writable
K8S-POD-08 Host namespace Off by default hostNetwork/hostPID/hostIPC
K8S-POD-09 HostPath / devices Forbidden by default Node fs/socket/device mount
K8S-POD-10 Proc mount Masked by default Unmasked proc
K8S-POD-11 Service account token Not mounted when unnecessary Automatic token on every pod
K8S-POD-12 Resource limits requests/limits + quota Unbounded CPU/memory/ephemeral storage
K8S-POD-13 Health checks Appropriate startup/readiness/liveness Wrong or missing probe
K8S-POD-14 Image selection Pinned by digest, approved source latest, mutable tag, unknown registry
K8S-POD-15 Ephemeral container Separate permission and audit Broad debug permission, access leaving no trace

The limit of controlled verification: if you have to confirm acceptance of hostPath or privileged, run the test only on a dedicated node pool; do not mount the host root disk, do not read real host files, do not attempt persistence. Access to a pre-prepared, non-sensitive canary path is sufficient evidence.

Phase 6 Secret and configuration security

K8S-SEC-01 Access graph. Derive which user, group, service account or controller can reach which secret; assess the bulk data effect of the list and watch verbs separately; account for the possibility that an identity able to create workloads reaches another service account’s secret indirectly.

K8S-SEC-02 Usage pattern. Confirm that sensitive values are not written into manifests, ConfigMaps, annotations, command arguments or env; examine the file permissions, mount path and log exposure risk of a secret served through a volume.

K8S-SEC-03 At rest and backup. Encryption of the secret in the data store, rotation of the keys, backups carrying at least the same protection, and separation of restore permission from production write permission.

K8S-SEC-04 Canary verification. In S2, create a unique, synthetic canary secret. Only the test workload that is expected to be allowed should be able to read it; reads from another namespace, another service account and a low-privilege user must be denied. The evidence records that the expected match occurred, not the canary value.

Phase 7 Network security and lateral movement

The presence of a policy is not enough; you have to measure the permission matrix. Set up two synthetic pods and a test service that returns a fixed response.

K8S-NET-01 External exposure. Inventory external IPs, node ports, load balancers and ingress paths; for every external endpoint record the owner, data class, authentication, TLS and rate limit state. Pay particular attention to management panels and metric endpoints.

K8S-NET-02 TLS termination. Assess client→ingress and ingress→backend traffic separately. Finding: TLS only on the external leg, with sensitive backend traffic traveling in the clear.

K8S-NET-03 Default deny. For every application namespace, measure these four cases separately and fill in this matrix:

Source → Destination Expectation
Permitted application → permitted service Succeeds
Unlabeled pod in the same namespace → service Denied
Another namespace → service Denied
Application → required DNS Succeeds
Application → undefined external address Denied
Test pod → node management surface Denied

K8S-NET-04 Selector errors. Empty pod/namespace selectors, a pod left unselected because of a wrong label, a feature the plugin does not support, hostNetwork pods falling outside policy, an over-broad allowance for DNS, and IPv6 being forgotten while IPv4 is enforced.

K8S-NET-05 Metadata access. Measure access from workloads to node and infrastructure metadata endpoints only with a synthetic identity and a request that is not permitted. Real role credentials are not obtained and never written into evidence. Expected: denial at the network or identity layer.

Phase 8 Node, kubelet and container runtime

Start with configuration review at S1; perform S3 verification only on a dedicated node.

K8S-NODE-01 Kubelet access. Network reachability of the read-only and main kubelet endpoints, anonymous authentication, webhook auth/authz, client certificate verification, and the authorization behavior of the pods/log/exec/stats endpoints. Expected: anonymous disabled, requests authenticated, authorization through a webhook, network access limited to the necessary components only.

K8S-NODE-02 Node proxy and debug. Who holds nodes/proxy, node debug and ephemeral container permissions? Report that these can produce higher impact than reading a secret; confirm that debug sessions appear in the audit trail with the user’s identity.

K8S-NODE-03 Runtime socket and host mounts. Look in manifests for mounts of the runtime socket, /proc, /sys, /dev, kubelet directories and the host root path; separate necessary system DaemonSets from application workloads. Finding: a socket or broad host directory mount in an application namespace.

K8S-NODE-04 OS hardening. Patch level, minimum packages and services, file permissions, kernel security settings, direct management access, disk encryption, and a dedicated node pool for privileged workloads.

K8S-NODE-05 Node identity and boundary. The node identity holding only the permissions it needs for its own pod and node objects, NodeRestriction-style limits being active, and a node compromise not turning into the ability to list every cluster secret.

Phase 9 Image and software supply chain

K8S-SC-01 Source and immutability. Approved registries only, digest pinning, mutable tag blocking, and the scope of registry credentials.

K8S-SC-02 Vulnerability management. Correlate the running image inventory with package and OS components; prioritize vulnerabilities in workloads that have internet access, run privileged or use sensitive secrets. Look beyond CVSS to reachability and runtime context.

K8S-SC-03 Provenance and signature. It must be possible to trace which pipeline, source revision and build identity produced an image; an unsigned artifact, or one signed by an unexpected identity, must be shown to be rejected at admission, and re-tagging must not bypass the policy.

K8S-SC-04 Deployment identity. The CI/CD principal must not be a cluster-wide administrator; it must be able to write only to its target namespace and the resource types it needs; secret read and workload update permissions must not combine unnecessarily; human and automation identities must be separated.

Phase 10 Persistent storage

K8S-STO-01 Access boundary. PVCs being bound to the right namespace and workload, the same volume not being mountable by an unexpected pod, ReadWriteMany use suiting the data model, and local/hostPath volumes being managed as exceptions.

K8S-STO-02 Encryption and snapshots. Disk, snapshot and backup encryption, snapshot permissions, data persistence after a namespace is deleted, and control of restores across environments.

K8S-STO-03 StorageClass. Default StorageClass settings, reclaim policy, volume expansion, mount options and topology constraints.

Phase 11 Observability and detection

Test the ability to see as thoroughly as you test prevention. Generate events with an isolated test identity and measure the alert chain.

K8S-DET-01 Identity/RBAC events. Failed authentication, a forbidden secret read, a forbidden exec, an attempt to create an RBAC binding and an anonymous resource request are generated; whether each turns into a record and an alert is measured.

K8S-DET-02 Risky workload event. Privileged/hostPath/hostNetwork is attempted with a dry run or a request expected to be blocked. Three outcomes are recorded separately: (1) the API decision, (2) the audit record, (3) the security alert and the time it takes to arrive. A control that only warns while accepting the object counts as PARTIAL, or FAIL depending on its nature.

K8S-DET-03 Runtime behavior. Harmless canary behaviors are used in an S2 test pod (an unexpected child process, an access attempt to a non-sensitive path, a connection to an unexpected test address); it is checked that detection is visible with user, pod, namespace and image context.

K8S-DET-04 Log integrity. Audit logs being shipped to a separate trust domain, workload identities being unable to delete them, clock synchronization allowing correlation, and sensitive values being masked.

Phase 12 Resilience (S4)

Active tests are in S4 scope; in production, configuration review only is the default.

K8S-RES-01 Resource governance. ResourceQuota, LimitRange, pod CPU/memory/ephemeral limits, pod and object count quotas, PriorityClass/preemption design.

K8S-RES-02 Distribution and disruption tolerance. Critical replicas not being concentrated on a single node or zone, PodDisruptionBudget, anti-affinity/topology spread, and controlled node drain behavior.

K8S-RES-03 Autoscaling abuse. A tenant being unable to cause node growth or a cost attack by creating unlimited pods, HPA metrics being closed to manipulation, and maximum scale and budget limits being defined. In an active load test use a synthetic workload, strict quotas, a short duration and automatic expiry; the test must stop automatically if a health threshold is exceeded.

Phase 13 Multi-tenant isolation

A namespace on its own is not counted as a strong security boundary. Create two synthetic tenants and verify this matrix:

Boundary Expected outcome, Tenant A → Tenant B
API resources Listing/reading/patching/deleting denied
Secret Reading denied even when the name is known
Pod exec/log Denied
Service account Use and token creation denied
Network Denied unless explicitly allowed
Storage Volume attachment and snapshot denied
Node Node proxy/debug unavailable
Admission exception One tenant’s label grants no exception to another
Resource One tenant cannot consume another’s capacity

Tenants requiring high trust may need a separate node pool, a separate cluster or additional isolation layers.


5. Attack path verification scenarios

Once you can test findings individually, the real skill is chaining them. The goal is not “compromise” but proving the combined effect of several weaknesses with the least possible intervention.

Scenario 1 From a low-privilege user to a workload identity. (1) The low-privilege test user is confirmed able to create pods. (2) Whether it can select a stronger service account is measured with a dry run. (3) If it can, a synthetic service account that reaches only a canary resource is used. (4) The test stops once canary access is confirmed. Root cause: the pod creation permission, the service account usage boundary and admission failing together.

Scenario 2 From workload creation to the node boundary. (1) Each property - privileged, host namespace, hostPath - is attempted with a separate dry run. (2) If acceptance looks likely, the test is repeated only on a dedicated node against a canary host path. (3) The presence of the canary file is confirmed; no command is run, nothing is modified, no real file is read. (4) The objects are deleted immediately. Root cause: RBAC controlled only pod creation, and neither admission nor node isolation limited the impact.

Scenario 3 From a namespace breach to lateral movement. (1) A synthetic pod in Tenant A is the starting point. (2) Access to Tenant B’s synthetic service and canary secret is attempted. (3) The API and network outcomes are recorded separately. (4) Only canary values are used. Root cause: RBAC and NetworkPolicy are different layers; one of them working does not close the gap in the other.

Scenario 4 From the deployment chain to the cluster. (1) The deployment principal’s permitted namespaces and resources are derived. (2) An unapproved but harmless test image is submitted with a dry run. (3) Rejection by signature/provenance and registry policy is expected. (4) It is confirmed that workload update permission does not extend to secrets, RBAC or system namespaces.

Scenario 5 Admission that exists on paper but does not act. (1) The policy object and its selectors are reviewed read-only. (2) A manifest containing a single violation is submitted with a dry run. (3) If only a warning or audit entry is produced while the request is accepted, the control is not reported as “blocking”. (4) The webhook unreachability scenario is evaluated only in an approved test environment.


6. Rating findings

Assign severity not by technical property alone, but by scoring five dimensions separately:

Dimension Question to ask
Reachability What access does the attacker need beforehand?
Blast radius A single pod, a namespace, a node, the cluster, or a connected system?
Data impact How are confidentiality, integrity and availability affected?
Chainability Is escalation possible in combination with other weaknesses?
Control and detection Is there a preventive control, an alert and a response?

The same technical finding is rated differently depending on context: acceptance of a privileged pod may be high in a narrow test namespace and critical where broad user groups can do it in production. A missing NetworkPolicy is medium on its own, and its impact rises where sensitive services are reachable from every namespace without authentication.


7. Rollback and closure

The test does not end; it ends when the environment is left as clean as it started. Rollback order: (1) stop active test traffic; (2) delete test controllers and workloads; (3) remove test service accounts, roles and bindings; (4) delete canary secrets, ConfigMaps and temporary volumes; (5) remove NetworkPolicies, quotas and the namespace; (6) revoke time-boxed identities and certificates; (7) confirm that no leftover object carries the test label; (8) compare cluster health, pod restart counts and alarm state against the baseline.

A namespace deletion request being accepted does not mean the rollback is complete. Resources held by finalizers, external load balancers, persistent volumes, snapshots and external identity bindings all have to be checked separately.

Closure criteria: every test recorded with a verdict; reproducible yet safe evidence for every FAIL; the reason written down for every BLOCKED; the absence of test resources verified by two independent methods; sensitive evidence masked; an owner and a target date assigned to each finding; short-term compensating measures defined for critical findings; retest criteria written in measurable form.


Closing

The value of a good Kubernetes penetration test does not show in how many commands you ran; it shows in how accurately you modeled the trust boundaries, how safely you proved the real behavior of the controls, and how completely you left the environment as clean as it started.

The most useful report is not a long list of misconfigurations. It is the report that shows under which conditions a low-privilege starting point reaches namespace, node or cluster impact, and where that chain is best stopped. Because in the end what we test is not the existence of a control; it is its decision.


This playbook is the framework of the approach the Red in Pulse team follows in Kubernetes penetration testing engagements: a methodology that models trust boundaries accurately, exercises controls through real attack paths with safe verification discipline, and leaves the environment as clean as it started. If you would like your cluster’s decisions - not merely the existence of its controls - tested with this rigor, you can contact us for a scoping conversation.

Concepts and abbreviations in this article

RBAC (Role-Based Access Control)

The authorization model that uses roles and bindings to control operations available to users and service accounts on Kubernetes API resources.

Admission control

The control stage that validates or mutates an API request before the object is persisted.

Namespace

A logical boundary that separates cluster resources into naming and authorization scopes. It should not be treated as a strong security boundary on its own.

NetworkPolicy

A Kubernetes resource that defines traffic among Pods and external network entities through selectors, IP rules, and ports.

Canary Secret

A harmless, traceable test value created to measure a Secret access path without using real credentials.

// BLOG

Validate Kubernetes controls through safe testing

We can define a controlled engagement by clarifying cluster boundaries, test identities, and priority attack paths together.

Kubernetes Penetration Testing: Measuring the Decision | RinP · Offensive Security