[lv4] ft_services (6/6) grafana実装

<- 前(5/6) ftps実装
->次(7/6) grafanaで視覚化

9. ftps作る
(10. ftpsを永続ボリューム化)
11. grafanaの起動
12. influxdb -> grafana連携
13. telegraf -> influxDB連携
14. grafanaカスタマイズ
15. grafanaのprovisioning
16. livenessprobe

11. grafanaの起動
Q. grafanaとは?
A. アプリケーションごとのメモリ使用量やCPU使用量を、視覚化するツール。どんなにダサくしようとも、おしゃれ不可避。

画像1

まずハリボテgrafanaを実装。yamlとconfigファイルだけで起動できます。
LoadBalancerなのでnginx.yamlをベースに設定します

/srcs/grafana/grafana.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
   app: grafana
 name: grafana
spec:  # podの概要
 replicas: 1
 selector:
   matchLabels:
     app: grafana
 template: # podのtemplate
   metadata:
     labels:
       app: grafana
   spec:
     containers:
     - image: mygrafana
       imagePullPolicy: Never
       name: grafana
       ports:
       - containerPort: 3000 # コンテナに外部からアクセスするポート。Exposeと同じポート。ここは無しでもいけるかも

---
apiVersion: v1
kind: Service
metadata:
 name: grafana
 annotations:
   metallb.universe.tf/allow-shared-ip: "ft_services"
spec:
 type: LoadBalancer
 selector:
   app: grafana
 ports:
   - name: grafana
     port: 3000

Q. 変更箇所は?
A. 名称(grafana)とport(3000)を指定します

/srcs/grafana/custom.ini
・もともと用意されているサンプルが膨大で目滑りしてしまいますが。[Server]の3か所だけ変更。
https://github.com/grafana/grafana/blob/main/conf/defaults.ini

#################################### Server ##############################
[server]

# 1.httpsにします
protocol = https

http_addr =
http_port = 3000
domain = localhost
enforce_domain = false
root_url = %(protocol)s://%(domain)s:%(http_port)s/
serve_from_sub_path = false
router_logging = false
static_root_path = public
enable_gzip = false

# 2.ssl証明書のある場所を指定
cert_file = /etc/nginx/ssl/ft_service.crt
cert_key = /etc/nginx/ssl/ft_service.key

socket = /tmp/grafana.sock
cdn_url =

#################################### Database ############################
[database]

/srcs/grafana/Dockerfile

FROM basecamp

COPY start.sh /tmp/start.sh
COPY cuntom.ini /grafana/custom.ini

RUN chmod -R 755 /tmp

EXPOSE 3000
CMD ["/tmp/start.sh"]

/srcs/grafana/start.sh

#!/bin/sh

/grafana/bin/grafana-server -homepath /grafana --config /grafana/custom.ini

Q. -homepath?
A. cd /grafana
/grafanaにいないと、grafana-serverが実行できないようです。
オプション -homepathにて、grafanaがある階層を指定します。
今回は最上階層/にgrafana設置を想定。
--configは必須です。
grafana-serverは起動し続けるコマンドなので、tail -f不要。

/run.sh追記

# delete
kubectl delete -f srcs/grafana/grafana.yaml

# image
docker build -t mygrafana srcs/grafana/.

# apply
kubectl apply -f srcs/grafana/grafana.yaml


sh ./run.sh
https://192.168.10.10:3000
Q. https?
A. https通信であれば、custom.iniの読み込みに成功しています。
また、cunsom.iniの初期設定により、admin / adminユーザでログイン可能です。

Q. influxDBを読み取るような設定箇所がどこにもないけど?
A. grafanaログイン後、GUIで読み取り先を設定できます。

ハリボテGrafanaが立ちました。
influxDBを作成していきます。

Q. influxDB?
A. grafanaは、influxDBなるデータベースからデータを読み込みます。
influxDBは、各アプリケーションのCPU使用量などのデータを取り込むことができます。
telegrahを各アプリケーションに仕込むことで、メモリ使用量などの情報を、influxDBに毎秒送信できます。

influxDBを立てていきます。
12. telegraf -> influxDB連携の実装

service.type: ClusterIP指定なので、mysql.yamlをコピーします。
typeのデフォルト設定がClusterIPなので記述を省略できます。
portは8086

/srcs/influxdb/influxdb.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: influxdb
spec:  # podの概要
 replicas: 1
 selector:
   matchLabels:
     app: influxdb
 strategy:
   type: Recreate # .spec.strategy.type==Recreateと指定されているとき、既存の全てのPodは新しいPodが作成される前に削除されます。
 template: # podのtemplate
   metadata:
     labels:
       app: influxdb
   spec:
     containers:
     - image: myinfluxdb
       imagePullPolicy: Never
       name: influxdb
       ports:
       - containerPort: 8086 # 8083はv1.3.0で終了。これは1.8.3
         name: influxdb
       volumeMounts:
       - name: influxdb-persistent-storage
         mountPath: /var/lib/influxdb
     volumes:
     - name: influxdb-persistent-storage
       persistentVolumeClaim:
         claimName: influxdb-pv-claim
---
apiVersion: v1
kind: Service
metadata:
 name: influxdb
spec:
 ports:
 - port: 8086
 selector:
   app: influxdb
 clusterIP: None

Q. port 8083?
A. v1.3.0以前はweb上からinfluxDBの中身を確認できたようですが、亡くなりました。見られないのは仕様です。

Q. mount?
A. DBなので永続ボリュームを設定します。
influxdbコンテナを確認すると、/var/lib/influxdb以降に、3つの保存領域があります。

