minikube にインストールした prometheus-operator でクラスター外のサービスを登録してみた

ワタシは社内で、Kubernetes (K8s) を使った開発に携わっています。
中でも、どのようにサービスを監視するかについて、検討中なのですが、K8s と相性の良さそうな prometheus の利用を検討しようと考えています。
prometheus を導入する場合、helm を利用して、prometheus-operator をインストールするのが、お手軽のようです。

[前回の投稿](https://qiita.com/y-kimura-39ra/items/686829f300562218fd0e)の続きで、今回は、クラスター外のサービスを prometheus-operator に監視登録する流れをまとめてみました。
詳細は把握できていないのですが、外部サービスを ServiceMonitor として読み込ませると、prometheus-operator が自動的に対象サービスを拾ってくれて、監視対象として追加してくれる仕様のようでした。

## 環境について
Windows10 : バージョン1909
VirtualBox(Windows用) : 6.1.8
minikube(Windows用) : v1.9.2
docker(Ubuntu用) : 19.03.11
kubectl(Linux用) : Client Version: v1.18.2
helm(Linux用)：v3.2.0
stable/prometheus-operator : CHART VERSION: 8.14.0

## 監視対象のサービスを準備する
どんな外部サービスを準備していただいても監視登録できそうなのですが、ワタシは、簡易的に VirtualBox 上に、仮想マシンを一つ作成しました。
WSL で準備したものと同じように、Ubuntu 18.04 LTS の仮想マシンを準備しました。

詳細は、割愛させていただきますが、[コチラ](https://qiita.com/apatchk/items/8b1029ceaee60d3e18a2)を参考に、WSL で、Vagrant を扱えるように設定いたしました。

ただし、私の環境では、[ubuntu/bionic64](https://app.vagrantup.com/ubuntu/boxes/bionic64) のオフィシャルBoxでは、起動できない状態でしたので、代わりに、[bento/ubuntu-18.04](https://app.vagrantup.com/bento/boxes/ubuntu-18.04) のBoxを利用させていただきました。

参考までに、ワタシが使いました Vagrantfile は、下記の通りとなります。

<details><summary>**Vagrantfile**</summary><div>

```
Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-18.04"
  config.vm.define "bento-ubuntu-18.04"
  config.vm.network "private_network", type: "dhcp"
  config.vm.provider "virtualbox" do |vb|
    vb.name = "bento-ubuntu-18.04"
    vb.memory = "2048"
  end
end
```
</div></details>

仮想マシンが準備できましたら、prometheus で仮想マシンの監視データが取得できるように、基本となる node_exporter をインストールいたしました。同時に、仮想マシンの IPアドレスを確認しておきました。

- **仮想マシン上で実行**

```
:~# apt install prometheus-node-exporter
:~# systemctl start prometheus-node-exporter
:~# systemctl enable prometheus-node-exporter
:~# ip a s eth1 | grep -w inet | awk '{print $2}'
{{仮想マシンのIPアドレス}}/24
```

仮想マシンに node_exporter がインストールできましたら、WSL上で、下記のようにエンドポイントにアクセスして情報が取得できることを確認しておきました。

- **WSL 上で実行**

```
:~# curl -s http://{{仮想マシンのIPアドレス}}:9100/metrics | head
```

ワタシの環境では既に設定済みの状態なのですが、仮想マシンのネットワークのアダプター2（ホストオンリーアダプター）で外部ネットワークと繋がるために、もしかしたら[コチラ](https://qiita.com/a__i__r/items/fbd1a8d8f9d902a1bf6a)を参考に Windows 側の設定を変更していただく必要があるかもです。

## 監視対象を prometheus に認識させる
この投稿の下部の参考サイトを参考にして、監視対象を prometheus に認識させるための yaml ファイルを準備いたしました。
注意点は下記の3点になります。

- prometheus-operator インストール時と同じ名前空間を指定する
- helm で指定したリリース名と同じリリース名をラベルに追加する
- サービスの yaml に spec.type: ExternalName を指定、 spec.externalName: に監視対象のIPアドレスを指定する

ワタシが準備した yaml は下記の通りとなります。

```sample01-vm01-ep.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: monitor-sample01-vm01
  namespace: sample01space
  labels:
    app: monitor-sample01-vm01
    release: monitor
subsets:
  - addresses:
      - ip: {{仮想マシンのIPアドレス}}
    ports:
      - name: metrics
        port: 9100
```
```sample01-vm01-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: monitor-sample01-vm01
  namespace: sample01space
  labels:
    app: monitor-sample01-vm01
    release: monitor
spec:
  type: ExternalName
  externalName: {{仮想マシンのIPアドレス}}
  ports:
    - name: metrics
      port: 9100
      targetPort: 9100
```
```sample01-vm01-sm.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: monitor-sample01-vm01
  namespace: sample01space
  labels:
    app: monitor-sample01-vm01
    release: monitor
spec:
  selector:
    matchLabels:
      app: monitor-sample01-vm01
      release: monitor
  namespaceSelector:
    matchNames:
      - sample01space
  endpoints:
    - port: metrics
      interval: 10s
```

各 yaml を読み込ませた後、https://{{minikubeのIPアドレス}}/sample01space/prom/service-discovery にアクセスしていただきますと、画像例のように監視対象が追加されていることが確認できるかと思われます。

```
:~# kubectl apply -f sample01-vm01-ep.yaml -f sample01-vm01-svc.yaml -f sample01-vm01-sm.yaml
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285858/59e17f3f-9d99-720b-91e2-9c21f938282d.png" width=75%>

## おわりに
いかがでしたでしょうか。
prometheus-operator の監視対象の追加について、日本語の参照先が少ないようですので、こんな感じと参考にいただけると、ありがたいです。

## 参考サイト
[Prometheus Operator — How to monitor an external service](https://devops.college/prometheus-operator-how-to-monitor-an-external-service-3cb6ac8d5acb)
[Monitor external services with the prometheus operator](https://jpweber.io/blog/monitor-external-services-with-the-prometheus-operator/)
[Windows10 WSL から Vagrant を起動する](https://qiita.com/apatchk/items/8b1029ceaee60d3e18a2)
[【VirtualBox】ホストオンリーアダプタでのインターネット接続](https://qiita.com/a__i__r/items/fbd1a8d8f9d902a1bf6a)