Windows10 の minikube を WSL から利用して、prometheus-operator を使ってみた

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

## 環境について
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

## Windows10上での事前準備について
VirtualBox と minikube のインストーラーをダウンロードして、インストールします。
VirtualBox は、[コチラ](https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html)から、minikube は、[コチラ](https://github.com/kubernetes/minikube/releases/latest/download/minikube-installer.exe)からそれぞれダウンロードしました。

## WSL上での事前準備について
詳細は割愛しますが、WSLは、［Windowsの機能の有効化または無効化］から「Windows Subsystem for Linux」の機能を有効にしています。
Microsoft Store から、Ubuntu 18.04 LTS をインストールしました。
WSL 起動後は、**sudo -i** で root になって、作業しています。

kubectl は、[コチラ](https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux)を参考にバイナリを、docker は、[コチラ](https://docs.docker.com/engine/install/ubuntu/)を参考にリポジトリを追加してインストールしました。

また、WSL から Windows 側にインストールした minikube を扱えるように、[コチラ](https://qiita.com/tettsu__/items/c2912382cc2d76ed6e38)を参考に、以下のように、config を設定しました。{{WindowsAccountName}} は、ご自身の環境に合わせて適宜変更ください。

**minikube ip** で、ブラウザからアクセスするときのIPアドレスの確認と、**ingress のアドオンを有効に**しておいてください。

```
:~# mkdir ~/.kube
:~# cp /mnt/c/Users/{{WindowsAccountName}}/.kube/config ~/.kube/
:~# sed -i -e 's|\\|/|g' -e 's|C:|/mnt/c|g' ~/.kube/config
:~# ln -s /mnt/c/Program\ Files/Kubernetes/Minikube/minikube.exe /usr/local/sbin/minikube
:~# minikube start
:~# minikube ip
:~# minikube addons enable ingress
```

helm は、[コチラ](https://helm.sh/docs/intro/install/)を参考に get-helm-3 のスクリプトを実行して、インストールしました。

## prometheus-operator をインストールする
prometheus-operator をインストールすると、prometheus に関連する alertmanager / grafana が同時にインストールされ、お手軽です。

prometheus のインストール用に、sample01space という名前空間を準備しました。
判別しやすくするために prometheus / grafana にアクセスする場合の URL をカスタム設定に追加するようにして、リリース名は、monitor という名前でインストールしました。

```
:~# helm repo add stable https://kubernetes-charts.storage.googleapis.com
:~# kubectl create namespace sample01space
:~# helm install monitor -n sample01space stable/prometheus-operator -f custom-values.yaml
```
```custom-values.yaml
prometheus:
  prometheusSpec:
    externalUrl: /sample01space/prom
    routePrefix: /sample01space/prom/
grafana:
  grafana.ini:
    server:
      root_url: /sample01space/grafana
      serve_from_sub_path: "true"
```

## prometheus Web UI へのアクセス時に認証を追加する
prometheus の Web UI へのアクセス時には特に認証がかかっていないようですので、ingress を使って、簡易な認証を追加するようにいたしました。

```
:~# apt install apache2-utils
:~# htpasswd -c auth admin
:~# kubectl create secret generic basic-auth --from-file=auth -n sample01space
:~# kubectl create -f ingress.yaml -n sample01space
```
```ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: monitor-ingress
  namespace: sample01space
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - path: /?(.*)
        backend:
          serviceName: monitor-prometheus-operato-prometheus
          servicePort: 9090

      - path: /sample01space/altm/?(.*)
        backend:
          serviceName: alertmanager-operated
          servicePort: 9093

      - path: /sample01space/grafana/?(.*)
        backend:
          serviceName: monitor-grafana
          servicePort: 80
```

以上を実行しましたら、ブラウザで下記にアクセスすると、認証を求められますので、admin と htpasswd で設定したパスワードで表示されるようになると思います。
/prom/ は prometheus の Web UI 、/altm/ は、alertmanager の Web UI 、/grafana/ は、grafana の Web UI が表示されるかと思います。
grafana へのログインには、もう一段階 admin と 下記、**kubectl get secret** で表示されるパスワードが必要となっています。

```
http://{{minikubeのIPアドレス}}/sample01space/prom/
http://{{minikubeのIPアドレス}}/sample01space/altm/
http://{{minikubeのIPアドレス}}/sample01space/grafana/
```

```
:~# kubectl get secret -n sample01space monitor-grafana -o jsonpath="{.data.admin-password}" | ba
se64 --decode; echo
```

## おわりに
駆け足で、流れだけ追う感じでしたが、いかがでしたでしょうか。
ワタシ自身、yaml ファイルでの制御について、まだまだ理解が不十分ですので、あくまでこんな感じくらいで温かく見守っていただけると、ありがたいです。

本投稿の続きを以下に投稿いたしました。よろしければ、ご参照ください。
https://qiita.com/y-kimura-39ra/items/fb3dc0bffc1ddfb560d2

## 参考サイト
[WSLでの~/.kube/config](https://qiita.com/tettsu__/items/c2912382cc2d76ed6e38)
[Setting up Kubernetes on WSL to work with Minikube on Windows 10](https://medium.com/@joaoh82/setting-up-kubernetes-on-wsl-to-work-with-minikube-on-windows-10-90dac3c72fa1)
[HelmおよびPrometheusオペレーターを使用してDigitalOcean Kubernetesクラスター監視を設定する方法](https://www.codeflow.site/ja/article/how-to-set-up-digitalocean-kubernetes-cluster-monitoring-with-helm-and-prometheus-operator)
[helm/charts/stable/prometheus-operator/](https://github.com/helm/charts/tree/master/stable/prometheus-operator)
[IngressでBasic認証を使いたい時のメモ](https://qiita.com/m3816/items/71acc0fd9933062b74a0)