[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使用量を、視覚化するツール。どんなにダサくしようとも、おしゃれ不可避。
まずハリボテ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は継続動作するコマンド。ここで止まると困るので必要です。