bcanvural opened a new issue, #74584:
URL: https://github.com/apache/airflow/issues/74584

   ### Under which category would you file this issue?
   
   Helm chart
   
   ### Apache Airflow version
   
   3.3.0
   
   ### What happened and how to reproduce it?
   
   With an executor string that contains both `KubernetesExecutor` and 
`CeleryExecutor`, the chart's headless worker Service (`<release>-worker`, port 
8793 `worker-logs`) selects every KubernetesExecutor task pod as well as the 
Celery worker pods.
   
   The Service selector (`templates/workers/worker-service.yaml`) for the 
default worker set is:
   
   ```yaml
   selector:
     tier: airflow
     component: worker
     release: <release>
   ```
   
   The KubernetesExecutor pod template 
(`files/pod-template-file.kubernetes-helm-yaml`) gives every task pod exactly 
those labels:
   
   ```yaml
   labels:
     tier: airflow
     component: worker
     release: <release>
   ```
   
   The Celery worker pods carry the same three labels and nothing else that 
distinguishes them, so the two can't be told apart. Named worker sets 
(`workers.celery.sets`) don't have the problem, because their Service selector 
adds `worker-set: <name>`, which task pods don't carry. Only the default set is 
affected.
   
   Values to reproduce:
   
   ```yaml
   executor: "KubernetesExecutor,CeleryExecutor"
   ```
   
   1. `helm install airflow apache-airflow/airflow --version 1.22.0 -f 
values.yaml`
   2. Run any DAG whose tasks use the KubernetesExecutor (the default executor, 
listed first).
   3. `kubectl get endpointslices -l kubernetes.io/service-name=airflow-worker 
-o yaml`
   
   The EndpointSlice lists the task pods. In one of our deployments it held 1 
Celery worker pod and 11 task pods at the moment we looked. Because task pods 
come and go with every task, the slice has been updated about 3.35 million 
times since it was created about 6 months ago, roughly once every 4–5 seconds.
   
   Why it matters: anything that watches Endpoints/EndpointSlices sees that 
churn.
   
   - **Istio:** every endpoint change of a headless Service triggers a full xDS 
push (listeners and routes) to every sidecar that can see the Service. By 
default, that's every sidecar in the mesh.
     - In one cluster with ~550 sidecars (Istio 1.26), 716 of 777 full pushes 
in a 15-minute window were for this Service, and about 99% of the bytes istiod 
sent were those pushes: several TB per day of control-plane traffic, mostly 
crossing availability zones.
     - A second cluster with ~230 sidecars (Istio 1.30) showed 843 of 846.
     - None of those sidecars ever talks to the worker log server.
   - **DNS:** the Service's DNS name also resolves to task pod IPs, which don't 
run the Celery log server on 8793.
   
   ### What you think should happen instead?
   
   The default worker Service should select only Celery worker pods, the way 
named worker sets already do.
   
   A non-breaking way to do it:
   
   - Add a distinguishing label to the Celery worker pod template only (for 
example `worker-set: default`, mirroring named sets).
   - Add the same label to the Service selector.
   - Leave the Deployment/StatefulSet `spec.selector` unchanged, since it is 
immutable.
   
   Service selectors can be changed in place, so existing installs upgrade 
without recreating anything. Changing `component: worker` on task pods would 
also work, but it would break anything users already select on that label 
(NetworkPolicies, monitoring).
   
   ### Operating System
   
   Official Airflow image (Debian-based), not customized for this path
   
   ### Deployment
   
   Official Apache Airflow Helm Chart
   
   ### Deployment details
   
   Amazon EKS, Kubernetes 1.36. Istio sidecar mesh in the cluster. The Airflow 
namespace itself has no sidecars.
   
   ### Official Helm Chart version
   
   1.22.0 (latest released). Also checked `main`: same selector and pod 
template labels.
   
   ### Kubernetes Version
   
   1.36
   
   ### Helm Chart configuration
   
   ```yaml
   executor: "KubernetesExecutor,CeleryExecutor"
   # podTemplate not set (chart default pod template)
   ```
   
   ### Docker Image customizations
   
   None relevant (extra Python dependencies only).
   
   ### Anything else?
   
   We're working around it by hiding the Service from the mesh with the Istio 
annotation `networking.istio.io/exportTo: "."`. The chart has no annotations 
value for the worker Service (unlike `apiServer.service.annotations`), so we 
apply it with `kubectl annotate` after each deploy. A 
`workers.celery.service.annotations` value would be a useful addition, but it 
only hides the symptom; the selector is the actual bug.
   
   ### Are you willing to submit PR?
   
   - [ ] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's Code of Conduct
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to