If the infrastructure where Deckhouse Kubernetes Platform (DKP) is running has requirements to limit host-to-host network communications, the following conditions must be met:

  • Tunneling mode for traffic between pods is enabled (configuration for CNI Cilium, configuration for CNI Flannel).
  • Traffic between podSubnetCIDR encapsulated within a VXLAN is allowed (if inspection and filtering of traffic within a VXLAN tunnel is performed).
  • If there is integration with external systems (e.g. LDAP, SMTP or other external APIs), it is required to allow network communication with them.
  • Local network communication is fully allowed within each individual cluster node.
  • Inter-node communication is allowed on the ports shown in the tables on the current page. Note that most ports are in the 4200-4299 range. When new platform components are added, they will be assigned ports from this range (if it is possible).

How to check the current VXLAN port...

d8 k -n d8-cni-cilium get cm cilium-config -o yaml | grep tunnel

Example output:

routing-mode: tunnel
tunnel-port: "4298"
tunnel-protocol: vxlan

Changes related to the addition, removal, or reassignment of ports in the tables are listed in the “Network” section of a respective DKP version on the Release notes page.

Requirements for network latency between master nodes

DKP supports HA mode using arbiter nodes. The network latency requirements listed below also apply to arbiter nodes.

Etcd only commits a writing after the change has been replicated to a majority of master nodes. Therefore, the round-trip time (RTT) between master nodes directly determines the cluster’s performance. A single operation in the cluster typically consists of several consecutive writes, so as latency increases, the application of manifests, operator operations, and Kubernetes API responsiveness slow down noticeably.

The sum of RTT and jitter between master nodes must not exceed 100 ms.

Round-trip time (RTT) is specified, not one-way delay: for example, the ping command returns RTT.

Jitter—the variation in latency—is added to the RTT. For example, with an RTT of 90 ms and jitter of 20 ms, the total is 110 ms, and the requirement is not met, even though the RTT value itself is within the 100 ms limit.

When planning a cluster, it is recommended to aim for a latency of no more than 50 ms between future master nodes—that is, a twofold margin relative to the requirement. This margin is necessary for the following reasons:

  • Pre-deployment measurements are performed on an idle network and may underestimate actual values.
  • You need to account for latency spikes and variation, as well as possible infrastructure operations—for example, migrating a virtual machine to a zone with higher latency.

Where does the 100 ms value come from...

DKP uses the standard etcd values:

  • ETCD_HEARTBEAT_INTERVAL — 100 ms, the frequency at which the leader sends heartbeat messages to the other cluster members.
  • ETCD_ELECTION_TIMEOUT — 1000 ms, the timeout for heartbeat messages; after this time, a cluster member begins leader re-election.

The etcd documentation requires that the election timeout be at least 10x RTT. Hence, the maximum allowed value is:

1000 ms / 10 = 100 ms

Potential issues

The main consequence of increased RTT is a proportional slowdown of the cluster. Network latency is directly reflected in write times: with an RTT of 300 ms, each write to etcd will take at least 300 ms. There is no threshold here; performance degrades continuously as latency increases.

The second issue is etcd leader re-elections. These are triggered not by the magnitude of the latency, but by its complete loss: a cluster member initiates an election if it does not receive messages from the leader within the time specified by ETCD_ELECTION_TIMEOUT (taking into account etcd’s built-in randomization mechanism—from 1,000 to 2,000 ms). With a 100-ms heartbeat interval, this corresponds to 10–20 consecutive missed heartbeat messages. Typical causes:

  • A network outage or packet loss lasting 1–2 seconds.
  • Disk write delays on the leader node, preventing etcd from sending heartbeat messages in time.
  • A restart of the etcd process.

Isolated spikes in latency do not trigger re-elections: heartbeat messages arrive, albeit late. Only writes that occur during the spike are delayed.

However, a high RTT makes re-elections protracted when they do occur. Votes are collected within a single RTT and must fit within ETCD_ELECTION_TIMEOUT. If the RTT is close to this timeout, the election does not complete in time and restarts, leaving the cluster leaderless. A tenfold margin is required to ensure the election succeeds on the first attempt.

During leader re-elections, etcd does not process write requests, so the Kubernetes API returns errors. The KubeEtcdHighNumberOfLeaderChanges alert signals frequent leader re-elections—more than three leader re-elections in 10 minutes.

Checking current latencies

Latency and its variation can be measured using ping. The command is run on one of the master nodes, or—when planning the cluster—on the server intended to become a master node. ICMP is sufficient for this check, as it is already included in the requirements for traffic between nodes:

