[
https://issues.apache.org/jira/browse/FLINK-41025?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated FLINK-41025:
-----------------------------------
Labels: pull-request-available (was: )
> Add config option to control enableServiceLinks of JobManager and TaskManager
> pods
> ----------------------------------------------------------------------------------
>
> Key: FLINK-41025
> URL: https://issues.apache.org/jira/browse/FLINK-41025
> Project: Flink
> Issue Type: Improvement
> Components: Deployment / Kubernetes
> Reporter: Guotao Ding
> Priority: Major
> Labels: pull-request-available
>
> h3. Motivation
> Kubernetes enables {{enableServiceLinks}} in the pod spec by default. With it
> enabled, the kubelet injects several environment variables
> ({{<SVC>_SERVICE_HOST}}, {{<SVC>_SERVICE_PORT}}, {{<SVC>_PORT_*}}, ...) into
> every container for each Service in the same namespace.
> Every Flink native Kubernetes cluster creates its own rest and internal
> Services, so the number of injected environment variables grows with the
> number of Flink clusters in the namespace. In our production environment, a
> single JobManager/TaskManager pod ended up with more than 20,000 environment
> variables. In this case, submitting a Flink job on Kubernetes becomes very
> slow: the JobManager and TaskManager pods take a long time to start, since
> every shell invocation in the pod has to deal with the huge number of
> environment variables.
> We have disabled service links for all Flink pods in our production
> environment. Since then, the number of environment variables in a pod has
> dropped to less than 100, the startup time is back to normal, and no
> functional impact on Flink has been observed.
> Flink does not read these Service environment variables: components are
> reached via Service DNS names and ConfigMaps. {{KUBERNETES_SERVICE_HOST}} and
> {{KUBERNETES_SERVICE_PORT}}, which the Kubernetes client relies on, are
> injected regardless of {{enableServiceLinks}}.
> h3. Proposed Change
> * Add a config option {{kubernetes.pod.service-links.enabled}} (Boolean, no
> default value).
> * If it is configured, {{InitJobManagerDecorator}} and
> {{InitTaskManagerDecorator}} set {{enableServiceLinks}} of the JobManager and
> TaskManager pod spec to the configured value, overwriting the value from the
> pod template.
> * If it is not configured, the field is left untouched, i.e. the value from
> the pod template is kept, or the Kubernetes default ({{true}}) applies when
> the pod template does not define it either. There is no behavior change for
> existing deployments.
> * Document the option and add {{enableServiceLinks}} to the "Fields
> Overwritten by Flink" table of the native Kubernetes documentation.
> h3. Alternatives
> Setting {{enableServiceLinks: false}} in a pod template
> ({{kubernetes.pod-template-file.*}}) already works. A dedicated option is
> still proposed because:
> * The number of injected variables grows with the Services that Flink itself
> creates, so the issue shows up specifically in namespaces with many Flink
> clusters.
> * The symptom (slow pod startup) does not point to the environment variables,
> so the pod template workaround is hard to find. A documented option makes the
> cause and the fix discoverable.
> * Kubernetes is not going to change the default of {{enableServiceLinks}}
> since it would be a breaking change (see
> [kubernetes#121787|https://github.com/kubernetes/kubernetes/issues/121787]),
> so it has to be disabled by the application that creates the pods.
> * Other pod spec fields that can be set via pod template also have dedicated
> options, e.g. {{kubernetes.hostnetwork.enabled}},
> {{kubernetes.service-account}}, {{kubernetes.jobmanager.node-selector}} /
> {{kubernetes.taskmanager.node-selector}},
> {{kubernetes.jobmanager.tolerations}} /
> {{kubernetes.taskmanager.tolerations}}.
> h3. How to reproduce
> # Submit a large number of Flink jobs in native Kubernetes mode into one
> namespace.
> # Start a new Flink job in that namespace, and check {{env | wc -l}} and
> {{time bash -c true}} inside its JobManager/TaskManager pod.
> # Set {{enableServiceLinks: false}} via a pod template and repeat step 2.
> h3. References
> * [kubernetes#92615: 1000+ services in the same namespace will degrade pod
> start time & eventually prevent pods from
> starting|https://github.com/kubernetes/kubernetes/issues/92615]
> * [kubernetes#121787: Set enableServiceLinks to false as
> default|https://github.com/kubernetes/kubernetes/issues/121787]
> * [太多的 service 信息环境变量可能会导致容器中执行 bash
> 命令特别的慢|https://mozillazg.com/2020/06/kubernetes-k8s-too-many-service-environment-variables-cause-pod-container-start-bash-too-slow.html]
> * [任务执行龟速,原因竟然是......|https://cloud.tencent.com/developer/article/1916662]
--
This message was sent by Atlassian Jira
(v8.20.10#820010)