5. 带上你自己的 Prometheus

尽管 linkerd-viz 扩展带有自己的 Prometheus 实例, 但在某些情况下,由于各种原因使用外部实例更有意义。

本教程展示了如何配置外部 Prometheus 实例, 以用户Linkerd 控制平面组件(如 web 等)均 可使用的格式抓取控制平面代理指标

这里有两个重要的点需要解决。

  • 配置外部 Prometheus 实例以获取 Linkerd 指标。
  • 配置 linkerd-viz 扩展以使用该 Prometheus

Prometheus 抓取配置

以下抓取配置必须应用于外部 Prometheus 实例。

在应用之前,重要的是将模板值(存在于 {{}} 中)替 换为直接值,以使以下配置正常工作。

    - job_name: 'linkerd-controller'
      kubernetes_sd_configs:
      - role: pod
        namespaces:
          names:
          - '{{.Values.linkerdNamespace}}'
          - '{{.Values.namespace}}'
      relabel_configs:
      - source_labels:
        - __meta_kubernetes_pod_container_port_name
        action: keep
        regex: admin-http
      - source_labels: [__meta_kubernetes_pod_container_name]
        action: replace
        target_label: component

    - job_name: 'linkerd-service-mirror'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels:
        - __meta_kubernetes_pod_label_linkerd_io_control_plane_component
        - __meta_kubernetes_pod_container_port_name
        action: keep
        regex: linkerd-service-mirror;admin-http$
      - source_labels: [__meta_kubernetes_pod_container_name]
        action: replace
        target_label: component

    - job_name: 'linkerd-proxy'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels:
        - __meta_kubernetes_pod_container_name
        - __meta_kubernetes_pod_container_port_name
        - __meta_kubernetes_pod_label_linkerd_io_control_plane_ns
        action: keep
        regex: ^{{default .Values.proxyContainerName "linkerd-proxy" .Values.proxyContainerName}};linkerd-admin;{{.Values.linkerdNamespace}}$
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      # special case k8s' "job" label, to not interfere with prometheus' "job"
      # label
      # __meta_kubernetes_pod_label_linkerd_io_proxy_job=foo =>
      # k8s_job=foo
      - source_labels: [__meta_kubernetes_pod_label_linkerd_io_proxy_job]
        action: replace
        target_label: k8s_job
      # drop __meta_kubernetes_pod_label_linkerd_io_proxy_job
      - action: labeldrop
        regex: __meta_kubernetes_pod_label_linkerd_io_proxy_job
      # __meta_kubernetes_pod_label_linkerd_io_proxy_deployment=foo =>
      # deployment=foo
      - action: labelmap
        regex: __meta_kubernetes_pod_label_linkerd_io_proxy_(.+)
      # drop all labels that we just made copies of in the previous labelmap
      - action: labeldrop
        regex: __meta_kubernetes_pod_label_linkerd_io_proxy_(.+)
      # __meta_kubernetes_pod_label_linkerd_io_foo=bar =>
      # foo=bar
      - action: labelmap
        regex: __meta_kubernetes_pod_label_linkerd_io_(.+)
      # Copy all pod labels to tmp labels
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
        replacement: __tmp_pod_label_$1
      # Take `linkerd_io_` prefixed labels and copy them without the prefix
      - action: labelmap
        regex: __tmp_pod_label_linkerd_io_(.+)
        replacement:  __tmp_pod_label_$1
      # Drop the `linkerd_io_` originals
      - action: labeldrop
        regex: __tmp_pod_label_linkerd_io_(.+)
      # Copy tmp labels into real labels
      - action: labelmap
        regex: __tmp_pod_label_(.+)

内置 prometheus 的运行配置可以作为参考。

kubectl -n linkerd-viz  get configmap prometheus-config -o yaml

Linkerd-Viz 扩展配置

Linkerd 的可视化扩展组件(如 metrics-api 等)依赖 于 Prometheus 实例来为仪表板和 CLI 提供支持。

prometheusUrl 字段为您提供了一个位置, 所有这些组件都可以通过该位置配置为外部 Prometheus URL。 这可以通过 CLIHelm 实现。

CLI

这可以通过将具有上述字段的文件传递给 values 标志来完成, 该 flag 可通过 linkerd viz install 命令获得。

prometheusUrl: existing-prometheus.xyz:9090

一旦应用,此配置在安装中不会持久化。 在重新安装、升级等过程中,用户必须再次传递相同的信息。

当使用外部 Prometheus 并配置 prometheusUrl 字段时, LinkerdPrometheus 仍将包含在安装中。 如果您想禁用它,请确保同时包含以下配置:

prometheus:
  enabled: false

Helm

使用 Helm 时,可以通过 values.yaml 应用相同的配置。 应用后,Helm 会确保配置在升级过程中保持不变。

可以在此处找到有关通过 Helm 安装的更多信息