これは、なにをしたくて書いたもの?
OKD(Kubernetes)上で、Prometheusを動かしてみよう、ということで。
OKDには、Prometheus Operatorを含むCluster Monitoring Operatorがあるようなのですが、今回はこちらを使わずに、単にPrometheusと
Kubenetesという観点で使ってみようかと。
Prometheus Cluster Monitoring | Configuring Clusters | OKD 3.11
GitHub - openshift/cluster-monitoring-operator: Manage the OpenShift monitoring stack
PrometheusとKubernetes Service Discovery
Prometheusには、Kubernetes向けのService Discovery(SD)があります。
Kubernetes SDでは、KubernetesのREST APIを使うことでKubernetesクラスタから情報を取得することができます。
扱えるものは以下の5つとなり、設定時に「role」で指定することになります。
- node
- service
- pod
- endpoints
- ingress
https://github.com/prometheus/prometheus/tree/v2.8.0/discovery/kubernetes
これらのロールにはいくつかのmeta labelが付与されるので、ドキュメントに記載されているmeta labelを確認してみると
よいでしょう。
で、どのように使ったらいいのかに困るのですが、ドキュメントにサンプルの設定ファイル(というか、Kubernetesでの
リソース定義)へのリンクがあるので、こちらを参考にしてPrometheusをOKD(Kubernetes)にデプロイしてみましょう。
https://github.com/prometheus/prometheus/blob/release-2.8/documentation/examples/rbac-setup.yml
https://github.com/prometheus/prometheus/tree/release-2.8/documentation/examples
あと、こちらも参考に。
examples/prometheus-deployment.yml at master · prometheus-up-and-running/examples · GitHub
PrometheusはDeployment/Podとして動かすようですが、今回はOKD上で動かすのでDeploymentConfigとして動かすことと
しましょう。
環境
今回の環境は、こちら。
$ minishift version minishift v1.33.0+ba29431 $ oc version oc v3.11.0+0cbc58b kubernetes v1.11.0+d4cacc0 features: Basic-Auth GSSAPI Kerberos SPNEGO Server https://192.168.42.160:8443 kubernetes v1.11.0+d4cacc0
Prometheusは、DockerHubより2.8.0を使用します。
OKDにPrometheusをデプロイする
PrometheusのKubernetes SDはKubernetesのAPIにアクセスすることになるのですが、Podとして動くPrometheusから
KubernetesのAPIにアクセスすることになるため、RBACの設定が必要になります。
以下のように、Service Account、ClusterRole、ClusterRoleBindingを定義します。今回利用するリソースはNode、Service、Endpoint
およびPodが使えればいいので、その4つと「get」、「list」、「watch」ができるようにします。
serviceaccount.yml
--- ## ServiceAccount apiVersion: v1 kind: ServiceAccount metadata: name: prometheus-sa namespace: myproject --- ## ClusterRole apiVersion: v1 kind: ClusterRole metadata: name: prometheus-cr rules: - apiGroups: [""] resources: - nodes - services - endpoints - pods verbs: ["get", "list", "watch"] --- ## ClusterRoleBinding apiVersion: v1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: kind: ClusterRole name: prometheus-cr subjects: - kind: ServiceAccount name: prometheus-sa namespace: myproject
こちらの作成(ClusterRole、ClusterRoleBinding)には、クラスタ管理者で実行する必要があるので、このように作成。
$ oc apply -f serviceaccount.yml --as system:admin serviceaccount/prometheus-sa created clusterrole.authorization.openshift.io/prometheus-cr created clusterrolebinding.authorization.openshift.io/prometheus created
続いて、Prometheusのリソース定義。ドキュメントに記載されていたサンプルのリソース定義を参考に、以下のように作成。
※全体は、最後に載せます
resources.yml
--- ## ImageStream apiVersion: v1 kind: ImageStream metadata: labels: app: prometheus name: prometheus spec: lookupPolicy: local: false tags: - from: kind: DockerImage name: prom/prometheus:v2.8.0 importPolicy: {} name: v2.8.0 referencePolicy: type: Source --- ## DeploymentConfig apiVersion: v1 kind: DeploymentConfig metadata: labels: app: prometheus name: prometheus spec: replicas: 1 selector: app: prometheus deploymentconfig: prometheus strategy: type: Rolling template: metadata: labels: app: prometheus deploymentconfig: prometheus spec: serviceAccountName: prometheus-sa containers: - image: prom/prometheus:v2.8.0 imagePullPolicy: IfNotPresent name: prometheus ports: - containerPort: 9090 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - name: config-volume mountPath: /etc/prometheus - name: prometheus-volume-1 mountPath: /prometheus restartPolicy: Always securityContext: {} terminationGracePeriodSeconds: 30 volumes: - name: config-volume configMap: name: prometheus-config - emptyDir: {} name: prometheus-volume-1 triggers: - type: ConfigChange - imageChangeParams: automatic: true containerNames: - prometheus from: kind: ImageStreamTag name: prometheus:v2.8.0 type: ImageChange --- ## ConfigMap apiVersion: v1 kind: ConfigMap metadata: labels: app: prometheus name: prometheus-config data: prometheus.yml: | global: scrape_interval: 10s evaluation_interval: 10s scrape_configs: # apiservers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # label「__meta_kubernetes_namespace」がdefault、「__meta_kubernetes_service_name」がkubernetes、 #「__meta_kubernetes_endpoint_port_name」がhttpsのもののみに絞る(keep) - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https # nodes - job_name: 'kubernetes-nodes' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # 「__meta_kubernetes_node_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics # cadvisor - job_name: 'kubernetes-cadvisor' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # 「__meta_kubernetes_node_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor # endpoints - job_name: 'kubernetes-service-endpoints' kubernetes_sd_configs: - role: endpoints relabel_configs: # 「__meta_kubernetes_service_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_service_label_(.+) # 「__meta_kubernetes_namespace」の値をlabel「kubernetes_namespace」として追加する - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace # 「__meta_kubernetes_service_name」の値をlabel「kubernetes_name」として追加する - source_labels: [__meta_kubernetes_service_name] action: replace target_label: kubernetes_name # service #- job_name: 'kubernetes-services' # kubernetes_sd_configs: # - role: service # metrics_path: /probe # params: # module: [http_2xx] # relabel_configs: # - source_labels: [__address__] # target_label: __param_target # - target_label: __address__ # replacement: blackbox-exporter.example.com:9115 # - source_labels: [__param_target] # target_label: instance # # 「__meta_kubernetes_service_label_」以降をlabelとして追加する # - action: labelmap # regex: __meta_kubernetes_service_label_(.+) # # 「__meta_kubernetes_namespace」の値をlabel「kubernetes_namespace」として追加する # - source_labels: [__meta_kubernetes_namespace] # target_label: kubernetes_namespace # # 「__meta_kubernetes_service_name」の値をlabel「kubernetes_name」として追加する # - source_labels: [__meta_kubernetes_service_name] # target_label: kubernetes_name # pod - job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: # 「__meta_kubernetes_pod_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_pod_label_(.+) # 「__meta_kubernetes_namespace」の値をlabel「kubernetes_namespace」として追加する - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace # 「__meta_kubernetes_pod_name」の値をlabel「kubernetes_pod_name」として追加する - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name --- ## Service apiVersion: v1 kind: Service 〜省略〜 --- ## Route apiVersion: v1 kind: Route 〜省略〜
PrometheusのWeb UIを見たいので、Routeも定義しています。
DeploymentConfigでは、先ほど作成したService Accountを使うようにします。
spec: serviceAccountName: prometheus-sa
至るところにTLSやトークンに関する設定があるのは、PrometheusからKubernetes APIにアクセスするためですね。
tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
設定ファイルは、ConfigMapからマウントするようにしています。あと、emptyDirでPrometheusのイメージが要求する
Volumeを割り当てています。
volumeMounts: - name: config-volume mountPath: /etc/prometheus - name: prometheus-volume-1 mountPath: /prometheus restartPolicy: Always securityContext: {} terminationGracePeriodSeconds: 30 volumes: - name: config-volume configMap: name: prometheus-config - emptyDir: {} name: prometheus-volume-1
設定ファイルについていろいろ言う前に、まずはデプロイしておきましょう。
$ oc apply -f resources.yml imagestream.image.openshift.io/prometheus created deploymentconfig.apps.openshift.io/prometheus created configmap/prometheus-config configured service/prometheus created route.route.openshift.io/prometheus created
デプロイされました、と。
$ oc get all NAME READY STATUS RESTARTS AGE pod/prometheus-1-82mx6 1/1 Running 0 53m NAME DESIRED CURRENT READY AGE replicationcontroller/prometheus-1 1 1 1 53m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/prometheus ClusterIP 172.30.229.157 <none> 9090/TCP 53m NAME REVISION DESIRED CURRENT TRIGGERED BY deploymentconfig.apps.openshift.io/prometheus 1 1 1 config,image(prometheus:v2.8.0) NAME DOCKER REPO TAGS UPDATED imagestream.image.openshift.io/prometheus 172.30.1.1:5000/myproject/prometheus v2.8.0 About an hour ago NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD route.route.openshift.io/prometheus prometheus-myproject.192.168.42.160.nip.io prometheus 9090-tcp None
試しに、Web UIを使ってPodから取得したメトリクスを見てみましょう。PromQLは、「{job="kubernetes-pods"}」です。
いろいろ情報が取得できています。
今回のPrometheusの設定は、ドキュメントのサンプルに習って以下の種類で並べています。
scrape_configs: # apiservers - job_name: 'kubernetes-apiservers' 〜省略〜 # nodes - job_name: 'kubernetes-nodes' 〜省略〜 # cadvisor - job_name: 'kubernetes-cadvisor' 〜省略〜 # endpoints - job_name: 'kubernetes-service-endpoints' 〜省略〜 # service #- job_name: 'kubernetes-services' # 〜省略〜 # pod - job_name: 'kubernetes-pods' 〜省略〜
cAdvisorについては、今回はパス…。コンテナのメトリクスを取得するものらしいですが、これはまたの機会に。
Tools for Monitoring Compute, Storage, and Network Resources - Kubernetes
また、Serviceについても今回は省略します(LoadBalancerタイプをデプロイするわけでもないので)。-
Kubernetes SDでは、メトリクスを取得するリソースに応じて「role」を指定します。
- job_name: 'kubernetes-nodes' kubernetes_sd_configs: - role: node # pod - job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod
これらのリソースの情報にPrometheusからアクセスするために、RBACの設定をしたというわけですね。
※KubernetesのAPIを使用しています
https://github.com/prometheus/prometheus/tree/v2.8.0/discovery/kubernetes
あと、少々コメントを入れているのですが、「relabel_configs」を使ってJobごとに収集するメトリクスのフィルタリングや
labelの設定などを行っているようです。
# apiservers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # label「__meta_kubernetes_namespace」がdefault、「__meta_kubernetes_service_name」がkubernetes、 #「__meta_kubernetes_endpoint_port_name」がhttpsのもののみに絞る(keep) - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https # pod - job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: # 「__meta_kubernetes_pod_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_pod_label_(.+) # 「__meta_kubernetes_namespace」の値をlabel「kubernetes_namespace」として追加する - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace # 「__meta_kubernetes_pod_name」の値をlabel「kubernetes_pod_name」として追加する - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name
Prometheusのrelabel config例 - Qiita
「endpoints」roleを例にしてみます。
今回は、同じ「endpoints」からメトリクスを取得するrole指定でも、apiserverのみに絞ったものとぜんぶのendpointsから取得するものを
別々に定義したり、メトリクス収集対象に付与されたlabelをメトリクスのlabelに変換したりしています。
このlabelですが、「Status」→「Targets」や「Service Discovery」から確認することができます。
たとえば、「Targets」で確認してみます。
「show more」と書かれた部分は展開することができ、変換されたlabelを確認することができます。
マウスオーバーすると、変換される前のlabelも確認することができるようです。
「Service Discovery」で見てみます。
「Service Discovery」の場合は、対象に付与されたlabelを「Discovered Labels」として、「relabel_configs」で変換された値を
「Target Labels」として確認できるようです(「Targets」のLabelに相当しますね)。
このように「relabel_configs」で変換されたりしたlabelを、PromQLを使うことで確認することができます、と。
こうやって結果を見てみないと、「relabel_configs」ってわかりにくいですね…。
フィルタリングの例は、apiserversです。
# apiservers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # label「__meta_kubernetes_namespace」がdefault、「__meta_kubernetes_service_name」がkubernetes、 #「__meta_kubernetes_endpoint_port_name」がhttpsのもののみに絞る(keep) - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https
apiserversはEndpointを使って収集しているのですが、「relabel_configs」で指定した条件にマッチしたものしか残らないように
なっています。
なにも絞っていないendpointsが10個の対象があるのに対して、apiserversがひとつになっているのはフィルタリングされているからですね。
cAdvisorに関していえば、メトリクス収集の際の情報自体を書き換えています。
# cadvisor - job_name: 'kubernetes-cadvisor' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # 「__meta_kubernetes_node_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
「kubernetes-cadvisor」の「Endpoint」の箇所とYAML定義の部分を見比べるとよいと思いますが、「_address__」や
「_metrics_path__」labelを書き換えることにより、メトリクス収集時の情報を書き換えているようです。
こういう使い方もできるんですねぇ。
また、PodやService Endpointなどに関しては、けっこうな数の「Status」が「Down」になっています。
これは、メトリクス収集のデフォルトの設定で動作するのが、Prometheusくらいしかいないからだと思います…。
# The HTTP resource path on which to fetch metrics from targets.
[ metrics_path:
| default = /metrics ]
実際、「Status」が「Up」になっているのはPrometheusだけです。
他のPod(apiserverなど)では、どのようにすれば「Up」になるか調べるか、除外するかしないとこのままだと利用するのは
難しいですね。
まとめ
PrometheusをOKD(Kubernetes)にデプロイして、ドキュメントに習ってメトリクスを取得してみました。
Kubernetesからどのような情報がメトリクスとして取得でき、どう見たらよいのかがわからないとなかなか厳しいかなぁという
印象です。
Monitor Node Health - Kubernetes
Tools for Monitoring Compute, Storage, and Network Resources - Kubernetes
ちょっとずつ情報を調べて、適切なものを選択していくしかないんでしょうねぇ。
まずは、PrometheusからKubernetes APIを使ってメトリクスが取得できるということと、「relabel_configs」について
なんとなく挙動を押さえることができたかなぁと思います。
今後、もうちょっと調べて理解を深めていくとしましょうか…。
オマケ
最後に、リソース定義をしたYAML全体を載せておきます。
resources.yml
--- ## ImageStream apiVersion: v1 kind: ImageStream metadata: labels: app: prometheus name: prometheus spec: lookupPolicy: local: false tags: - from: kind: DockerImage name: prom/prometheus:v2.8.0 importPolicy: {} name: v2.8.0 referencePolicy: type: Source --- ## DeploymentConfig apiVersion: v1 kind: DeploymentConfig metadata: labels: app: prometheus name: prometheus spec: replicas: 1 selector: app: prometheus deploymentconfig: prometheus strategy: type: Rolling template: metadata: labels: app: prometheus deploymentconfig: prometheus spec: serviceAccountName: prometheus-sa containers: - image: prom/prometheus:v2.8.0 imagePullPolicy: IfNotPresent name: prometheus ports: - containerPort: 9090 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - name: config-volume mountPath: /etc/prometheus - name: prometheus-volume-1 mountPath: /prometheus restartPolicy: Always securityContext: {} terminationGracePeriodSeconds: 30 volumes: - name: config-volume configMap: name: prometheus-config - emptyDir: {} name: prometheus-volume-1 triggers: - type: ConfigChange - imageChangeParams: automatic: true containerNames: - prometheus from: kind: ImageStreamTag name: prometheus:v2.8.0 type: ImageChange --- ## ConfigMap apiVersion: v1 kind: ConfigMap metadata: labels: app: prometheus name: prometheus-config data: prometheus.yml: | global: scrape_interval: 10s evaluation_interval: 10s scrape_configs: # apiservers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # label「__meta_kubernetes_namespace」がdefault、「__meta_kubernetes_service_name」がkubernetes、 #「__meta_kubernetes_endpoint_port_name」がhttpsのもののみに絞る(keep) - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https # nodes - job_name: 'kubernetes-nodes' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # 「__meta_kubernetes_node_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics # cadvisor - job_name: 'kubernetes-cadvisor' kubernetes_sd_configs: - role: node scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: # 「__meta_kubernetes_node_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor # endpoints - job_name: 'kubernetes-service-endpoints' kubernetes_sd_configs: - role: endpoints relabel_configs: # 「__meta_kubernetes_service_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_service_label_(.+) # 「__meta_kubernetes_namespace」の値をlabel「kubernetes_namespace」として追加する - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace # 「__meta_kubernetes_service_name」の値をlabel「kubernetes_name」として追加する - source_labels: [__meta_kubernetes_service_name] action: replace target_label: kubernetes_name # service #- job_name: 'kubernetes-services' # kubernetes_sd_configs: # - role: service # metrics_path: /probe # params: # module: [http_2xx] # relabel_configs: # - source_labels: [__address__] # target_label: __param_target # - target_label: __address__ # replacement: blackbox-exporter.example.com:9115 # - source_labels: [__param_target] # target_label: instance # # 「__meta_kubernetes_service_label_」以降をlabelとして追加する # - action: labelmap # regex: __meta_kubernetes_service_label_(.+) # # 「__meta_kubernetes_namespace」の値をlabel「kubernetes_namespace」として追加する # - source_labels: [__meta_kubernetes_namespace] # target_label: kubernetes_namespace # # 「__meta_kubernetes_service_name」の値をlabel「kubernetes_name」として追加する # - source_labels: [__meta_kubernetes_service_name] # target_label: kubernetes_name # pod - job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: # 「__meta_kubernetes_pod_label_」以降をlabelとして追加する - action: labelmap regex: __meta_kubernetes_pod_label_(.+) # 「__meta_kubernetes_namespace」の値をlabel「kubernetes_namespace」として追加する - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace # 「__meta_kubernetes_pod_name」の値をlabel「kubernetes_pod_name」として追加する - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name --- ## Service apiVersion: v1 kind: Service metadata: labels: app: prometheus name: prometheus spec: ports: - name: 9090-tcp port: 9090 protocol: TCP targetPort: 9090 selector: app: prometheus deploymentconfig: prometheus sessionAffinity: None type: ClusterIP --- ## Route apiVersion: v1 kind: Route metadata: labels: app: prometheus name: prometheus spec: port: targetPort: 9090-tcp to: kind: Service name: prometheus weight: 100 wildcardPolicy: None