Yalin Dogu Sahin created SPARK-58691:
----------------------------------------

             Summary: NetworkPolicy generated for standalone SparkCluster 
workers blocks Prometheus metrics scraping
                 Key: SPARK-58691
                 URL: https://issues.apache.org/jira/browse/SPARK-58691
             Project: Spark
          Issue Type: Bug
          Components: Kubernetes
    Affects Versions: kubernetes-operator-1.0.0
            Reporter: Yalin Dogu Sahin


h2. Summary

  The {{NetworkPolicy}} generated for standalone {{SparkCluster}} workers 
blocks Prometheus metrics scraping.

  h2. Problem

  For a standalone {{SparkCluster}} resource, the operator generates a worker 
{{NetworkPolicy}} ({{SparkClusterResourceSpec#buildWorkerNetworkPolicy}}) whose 
ingress rule only admits traffic from pods carrying the
  cluster label ({{spark.operator/spark-cluster-name: <cluster>}}) or the 
driver label ({{spark-role: driver}}). No {{ports}} or {{namespaceSelector}} 
are specified.

  Because a Prometheus scraper (e.g. Prometheus Operator's 
ServiceMonitor/PodMonitor) runs as an arbitrary pod without either label, its 
connection to a worker is dropped. As a result, *worker Prometheus metrics are
  un-scrapable in standalone mode*.

  * The worker web UI / Prometheus servlet runs on *port 8081* 
({{/metrics/prometheus}}), but the worker pod is inside the 
NetworkPolicy-restricted set, so the scrape is rejected / times out.
  * The *master has no {{NetworkPolicy}} at all*, so master metrics on *8080* 
remain reachable — the failure is specific to workers.

  This is the same label-based allow-list mechanism addressed for 
*block-manager / task-result* traffic in SPARK-58649, but here it surfaces as 
blocked metrics scraping rather than task failures.

  h2. Reproduction

  # Deploy a {{SparkCluster}} (master + worker) and a Prometheus/ServiceMonitor 
targeting worker pods.
  # Attempt to scrape {{<worker-pod>:8081/metrics/prometheus}}.
  # The scrape fails because the worker pod is not an allowed ingress source in 
the {{NetworkPolicy}} named {{<cluster>-worker}}.

  h2. Evidence

  || Policy element || Value ||
  | Name | {{<cluster>-worker}} |
  | Worker podSelector | {{spark-role: worker}} AND 
{{spark.operator/spark-cluster-name: <cluster>}} |
  | Allowed ingress {{from}} | (a) pods with 
{{spark.operator/spark-cluster-name: <cluster>}}, (b) pods with {{spark-role: 
driver}} |
  | Ports rule | none (all ports, but only to the {{from}} sources above) |
  | Master | no {{NetworkPolicy}} — unrestricted |

  h2. Suggested approach (for discussion)

  A few options; maintainers' input is welcome:

  # *Configurable / default-open* — make the worker NetworkPolicy ingress 
configurable in {{ClusterSpec}} (e.g. an explicit list of scraper-side 
labels/namespaces, or a {{networkPolicy.enabled}} toggle), preserving
  current behavior by default.
  # *Add a scrape source* — extend the {{from}} list with a well-known 
metrics-scraper label and/or a {{namespaceSelector}} for the monitoring 
namespace.
  # *Port-scoped carve-out* — keep the allow-list but add an explicit {{ports}} 
ingress rule for 8081 so the intent is explicit and auditable.

  Happy to prepare a patch once the preferred approach is agreed.

  h2. Related

  * SPARK-55099 — introduced the {{NetworkPolicy}} for {{SparkCluster}}. 
https://issues.apache.org/jira/browse/SPARK-55099
  * SPARK-58649 — the same NetworkPolicy blocking worker ingress for attached 
drivers. https://issues.apache.org/jira/browse/SPARK-58649



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to