istio 不为舞会掌舵图提供静态文件
istio doesnt serve static files for prom helm chart
我的团队在我们的 k8s (v 1.15.6) 环境中使用 istio(1.2.8 版),
我们想在应用 vs
时为 Prometheus 提供 外部 IP
我们能够在浏览器中访问 Prometheus,但没有 css/js
文件。 404 .js
文件(请参阅下面的日志)文件(请参阅下面的特使日志)出现 404 错误,因为未提供 /static
文件。
这是我们得到的UI(没有css和js文件被提供)
而不是以下 Prometheus 默认值 UI(使用负载均衡器或端口转发时...)
这是查看问题的最少步骤:
通过 helm 安装 Prometheus 按原样(最新- 我们没有更改 Prometheus 的任何默认 配置图表)
取service
的名称(服务部署的ns
上有kubectl get svc
)放在VS中的destination->host
部分(更新gw
主机等)并应用 VS
文件
vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
顺便说一句,
如果我只是更改 Prometheus 的类型以使用 LoadBalancer
它可以工作,我就能得到 external-ip
并按预期看到 istio UI。
另一个信息,如果我删除以下
rewrite:
uri: /graph
我在浏览器中得到 404 error
,但没有来自舞会的任何数据
在没有js/css文件的浏览器中,浏览器中的网络如下:
我什至尝试了以下也不起作用
- uri:
prefix: /prometheus
rewrite:
uri: /static
或
- uri:
prefix: /prometheus/static
我们的 gateway
规范如下所示
...
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- lzs.dev10.int.str.cloud.rpn
port:
name: https-manager
number: 443
protocol: HTTPS
tls:
mode: SIMPLE
privateKey: /etc/istio/de-tls/tls.key
serverCertificate: /etc/istio/de-tls/tls.crt
使用端口转发(本地)或 loadbalancer
对 Prometheus 有效。
我们怎样才能让它与 istio 一起工作?
更新
我也尝试添加静态并得到相同的结果:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
更新 2
在使用作为答案提供的 yaml 之后,现在我看到 ui 和 css 等但是它不起作用,我得到错误:Error loading available metrics!
在浏览器调试模式网络选项卡中,我可以看到以下内容不起作用
这是 envoy 的错误日志
[2019-12-17T09:04:18.670Z] "GET /api/v1/query?query=time()&_=1576573457737 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.0.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "57592874-27f5-4b57-9dea-1bcf13365f60" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.13:443 100.96.0.1:24664 lzs.dev10.int.str.cloud.rpn
[2019-12-17T09:04:18.670Z] "GET /api/v1/label/__name__/values?_=1576573457738 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.0.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "edad441d-58fe-4214-aae0-a0aec9012030" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.13:443 100.96.0.1:24664 lzs.dev10.int.str.cloud.rpn
(我们不是在谈论 istio 自带的 Prometheus,我们需要在 diff 命名空间上安装 diff Prometheus...)
这是来自 envoy 的日志
2019-12-15T13:57:16.977357Z 信息 Envoy 代理已准备就绪
[2019-12-15 14:29:51.226][14][警告][配置] [bazel-out/k8-opt/bin/external/envoy/source/common/config/_virtual_includes/grpc_stream_lib/common/config/grpc_stream.h:86] gRPC 配置流关闭:13,
[2019-12-15 15:00:50.980][14][警告][配置] [bazel-out/k8-opt/bin/external/envoy/source/common/config/_virtual_includes/grpc_stream_lib/common/config/grpc_stream.h:86] gRPC 配置流关闭:13,
[2019-12-15T15:11:02.572Z] "GET /prometheus HTTP/2" 200 - "-" "-" 0 5785 2 1 "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" " 531e2f39-0c9f-44d3-b11b-e336126ea836" "lzs.dev10.int.str.cloud.rpn" "100.96.0.16:9090" 出站|80||prom-prometheus-server.mon.svc.cluster.local - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn
[2019-12-15T15:11:02.705Z] "GET /static/vendor/js/jquery-3.3.1.min.js?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" " 40119d8d-2103-4453-b589-e1561d44d363" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn
[2019-12-15T15:11:02.705Z] "GET /static/vendor/js/popper.min.js?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" "dbdf2a2a-cfd3-422a-82f4-e6e466407671" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn
[2019-12-15T15:11:02.706Z] "GET /static/vendor/bootstrap-4.3.1/js/bootstrap.min.js?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" "efd95571-03e9-492d-98ff-b4910d1646d6" "lzs.dev10.int.str.cloud.rpn" " -" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn
[2019-12-15T15:11:02.706Z] "GET /static/vendor/bootstrap-4.3.1/css/bootstrap.min.css?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR “-” “-” 0 0 0 - “100.96.3.1” "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" “8ae04546-06cb-4ba0-8430-f04388811460” "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn
[2019-12-15T15:11:02.706Z] "GET /static/css/prometheus.css?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR “-” “-” 0 0 0 - “100.96.3.1” "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" “70c88f5f-b582-4dd9-a2e2-47605c812344” "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn
首先,我找到了一些关于 istio 1.2 的信息,这些信息告诉
Istio 1.2 has been tested with these Kubernetes releases: 1.12, 1.13, 1.14.
因此,如果您使用 kubernetes 1.15,我建议您将 istio 升级到最新版本。
关于prometheus,我看到你想使用prometheus helm chart,你为什么不使用内置的prometheus?如 istio documentation 中所提供的,prometheus 在版本 default、demo 和 sds 中启用。
基于 istio remotely accessign telemetry addons You can use either secure(https) or insecure(http) 公开 prometheus 的选项。
我个人按照上面的教程做了一个不安全的复制,一切正常。
Kubernetes 版本:1.13.11-gke.14
Istio 版本:1.4.2
要遵循的步骤
1.Install
2.Expose普罗米修斯
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: prometheus-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 15030
name: http-prom
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prometheus-vs
namespace: istio-system
spec:
hosts:
- "*"
gateways:
- prometheus-gateway
http:
- match:
- port: 15030
route:
- destination:
host: prometheus
port:
number: 9090
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: prometheus
namespace: istio-system
spec:
host: prometheus
trafficPolicy:
tls:
mode: DISABLE
---
EOF
3.Result
编辑
你可以尝试使用这个 yaml 吗?
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
- match:
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
route:
- destination:
host: prom-prometheus-server
port:
number: 80
EDIT2 请将 /api 前缀添加到您的第二个匹配项中,如下所示
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
- match:
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
- uri:
prefix: /api
route:
- destination:
host: prom-prometheus-server
port:
number: 80
EDIT3
In your answer you separate it to two matches , why?
这个 link 是我认为的答案,你将 /prometheus 重写为 /graph 因为它是主要的 Prometheus url,没关系。但是您不能将 /static, /api 重写为 /graph,因为您需要这些路径来获取文件和指标,如果不匹配则会出现错误 404。
我的团队在我们的 k8s (v 1.15.6) 环境中使用 istio(1.2.8 版),
我们想在应用 vs
时为 Prometheus 提供 外部 IP
我们能够在浏览器中访问 Prometheus,但没有 css/js
文件。 404 .js
文件(请参阅下面的日志)文件(请参阅下面的特使日志)出现 404 错误,因为未提供 /static
文件。
这是我们得到的UI(没有css和js文件被提供)
而不是以下 Prometheus 默认值 UI(使用负载均衡器或端口转发时...)
这是查看问题的最少步骤:
通过 helm 安装 Prometheus 按原样(最新- 我们没有更改 Prometheus 的任何默认 配置图表)
取service
的名称(服务部署的ns
上有kubectl get svc
)放在VS中的destination->host
部分(更新gw
主机等)并应用 VS
文件
vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
顺便说一句,
如果我只是更改 Prometheus 的类型以使用 LoadBalancer
它可以工作,我就能得到 external-ip
并按预期看到 istio UI。
另一个信息,如果我删除以下
rewrite:
uri: /graph
我在浏览器中得到 404 error
,但没有来自舞会的任何数据
在没有js/css文件的浏览器中,浏览器中的网络如下:
我什至尝试了以下也不起作用
- uri:
prefix: /prometheus
rewrite:
uri: /static
或
- uri:
prefix: /prometheus/static
我们的 gateway
规范如下所示
...
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- lzs.dev10.int.str.cloud.rpn
port:
name: https-manager
number: 443
protocol: HTTPS
tls:
mode: SIMPLE
privateKey: /etc/istio/de-tls/tls.key
serverCertificate: /etc/istio/de-tls/tls.crt
使用端口转发(本地)或 loadbalancer
对 Prometheus 有效。
我们怎样才能让它与 istio 一起工作?
更新
我也尝试添加静态并得到相同的结果:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
更新 2
在使用作为答案提供的 yaml 之后,现在我看到 ui 和 css 等但是它不起作用,我得到错误:Error loading available metrics!
在浏览器调试模式网络选项卡中,我可以看到以下内容不起作用
这是 envoy 的错误日志
[2019-12-17T09:04:18.670Z] "GET /api/v1/query?query=time()&_=1576573457737 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.0.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "57592874-27f5-4b57-9dea-1bcf13365f60" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.13:443 100.96.0.1:24664 lzs.dev10.int.str.cloud.rpn
[2019-12-17T09:04:18.670Z] "GET /api/v1/label/__name__/values?_=1576573457738 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.0.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "edad441d-58fe-4214-aae0-a0aec9012030" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.13:443 100.96.0.1:24664 lzs.dev10.int.str.cloud.rpn
(我们不是在谈论 istio 自带的 Prometheus,我们需要在 diff 命名空间上安装 diff Prometheus...)
这是来自 envoy 的日志
2019-12-15T13:57:16.977357Z 信息 Envoy 代理已准备就绪
[2019-12-15 14:29:51.226][14][警告][配置] [bazel-out/k8-opt/bin/external/envoy/source/common/config/_virtual_includes/grpc_stream_lib/common/config/grpc_stream.h:86] gRPC 配置流关闭:13, [2019-12-15 15:00:50.980][14][警告][配置] [bazel-out/k8-opt/bin/external/envoy/source/common/config/_virtual_includes/grpc_stream_lib/common/config/grpc_stream.h:86] gRPC 配置流关闭:13, [2019-12-15T15:11:02.572Z] "GET /prometheus HTTP/2" 200 - "-" "-" 0 5785 2 1 "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" " 531e2f39-0c9f-44d3-b11b-e336126ea836" "lzs.dev10.int.str.cloud.rpn" "100.96.0.16:9090" 出站|80||prom-prometheus-server.mon.svc.cluster.local - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn [2019-12-15T15:11:02.705Z] "GET /static/vendor/js/jquery-3.3.1.min.js?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" " 40119d8d-2103-4453-b589-e1561d44d363" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn [2019-12-15T15:11:02.705Z] "GET /static/vendor/js/popper.min.js?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" "dbdf2a2a-cfd3-422a-82f4-e6e466407671" "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn [2019-12-15T15:11:02.706Z] "GET /static/vendor/bootstrap-4.3.1/js/bootstrap.min.js?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR "-" "-" 0 0 0 - "100.96.3.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" "efd95571-03e9-492d-98ff-b4910d1646d6" "lzs.dev10.int.str.cloud.rpn" " -" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn [2019-12-15T15:11:02.706Z] "GET /static/vendor/bootstrap-4.3.1/css/bootstrap.min.css?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR “-” “-” 0 0 0 - “100.96.3.1” "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" “8ae04546-06cb-4ba0-8430-f04388811460” "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn [2019-12-15T15:11:02.706Z] "GET /static/css/prometheus.css?v=6f92ce56053866194ae5937012c1bec40f1dd1d9 HTTP/2" 404 NR “-” “-” 0 0 0 - “100.96.3.1” "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0" “70c88f5f-b582-4dd9-a2e2-47605c812344” "lzs.dev10.int.str.cloud.rpn" "-" - - 100.96.2.10:443 100.96.3.1:32972 lzs.dev10.int.str.cloud.rpn
首先,我找到了一些关于 istio 1.2 的信息,这些信息告诉
Istio 1.2 has been tested with these Kubernetes releases: 1.12, 1.13, 1.14.
因此,如果您使用 kubernetes 1.15,我建议您将 istio 升级到最新版本。
关于prometheus,我看到你想使用prometheus helm chart,你为什么不使用内置的prometheus?如 istio documentation 中所提供的,prometheus 在版本 default、demo 和 sds 中启用。
基于 istio remotely accessign telemetry addons You can use either secure(https) or insecure(http) 公开 prometheus 的选项。
我个人按照上面的教程做了一个不安全的复制,一切正常。
Kubernetes 版本:1.13.11-gke.14
Istio 版本:1.4.2
要遵循的步骤
1.Install
2.Expose普罗米修斯
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: prometheus-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 15030
name: http-prom
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prometheus-vs
namespace: istio-system
spec:
hosts:
- "*"
gateways:
- prometheus-gateway
http:
- match:
- port: 15030
route:
- destination:
host: prometheus
port:
number: 9090
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: prometheus
namespace: istio-system
spec:
host: prometheus
trafficPolicy:
tls:
mode: DISABLE
---
EOF
3.Result
编辑
你可以尝试使用这个 yaml 吗?
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
- match:
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
route:
- destination:
host: prom-prometheus-server
port:
number: 80
EDIT2 请将 /api 前缀添加到您的第二个匹配项中,如下所示
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-virtualservice
namespace: mon
spec:
gateways:
- de-system-gateway.ws-system.svc.cluster.local
hosts:
- lzs.dev10.int.str.cloud.rpn
http:
- match:
- uri:
prefix: /prometheus
rewrite:
uri: /graph
route:
- destination:
host: prom-prometheus-server
port:
number: 80
- match:
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
- uri:
prefix: /api
route:
- destination:
host: prom-prometheus-server
port:
number: 80
EDIT3
In your answer you separate it to two matches , why?
这个 link 是我认为的答案,你将 /prometheus 重写为 /graph 因为它是主要的 Prometheus url,没关系。但是您不能将 /static, /api 重写为 /graph,因为您需要这些路径来获取文件和指标,如果不匹配则会出现错误 404。