Make connections to k8s API server persistent #1390
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
The Fluentd plugins we use make a good amount of HTTP connections to the Kubernetes API server for Kubernetes metadata enrichment. Until now, the HTTP connections were being closed after each HTTP request, requiring a new HTTP connection to be established on every request to API server. This was a suboptimal solution, and the root cause for SNAT port exhaustion in AKS clusters.
With this change, we are using a yet unreleased version of Kubeclient library to be able to create persistent HTTP connections. The Kubeclient library (which is used by our Fluentd plugins to make requests to k8s API server) originally used RestClient gem under the hood, which does not make it possible to create persistent connections. With the unreleased version of Kubeclient, the underlying HTTP library has been changed from RestClient to Faraday, which, when used with NetHttpPersistent adapter, makes connections persistent by default.
Testing in AKS showed that SNAT port usage with persistent connections is constant, no matter how many requests our plugins make to API server.
Testing performed