CLOVER🍀

That was when it all began.

OKD/Minishift上に、Prometheusをデプロイしてみる

これは、なにをしたくて書いたもの?

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_config

Kubernetes SDでは、KubernetesREST 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/prometheus-kubernetes.yml

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を使用します。

prom/prometheus

OKDにPrometheusをデプロイする

PrometheusのKubernetes SDはKubernetesAPIにアクセスすることになるのですが、Podとして動くPrometheusから
KubernetesAPIにアクセスすることになるため、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"}」です。

f:id:Kazuhira:20190317004822p:plain

いろいろ情報が取得できています。

今回の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

GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

また、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の設定をしたというわけですね。
KubernetesAPIを使用しています

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

relabel_config

Prometheusのrelabel config例 - Qiita

「endpoints」roleを例にしてみます。

今回は、同じ「endpoints」からメトリクスを取得するrole指定でも、apiserverのみに絞ったものとぜんぶのendpointsから取得するものを
別々に定義したり、メトリクス収集対象に付与されたlabelをメトリクスのlabelに変換したりしています。

このlabelですが、「Status」→「Targets」や「Service Discovery」から確認することができます。

f:id:Kazuhira:20190324155810p:plain

たとえば、「Targets」で確認してみます。

「show more」と書かれた部分は展開することができ、変換されたlabelを確認することができます。

f:id:Kazuhira:20190324155955p:plain

マウスオーバーすると、変換される前のlabelも確認することができるようです。

f:id:Kazuhira:20190324164822p:plain

「Service Discovery」で見てみます。

f:id:Kazuhira:20190324160146p:plain

「Service Discovery」の場合は、対象に付与されたlabelを「Discovered Labels」として、「relabel_configs」で変換された値を
「Target Labels」として確認できるようです(「Targets」のLabelに相当しますね)。

f:id:Kazuhira:20190324160326p:plain

このように「relabel_configs」で変換されたりしたlabelを、PromQLを使うことで確認することができます、と。

f:id:Kazuhira:20190324160413p:plain

こうやって結果を見てみないと、「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がひとつになっているのはフィルタリングされているからですね。

f:id:Kazuhira:20190324160146p:plain

f:id:Kazuhira:20190324162429p:plain

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を書き換えることにより、メトリクス収集時の情報を書き換えているようです。

f:id:Kazuhira:20190324165124p:plain

こういう使い方もできるんですねぇ。

また、PodやService Endpointなどに関しては、けっこうな数の「Status」が「Down」になっています。

f:id:Kazuhira:20190324161036p:plain

これは、メトリクス収集のデフォルトの設定で動作するのが、Prometheusくらいしかいないからだと思います…。

# The HTTP resource path on which to fetch metrics from targets.

[ metrics_path: | default = /metrics ]

<scrape_config>

実際、「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