ping -c 100 -i 0.2 <IP address of another master node>

Example of the resulting output:

rtt min/avg/max/mdev = 25.085/25.502/35.933/1.185 ms

Here, avg is the average RTT, mdev is the delay variation (jitter), and max is the actual maximum—that is, the RTT including spikes. There is no need to add the RTT and jitter manually: you should compare the max value against the requirements. When planning a cluster, we recommend staying within 50 ms; for a live cluster, do not exceed 100 ms.

Network latency at the other nodes

The control plane has no requirements regarding network latency on nodes that are not master nodes: latency on these nodes does not affect the cluster’s stability. The only factor that matters is the duration of the loss of communication with master nodes—by default, after 40 seconds, a node enters the Unreachable state, and after 5 minutes, its pods are migrated to other nodes. Both thresholds are configured using the nodeMonitorGracePeriodSeconds and failedNodePodEvictionTimeoutSeconds parameters.

These delays affect the performance of everything running on the nodes—including the platform’s own components. For components that access the Kubernetes API (DKP operators, Prometheus, Ingress controllers), latency to the master nodes is added to every request. Latency between nodes is added to every network request between pods and to DNS lookups, and—when using replicated storage—to the time it takes to write to disk.

Thus, the acceptable value is determined by the requirements of the running workload. For clusters distributed across remote sites, this means that the platform will continue to operate, but application latencies will reflect the geographic distribution of the nodes.

Traffic between master nodes

Port Protocol Purpose
2379, 2380 TCP

etcd replication

4200 TCP

Cluster API webhook handler

4201 TCP

Webhook handler for VMware Cloud Director cloud provider

4223 TCP

Deckhouse controller webhook handler

Traffic from master nodes to regular nodes

Port Protocol Purpose
22 TCP

SSH for static node bootstrapping by the static provider

10250 TCP

kubelet

4221 TCP

bashible apiserver for delivering node configurations

4227 TCP

runtime-audit-engine webhook handler

Traffic from nodes to master nodes

Port Protocol Purpose
4234 UDP

NTP for time synchronization between nodes

6443 TCP

kube-apiserver for controllers working in the node’s host network namespace

4203 TCP

machine-controller-manager metrics

4219 TCP

Proxy for registry packages registry-packages-proxy

4222 TCP

Deckhouse controller metrics

Traffic between nodes

Port Protocol Purpose
ICMP

ICMP for node-to-node connectivity monitoring

4202 TCP

sds-node-configurator node agent metrics

4204 TCP

Deckhouse controller debug

4205 TCP

ebpf-exporter module metrics

4206 TCP

node-exporter module metrics

4207 TCP

ingress-nginx controller metrics for the HostWithFailover inlet

4208 TCP

ingress-nginx controller metrics for the HostWithFailover inlet

4209 TCP

Kubernetes control plane metrics

4210 TCP

kube-proxy metrics

4211 TCP

Cluster API metrics

4212 TCP

runtime-audit-engine module metrics

4213 TCP

kube-router metrics

4214 TCP

API of the sds-replicated-volume module agent

4215 TCP

sds-replicated-volume agent metrics

4216 TCP

storage-status agent metrics

4218 TCP/UDP

Synchronization of the speaker components in metallb modules via memberlist protocol

4220 TCP

Metrics of the speaker components in metallb modules

4224 TCP

node-local-dns metrics

4225 TCP/UDP

Synchronization of the speaker components in metallb modules via memberlist protocol

4226 TCP

Metrics of the speaker components in metallb modules

4228 TCP

sds-node-configurator agent healthcheck

4229 TCP

csi-nfs CSI controller healthcheck

4230 TCP

csi-nfs CSI node healthcheck

4231 TCP

csi-hpe CSI controller healthcheck

4232 TCP

csi-hpe CSI node healthcheck

4235 TCP

csi-s3 CSI controller healthcheck

4236 TCP

csi-s3 CSI node healthcheck

4237 TCP

csi-scsi-generic CSI controller healthcheck

4238 TCP

csi-scsi-generic CSI node healthcheck

4239 TCP

storage-status agent healthcheck

4240 TCP

CNI Cilium node-to-node healthcheck

4241 TCP

CNI Cilium agent metrics

4242 TCP

CNI Cilium operator metrics

4244 TCP

cilium-hubble module API

4245 TCP

chrony-exporter metrics

4246 TCP

csi-ceph CephFS CSI controller healthcheck

4247 TCP

csi-ceph RBD CSI controller healthcheck

4248 TCP

csi-yadro-tatlin-unified CSI controller healthcheck

