Optimizing routing

    The OKD Ingress Controller, or router, is the ingress point for ingress traffic for applications and services that are configured using routes and ingresses.

    When evaluating a single HAProxy router performance in terms of HTTP requests handled per second, the performance varies depending on many factors. In particular:

    • Route type

    • TLS session resumption client support

    • Number of concurrent connections per target route

    • Back end server page size

    • Underlying infrastructure (network/SDN solution, CPU, and so on)

    While performance in your specific environment will vary, Red Hat lab tests on a public cloud instance of size 4 vCPU/16GB RAM. A single HAProxy router handling 100 routes terminated by backends serving 1kB static pages is able to handle the following number of transactions per second.

    In HTTP keep-alive mode scenarios:

    In HTTP close (no keep-alive) scenarios:

    EncryptionLoadBalancerServiceHostNetwork

    none

    5719

    8273

    edge

    2729

    4069

    passthrough

    4121

    5344

    re-encrypt

    2320

    2941

    The default Ingress Controller configuration was used with the field set to 4. Two different endpoint publishing strategies were tested: Load Balancer Service and Host Network. TLS session resumption was used for encrypted routes. With HTTP keep-alive, a single HAProxy router is capable of saturating a 1 Gbit NIC at page sizes as small as 8 kB.

    When running on bare metal with modern processors, you can expect roughly twice the performance of the public cloud instance above. This overhead is introduced by the virtualization layer in place on public clouds and holds mostly true for private cloud-based virtualization as well. The following table is a guide to how many applications to use behind the router:

    In general, HAProxy can support routes for up to 1000 applications, depending on the technology in use. Ingress Controller performance might be limited by the capabilities and performance of the applications behind it, such as language or static versus dynamic content.

    Ingress, or router, sharding should be used to serve more routes towards applications and help horizontally scale the routing tier.

    For more information on Ingress sharding, see and Configuring Ingress Controller sharding by using namespace labels.

    You can modify the Ingress Controller deployment using the information provided in for threads and Ingress Controller configuration parameters for timeouts, and other tuning configurations in the Ingress Controller specification.

    Cluster administrators can configure the timeout values for the kubelet’s liveness, readiness, and startup probes for router deployments that are managed by the OKD Ingress Controller (router). The liveness and readiness probes of the router use the default timeout value of 1 second, which is too brief when networking or runtime performance is severely degraded. Probe timeouts can cause unwanted router restarts that interrupt application connections. The ability to set larger timeout values can reduce the risk of unnecessary and unwanted restarts.

    You can update the timeoutSeconds value on the livenessProbe, , and startupProbe parameters of the router container.

    ParameterDescription

    livenessProbe

    The livenessProbe reports to the kubelet whether a pod is dead and needs to be restarted.

    The readinessProbe reports whether a pod is healthy or unhealthy. When the readiness probe reports an unhealthy pod, then the kubelet marks the pod as not ready to accept traffic. Subsequently, the endpoints for that pod are marked as not ready, and this status propagates to the kube-proxy. On cloud platforms with a configured load balancer, the kube-proxy communicates to the cloud load-balancer not to send traffic to the node with that pod.

    startupProbe

    The startupProbe gives the router pod up to 2 minutes to initialize before the kubelet begins sending the router liveness and readiness probes. This initialization time can prevent routers with many routes or endpoints from prematurely restarting.

    The following example demonstrates how you can directly patch the default router deployment to set a 5-second timeout for the liveness and readiness probes:

    Verification

    When you update a route or an endpoint associated with a route, OKD router updates the configuration for HAProxy. Then, HAProxy reloads the updated configuration for those changes to take effect. When HAProxy reloads, it generates a new process that handles new connections using the updated configuration.

    HAProxy keeps the old process running to handle existing connections until those connections are all closed. When old processes have long-lived connections, these processes can accumulate and consume resources.

    The default minimum HAProxy reload interval is five seconds. You can configure an Ingress Controller using its field to set a longer minimum reload interval.

    Setting a large value for the minimum HAProxy reload interval can cause latency in observing updates to routes and their endpoints. To lessen the risk, avoid setting a value larger than the tolerable latency for updates.

    Procedure