mysql-pv.yamlより編集します。
/srcs/influxdb/influxdb-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
 name: influxdb-pv-volume
 labels:
   type: local
spec:
 storageClassName: manual
 capacity:
   storage: 100Mi
 accessModes:
   - ReadWriteOnce
 hostPath:
   path: "/data"
---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: influxdb-pv-claim
spec:
 storageClassName: manual
 accessModes:
   - ReadWriteOnce
 resources:
   requests:
     storage: 100Mi

設定ファイルを仕上げます。もともとinfluxdbコンテナに
/etc/influxdb.conf
が存在しており、内容を追記します。

/srcs/influxdb/influxdb.conf

# -----------...594行目以降追記-------------

# ref: https://qiita.com/nmrmsys/items/cdeb4afa76c591acfd3f

# ユーザ認証が通った接続のみ許可される
auth-enabled = true

# https
https-enabled = true
https-certificate = "/etc/ssl/ft_service.crt"
https-private-key = "/etc/ssl/ft_service.key"

Q. /etc/ssl/?
A. SSL認証キーの置き場所が/etc/ssl固定、だったかもしれません。この設定だと確実にうまくいったので決定しています。
Dockerfileにて配置も考慮します。

/srcs/influxdb/Dockerfile

FROM basecamp

COPY start.sh /tmp/start.sh
COPY influxdb.conf /etc/influxdb.conf

RUN mkdir -p /etc/ssl
# /etc/ssl指定かも
RUN cp /etc/nginx/ssl/ft_service.crt /etc/ssl/ft_service.crt
RUN cp /etc/nginx/ssl/ft_service.key /etc/ssl/ft_service.key
RUN chmod -R 777 /etc/ssl /tmp

EXPOSE 8086
CMD ["/tmp/start.sh"]

/srcs/influxdb/start.sh

#!/bin/sh

/usr/sbin/influxd -config /etc/influxdb.conf

Q. influxd?
A. -configオプションが必須です。また実行し続けるタイプのコマンドなのでtail -f不要です。

ハリボテinfluxDBができました。DBにアクセスできるか確認します

/run.sh追記

# delete (pvのdeleteがとても重いので毎回は行わない)
kubectl delete -f srcs/influxdb/influxdb.yaml
# kubectl delete -f srcs/influxdb/influxdb-pv.yaml

# image
docker build -t myinfluxdb srcs/influxdb/.

# apply
kubectl apply -f srcs/influxdb/influxdb.yaml
kubectl apply -f srcs/influxdb/influxdb-pv.yaml

sh run.sh
kubectl get po -> すべてのポッドが立ち上がるまで待機
(ref)InfluxDBについて最初に知るべき10のこと
https://qiita.com/nmrmsys/items/cdeb4afa76c591acfd3f
kubectl exec -it deploy/influxdb -- sh  -> influxdbコンテナに入る
influx -precision rfc3339 -> CUIでDB操作
SHOW DATABASES

influxdbが動けば設定問題ありません。

Q. wordpressよく死ぬ?
A. mysqlが立っていなかったら死ぬように設定しているので、3回くらい死んでからRunningになりがち
Q. Error?
A. kubectl logs deploy/wordpress
にてログ確認。何かあればすぐログ読みます。

Q. influxDBに初期設定は不要?ユーザは?
A. テーブルも、カラム(measurement)も設定不要です。ユーザ作らなくても最後まで問題ありません。
なんとtelegrafが勝手にテーブル・MEASUREMENT作成してくれます。(2015年時点では、自分でテーブルを作成する必要があったようです)

いよいよ。influxDBにデータを入れます。
代表例でftpsコンテナにtelegrafを仕込みます。

/srcs/ftps/telegraf.conf

# 設定ファイルの生成
# https://runebook.dev/ja/docs/influxdata/telegraf/v1.3/administration/configuration/index

# default conf
# https://github.com/influxdata/telegraf/blob/master/etc/telegraf.conf

[global_tags]
[agent]
 interval = "10s"
 round_interval = true
 metric_batch_size = 1000
 metric_buffer_limit = 10000
 collection_jitter = "0s"
 flush_interval = "10s"
 flush_jitter = "0s"
 precision = ""
 hostname = "influxdb"
 omit_hostname = false

###############################################################################
#                            OUTPUT PLUGINS                                   #
###############################################################################

[[outputs.influxdb]]
urls = ["http://influxdb:8086"] # influxdbだけlocalhost
database = "ftps"
 # write_consistency = "any"

###############################################################################
#                            INPUT PLUGINS                                    #
###############################################################################

[[inputs.cpu]]
 percpu = true
 totalcpu = true
 collect_cpu_time = false
 report_active = false

[[inputs.disk]]
 ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.system]]

Q. どこを?
A. 4項目。
1. hostname = "influxdb" # もしかしたらいらないかも。
2. database = "ftps" # influxDBのテーブル名になります。
3. urls = ["http://influxdb:8086"] # 固定。※influxdbの状態をinfluxdbに送信する場合だけlocalhost:8086にします。
Q. [[inputs.cpu]]?
A. measumentsの項目になります。[[inputs.cpu]]でcpuのデータが取得できます。cpu, memはデータ変動が大きいので取得おすすめ。

/srcs/ftps/Dockerfile追記

COPY telegraf.conf /etc/telegraf.conf

/srcs/ftps/start.sh追記

#!/bin/sh

# telegraf run in the background
telegraf -config /etc/telegraf.conf &

/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Q. &?
A. バックグラウンド実行。telegrafは継続動作するコマンド。ここで止まると困るので必要です。

->次(7/6) grafanaで視覚化

いいなと思ったら応援しよう!