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。