Introduction
TCP NetworkAssertions
This example shows how to write and run a NetworkAssertion that checks TCP connectivity from within a namespace. TCP probes verify that a connection can (or cannot) be established to a given host and port — the correct primitive for testing connectivity to non-HTTP services such as databases, caches, and message brokers.
TCP NetworkAssertion
We create a NetworkAssertion to verify that a TCP connection to the Kubernetes API on port 443 succeeds, and that connections to a non-existent service are blocked:
apiVersion: netchecks.io/v1
kind: NetworkAssertion
metadata:
name: tcp-connectivity
namespace: default
annotations:
description: Assert TCP connectivity to expected services
spec:
schedule: "*/10 * * * *"
rules:
- name: tcp-to-k8s-api
type: tcp
host: kubernetes.default.svc
port: 443
expected: pass
validate:
message: TCP connection to Kubernetes API should succeed.
- name: tcp-to-blocked-port
type: tcp
host: kubernetes.default.svc
port: 9999
timeout: 3
expected: fail
validate:
message: TCP connection to non-listening port should fail.
Parameters
| Parameter | Description | Default |
|---|---|---|
host | Hostname or IP address to connect to | (required) |
port | TCP port number | (required) |
timeout | Connection timeout in seconds | 5 |
expected | Whether the check should pass or fail | pass |
Boundary Protection Example
TCP probes are ideal for verifying network segmentation and boundary protection. For example, asserting that a web tier cannot directly reach a database:
apiVersion: netchecks.io/v1
kind: NetworkAssertion
metadata:
name: boundary-protection
namespace: production
annotations:
description: Verify network segmentation between tiers
spec:
schedule: "@hourly"
rules:
- name: api-reachable
type: tcp
host: api.backend
port: 8080
expected: pass
validate:
message: Web tier should reach the API tier.
- name: database-blocked
type: tcp
host: postgres.database
port: 5432
expected: fail
validate:
message: Web tier must not directly access database tier.
Custom Validation Rules
You can write custom CEL validation rules to inspect the probe result data:
- name: tcp-with-custom-rule
type: tcp
host: my-service.default.svc
port: 8080
validate:
pattern: "data.connected == true && data.error == null"
message: TCP connection should succeed with no errors.
The data object contains:
connected(bool) — whether the TCP connection was establishederror(string or null) — error message if the connection failedstartTimestamp— ISO 8601 timestamp when the check beganendTimestamp— ISO 8601 timestamp when the check completed
Policy Report
After the NetworkAssertion has been applied, a PolicyReport will be created with the results. An example PolicyReport for a TCP check:
apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
name: tcp-connectivity
namespace: default
results:
- category: tcp
message: Rule from tcp-to-k8s-api
policy: tcp-to-k8s-api
properties:
data: >-
{"startTimestamp": "2024-01-15T10:30:00.123456",
"connected": true, "error": null,
"endTimestamp": "2024-01-15T10:30:00.234567"}
spec: >-
{"type": "tcp", "host": "kubernetes.default.svc",
"port": 443, "timeout": 5}
result: pass
source: netcheck
summary:
pass: 1