【bug】docker中部署rancher,在内置local集群(k3s集群)中,helm安装了airflow,访问airflow的web页面时部分页面(链接)错误

版本:rancher 2.7.9。
rancher安装:同 使用 Docker 将 Rancher 安装到单个节点中 | Rancher
airflow安装:同 Helm Chart for Apache Airflow — helm-chart Documentation

安装成功后,直接点击 airflow-web 的service链接,进入登录页面(正常:https://127.0.0.1:30443/api/v1/namespaces/airflow/services/http:airflow-webserver:8080/proxy/)。登录后访问dag页面(出现下图错误:https://127.0.0.1:30443/api/v1/namespaces/airflow/services/http:airflow-webserver:8080/proxy/dags/dataset_consumes_1_and_2/grid)。 分析报错页面源码,并对照airflow页面代码,发现同一代码生成的html内容并一致,见下图。 据此,怀疑通过rancher界面service端口和url直接访问服务时,rancher对页面中a链接文本进行了替换,但其他文本未做替换,所以,页面中非a链接的有关路径的内容均存在错误。

dag页面meta标签:

dag页面mta代码:

dag页面link标签:

dag页面link代码:

service界面:

通过 docker run 的 rancher 自带的 local 集群是支撑 rancher 运行的,由于网络的隔离,不建议部署自己的业务在 local 集群中,要不你新建个集群试试?

问题已经进一步聚焦到确实是rancher(或者也可能是k3s集群)的问题(但不是airflow的问题),验证过程如下:

将原有的airflow的pod改为空命令启动,然后手动进入容器内,用nc命令起一个简单的webserver进行观察,如下两组对比:

A: echo “listing 8080” && while true; do echo -e “HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8\n\n<”‘!’“DOCTYPE html>\n<a href="/date">date” | nc -l -k -p 8080 -q 1; done

Out: <a href="/api/v1/namespaces/airflow273/services/http:test-proxy:8080/proxy/date">date</a>

B: echo “listing 8080” && while true; do echo -e “HTTP/1.1 200 OK\n\n<”‘!’“DOCTYPE html>\n<a href="/date">date” | nc -l -k -p 8080 -q 1; done

Out: <a href="/date">date</a>

上述实验,webserver不存在任何对链接进行改写的逻辑,但验证了,proxy访问后端服务时,会主动改写某些字符串,包括a链接、link地址、script地址,等,但,问题点在于,某些业务,在meta标签中存储链接地址以便给ajax交互时使用,由于没有对meta中存储的链接进行改写,导致了前述错误。

排查中也发现,proxy在从后端获取结果并返回给浏览器时,改写了response的Content-Type,将其从“Content-Type: text/html”改为了“Content-Type: text/plan”,导致很长时间才发现这个突破口。

建议/期望:1、通过环境变量、或标签的形式,可以自行添加指定额外的标签值重写。2、保留response的Content-Type。

PS: 查到源码中有如下逻辑(go语言不熟,但高度怀疑问题就在此处):

  1. 使用 rancher proxy 代理后,后端代理响应时,会修改部分资源引用的地址(比如:html 文件文件中的 类似 href 或 src =" /test/test.css "这样的资源引用),修改成代理后的资源地址,否则会找不对应的资源
  2. 可以尝试在 html 文件 head 标签中添加 base 标签,其他资源引用使用现对路径来解决这个问题(因为后端代理响应时,会修改 base 标签中的路径为代理后的路径,相对地址引用的资源会基于 base 标签中的路径自动组装资源路径):比如
<base href="/ui/" />
<link rel="icon" href="./favicon.ico"/>
  1. 如果不想使用proxy或应用不支持proxy方式,可以使用 nodeport 或 ingress 等方式暴露服务外部访问url,可避免这个问题

请问:
1、所以能否让proxy完善一些,支持自定义那些标签需要被改写?
2、使用proxy时,那些标签属性值会被改写,有确切的文档说明吗,或者相应的代码区域能确定 – 这些?

谢谢