我正在致力于在Kubernetes上设置能够启动pyspark的Jupyter笔记本服务器。每个用户能够同时运行多个服务器,并且可以通过导航到适当的主机并结合到服务器的完全限定名称的路径来访问每个服务器。例如:http://<hostname>/<username>/<notebook server name>。
我定义了一个顶级函数,它允许用户创建一个指向Kubernetes master URL的SparkSession,并将他们的pod设置为Spark driver。
这一切都很好,但我希望最终用户能够访问Spark Web UI的URL,以便他们可以跟踪他们的作业。Spark on Kubernetes documentation将端口转发作为实现此目标的推荐方案。似乎对于任何注重安全的组织来说,允许任何随机用户以这种方式设置端口转发都是不可接受的。
我想使用Ingress Kubernetes定义来允许外部访问驱动程序的Spark Web UI。我已经设置了如下内容:
# Service
apiVersion: v1
kind: Service
metadata:
namespace: <notebook namespae>
name: <username>-<notebook server name>-svc
spec:
type: ClusterIP
sessionAffinity: None
selector:
app: <username>-<notebook server name>-notebook
ports:
- name: app-svc-port
protocol: TCP
port: 8888
targetPort: 8888
- name: spark-ui-port
protocol: TCP
port: 4040
targetPort: 4040
# Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: workspace
name: <username>-<notebook server name>-ing
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: <hostname>
http:
paths:
- path: /<username>/<notebook server name>
backend:
serviceName: <username>-<notebook server name>-svc
servicePort: app-svc-port
- path: /<username>/<notebook server name>/spark-ui
backend:
serviceName: <username>-<notebook server name>-svc
servicePort: spark-ui-port然而,在这种设置下,当我导航到http://<hostname>/<username>/<notebook server name>/spark-ui/时,我被重定向到http://<hostname>/jobs。这是因为/jobs是Spark的Web的默认入口点。但是,我没有针对该路径的入口规则,也不能设置这样的规则,因为在负载均衡器中,每个用户的Web UI都会相互冲突(除非我有误解,这是完全可能的)。
在Spark UI configuration设置下,似乎没有一种方法可以为Spark会话设置根路径。您可以更改运行它的端口,但我想要做的是使UI在以下位置提供服务:http://<hostname>/<username>/<notebook server name>/spark-ui/<jobs, stages, etc>。是否真的没有办法更改URL主机名之后和最后一部分之前的内容?
发布于 2020-08-18 08:14:02
1:设置spark配置
spark.ui.proxyBase: /foo2:在Ingress中设置nginx注解
annotations:
nginx.ingress.kubernetes.io/proxy-redirect-from: http://$host/
nginx.ingress.kubernetes.io/proxy-redirect-to: http://$host/foo/3:重写目标的注释:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: <host>
http:
paths:
- backend:
serviceName: <service>
servicePort: <port>
path: /foo(/|$)(.*)发布于 2019-11-07 09:18:06
是的,你可以做到这一点。具体地说,您可以通过在spark-defaults.conf中或在运行时设置spark.ui.proxyBase属性来完成此操作。
示例:
echo "spark.ui.proxyBase $SPARK_UI_PROXYBASE“>> /opt/spark/conf/spark-defaults.conf;
那么这应该是可行的。
https://stackoverflow.com/questions/56368948
复制相似问题