Prometheus and Grafana Helm Install For EKS 設定 ① Prometheusをインストール

EKS環境へ、Prometheus and Grafanaを入れたメモ

## StorageClassを定義する

データの永続化する場所を定義。

```:prometheus-storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: prometheus
  namespace: prometheus
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
```

```
$ kubectl apply -f prometheus-storageclass.yaml
```


## prometheus-values.yamlの準備

Prometheusは主に
Prometheus Server,Alertmanager,Exporter,Pushgatewayの4つのマイクロサービスで成り立っている。
参考: [Prometheus でスケーラブルな監視基盤を作ってみよう！ 〜概要編〜](https://seroku.jp/wp/prometheus-%E3%81%A7%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB%E3%81%AA%E7%9B%A3%E8%A6%96%E5%9F%BA%E7%9B%A4%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81/)

ここで取得する設定ファイルはすごく長いが、上記４サービスの設定が全て記載されており、
よくみるとそれぞれの設定に分けられるので、よく見ること。


```:chartの確認
$ helm search prometheus
NAME                                 	CHART VERSION	APP VERSION	DESCRIPTION
stable/prometheus                    	9.3.1        	2.13.1     	Prometheus is a
...
```

```:デフォルトの設定値を取得する。
$ helm inspect values stable/prometheus > prometheus-values.yaml
```

```:pushgatewayは今回は使わないので無効化
pushgateway:
  ## If false, pushgateway will not be installed
  ##
  enabled: false 

　移行の記述も邪魔なので削除
```

```:server.service公開をNodePortへ
    servicePort: 80
    nodePort: 30000 # 不要？
    type: NodePort
```


```:serverとalertmanagerのstorageClassをprometheusに変更
  storageClass: "prometheus"
```

## 変更するところ(ALB Ingress Controller使う用)

私の環境では[こちら](https://daichan.club/container/78878)の環境を設定しているので、
これらを設定します。

```:ingressを有効化、server.ingress.annotationsへ設定を追加
  ingress:
    ## If true, Prometheus server Ingress will be created
    ##
    enabled: true

    ## Prometheus server Ingress annotations
    ##
    annotations:
      kubernetes.io/ingress.class: alb
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/security-groups: セキュリティグループ名
```

```:server.ingress.hostsを設定する
    hosts: 
      -　prometheus.XXXX.com
```

## prometheusの起動

```:起動
helm install -f prometheus-values.yaml stable/prometheus --name prometheus --namespace prometheus
```

ここまでで画面が確認できるはずなのだが、、http:://prometheus.XXXX.comを確認したが、503となった。
ELB ingress controllerがserverを見つけられないようだ...

```:ERROR
 kubebuilder/controller "msg"="Reconciler error" "error"="no object matching key \"prometheus/prometheus-server\" in local store"  "Controller"="alb-ingress-controller" "Request"={"Namespace":"prometheus","Name":"prometheus-server"}
```

server.ingress部分を全て削除し、ingressを自分でapplyしてみる。

```:ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: "ingress"
  namespace: "prometheus"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/security-groups: セキュリティグループコード
  labels:
    app: prometheus-ingress
spec:
  rules:
    - host: prometheus.XXXX.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: "prometheus-server"
              servicePort: 80
```

```
kubectl apply -f ingress.yaml
```

画面を見ることができた。
<img width="1679" alt="スクリーンショット 2019-11-11 14.19.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28820/a486f677-878b-7e1f-4917-b9de7a3bcaf6.png">

```:状態確認
kubectl get all -n prometheus
NAME                                                 READY   STATUS    RESTARTS   AGE
pod/prometheus-alertmanager-6f5c6d6f49-pprwj         2/2     Running   0          56m
pod/prometheus-kube-state-metrics-7fddb795c8-7qqlx   1/1     Running   0          56m
pod/prometheus-node-exporter-cjj2d                   1/1     Running   0          56m
pod/prometheus-node-exporter-sx6st                   1/1     Running   0          56m
pod/prometheus-server-775cc84c8f-9ptbd               2/2     Running   0          56m

NAME                                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/prometheus-alertmanager         ClusterIP   10.100.165.160   <none>        80/TCP         56m
service/prometheus-kube-state-metrics   ClusterIP   None             <none>        80/TCP         56m
service/prometheus-node-exporter        ClusterIP   None             <none>        9100/TCP       56m
service/prometheus-server               NodePort    10.100.130.6     <none>        80:30000/TCP   56m

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/prometheus-node-exporter   2         2         2       2            2           <none>          56m

NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/prometheus-alertmanager         1/1     1            1           56m
deployment.apps/prometheus-kube-state-metrics   1/1     1            1           56m
deployment.apps/prometheus-server               1/1     1            1           56m

NAME                                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/prometheus-alertmanager-6f5c6d6f49         1         1         1       56m
replicaset.apps/prometheus-kube-state-metrics-7fddb795c8   1         1         1       56m
replicaset.apps/prometheus-server-775cc84c8f               1         1         1       56m
```

不要な設定部分を削除し、最終的な形はこうなりました。
configmapReloadはこの後、利用すると思うので、残してあります。

```:prometheus-value.yaml
##########
## alertmanager ##
##########
alertmanager:
  ## If false, alertmanager will not be installed
  ##
  enabled: true

  ## alertmanager container name
  ##
  name: alertmanager

  ## alertmanager container image
  ##
  image:
    repository: prom/alertmanager
    tag: v0.18.0
    pullPolicy: IfNotPresent

  persistentVolume:
    enabled: true
    accessModes:
      - ReadWriteOnce
    mountPath: /data
    size: 2Gi
    storageClass: "prometheus"
    subPath: ""

  ## Annotations to be added to alertmanager pods
  ##
  podAnnotations: {}

  service:
    annotations: {}
    labels: {}
    servicePort: 80
    type: ClusterIP

##########
## configmapReload ##
##########
configmapReload:
  ## configmap-reload container name
  ##
  name: configmap-reload

  ## configmap-reload container image
  ##
  image:
    repository: jimmidyson/configmap-reload
    tag: v0.2.2
    pullPolicy: IfNotPresent

nodeExporter:
  image:
    repository: prom/node-exporter
    tag: v0.18.0
    pullPolicy: IfNotPresent
##########
## server ##
##########
server:
  ## Prometheus server container name
  ##
  enabled: true
  name: server
  sidecarContainers:

  ## Prometheus server container image
  ##
  image:
    repository: prom/prometheus
    tag: v2.13.1
    pullPolicy: IfNotPresent
  ## Prometheus server persistentVolume
  ##
  persistentVolume:
    enabled: true
    accessModes:
      - ReadWriteOnce
    existingClaim: ""
    mountPath: /data
    size: 8Gi
    storageClass: "prometheus"
    subPath: ""
  ## Prometheus server service
  ##
  service:
    servicePort: 80
    nodePort: 30000
    type: NodePort # 外部から見る為、NodePortに変更
##########
## pushgateway ##
##########
pushgateway:
  enabled: false # 利用しない

```
### 備考
下記コマンドでdeleteしながらトライアンドエラーを繰り返しました。

```
helm delete prometheus
helm del --purge prometheus
```