4249 TCP

csi-yadro-tatlin-unified CSI node healthcheck

4250 TCP

sds-local-volume CSI controller healthcheck

4251 TCP

sds-local-volume CSI node healthcheck

4252 TCP

csi-ceph RBD CSI node healthcheck

4253 TCP

csi-ceph CephFS CSI node healthcheck

4254 TCP

csi-netapp CSI controller healthcheck

4255 TCP

csi-netapp CSI node healthcheck

4256 TCP

csi-netapp CSI controller metrics

4257 TCP

csi-netapp CSI controller API port

4258 TCP

csi-huawei CSI controller webhook port

4259 TCP

csi-huawei CSI node healthcheck

4260 TCP

csi-huawei CSI controller metrics

4261 TCP

sds-replicated-volume CSI controller healthcheck

4262 TCP

sds-replicated-volume CSI node healthcheck

4263 TCP

service-with-healthchecks module metrics

4269 TCP

sds-replicated-volume CSI node healthcheck

4270 TCP

sds-replicated-volume CSI node metrics

4271 TCP

sds-replicated-volume CSI controller healthcheck

4272 TCP

sds-replicated-volume CSI controller metrics

4135-4199 TCP

virtualization live migration tunnels between cluster nodes

4280 TCP

virtualization USB over IP (usb/ip) protocol for sharing USB devices between cluster nodes

4286 TCP

Istio CNI metrics

4287 UDP

WireGuard port for traffic encryption in CNI Cilium

4288 TCP

monitoring-ping metrics

4289 TCP

monitoring-ping metrics

4295‑4297 UDP

Used by the cni-cilium module for VXLAN encapsulation of inter-pod traffic in multiple nested virtualization — when DKP with the virtualization module enabled is deployed inside virtual machines that are also created in DKP with the virtualization module enabled

4298 UDP

Used by the cni-cilium module for VXLAN encapsulation of traffic between pods if the cluster was deployed on DKP version starting from 1.71 (for clusters deployed on DKP versions up to 1.71, see the note for ports 4299/UDP, 8469/UDP, and 8472/UDP)

4299 UDP

For clusters deployed on DKP versions 1.64–1.70. Used by the cni-cilium module for VXLAN encapsulation of traffic between pods. Updating DKP to newer versions will not change the port used unless the virtualization module is enabled.

Note that in such clusters, enabling the virtualization module on DKP up to version 1.70 changes the port to 4298/UDP

7000‑7999 TCP

sds-replicated-volume DRBD replication

8469 UDP

For clusters deployed on DKP version 1.63 and below with the virtualization module enabled prior to DKP version 1.63. Used by the cni-cilium module for VXLAN encapsulation of traffic between pods. Updating DKP to newer versions will not change the occupied port

8472 UDP

For clusters deployed on DKP version 1.63 and below. Used by the cni-cilium module for VXLAN encapsulation of traffic between pods. Updating DKP to newer versions will not change the occupied port if the virtualization module is not enabled.

Note that in such clusters, enabling the virtualization module on DKP before version 1.70 changes the port:

  • Enabling the virtualization module on DKP version 1.63 and below will change it to 8469/UDP and will not change with subsequent DKP updates
  • Enabling the virtualization module on DKP starting from version 1.64 will change it to 4298/UDP and will not change with subsequent DKP updates

Static virtualization ports on cluster nodes (4100-4134/TCP reserved)

Port Protocol Purpose
4100 TCP

virtualization virt-handler healthz and metrics

4101 TCP

virtualization virt-handler console server

4105 TCP

virtualization vm-route-forge liveness and readiness probes

4106 TCP

virtualization vm-route-forge pprof in debug mode

4107 TCP

virtualization virtualization-dra gRPC liveness and readiness probes

External traffic to master nodes

Port Protocol Purpose
22 TCP

SSH for initializing Deckhouse Kubernetes Platform

6443 TCP

Direct access to the apiserver

External traffic to frontend nodes

Port Protocol Purpose
80, 443 TCP

Application ports for requests to Ingress controllers over HTTP and HTTPS. Note that these ports are configurable in the IngressNginxController resource and may vary across installations

5416 UDP

OpenVPN

5416 TCP

OpenVPN

10256 TCP

Healthcheck port for external balancers

30000-32767 TCP

NodePort range

External traffic for all nodes

Port Protocol Purpose
53 UDP

DNS

53 TCP

DNS

123 UDP

NTP for synchronization with external time servers

179 TCP

BGP peering with the infrastructure router for network traffic balancing (metallb module)

443 TCP

Container registry

Additional resources