はじめに
タイトルにある通り、Kongを経由したアプリへのアクセスを可視化することを試みました。
今までとの変更点は
- Victoria MetricsのClusterをSingleに変更
- Kongをkong/ingressからkong/kongを使うように変更
です。
実装
kong設定部分
まずはkongの部分です。
上記にも記載の通り、Kongをkong/ingressからkong/kongを使うように変更しました。
理由としては、メトリクス情報とログ情報がkong/ingressでは送れないようだったからです。
helmfile.yamlのkong設定部分は以下のようになります。
repositories:
- name: kong
url: https://charts.konghq.com
releases:
- name: kong
namespace: kong
chart: kong/kong
version: 3.0.1
values:
- kong-values.yaml
hooks:
- events: ["postinstall", "postupgrade"]
command: kubectl
args:
- apply
- -f
- vmservicescrape-kong.yaml
次にkong-values.yamlです。
proxy:
access_log: /dev/stdout
error_log: /dev/stderr
metrics:
enabled: true
plugins:
enabled:
- prometheus
serviceMonitor:
enabled: true
labels:
release: victoria-metrics
status:
enabled: true
http:
enabled: true
containerPort: 8100そしてKong の Deployment(kong-kong)が持っている 8100 番ポート(=ステータス / メトリクス用)を、
ClusterIP の Service としてクラスタ内部に公開するために以下のコマンドを実行する必要がなります。
$ kubectl expose deploy kong-kong --port 8100 --name kong-kong-status --type ClusterIP -n kong -l enable-metrics="true"Victoria MetricsのClusterをSingleに変更することで発生した実装対応
VictoriaMetrics Clusterを使っていましたが、本環境の規模も考慮して、Victoria MetricsのSingle構成のHelmを使用することにしました。
Logはlokiを導入しようと考えていましたが、VictoriaLogsを使用します。
Logは「Kong⇒VictoriaLogs」という風に集めますが、Metricsは「Kong⇒VictoriaMetrics Agent⇒VictoriaMetrics」のようにVictoriaMetrics Agentを介して集めます。
python側の設定変更について
VictoriaMetrics Agentを介してMetricsは集めるので、pushしているpython側にもそのpush先をVictoriaMetrics Agentに設定します。
以下のハイライトのところのように、VMAGENTを設定しておきます。
import requests
import time
import os
NODE = os.getenv("NODE_NAME", "unknown")
VMAGENT = os.getenv("VMAGENT")
if not VMAGENT:
raise RuntimeError("VMAGENT env is not set")
def get_cpu_temp():
with open("/sys/class/thermal/thermal_zone0/temp") as f:
return float(f.read().strip()) / 1000.0
while True:
temp = get_cpu_temp()
print(NODE)
data = (
f'rpi_cpu_temperature_celsius'
f'{{node="{NODE}"}} {temp}\n'
)
r = requests.post(
VMAGENT,
data=data,
timeout=5,
)
print("status:", r.status_code, r.text)
time.sleep(300)そして、DaemonSet側のファイルにも以下のハイライトの箇所のようにVMAGENTを設定します。
apiVersion: apps/v1
kind: DaemonSet
・・・【略】・・・
spec:
containers:
- name: python
image: appare99/metrics-python:v0.0.8
command: ["sh", "-c"]
args:
- |
pip3 install requests
export NODE_NAME=$(cat /host/etc/hostname)
export VMAGENT="http://victoria-metrics-agent.monitoring:8429/api/v1/write"
python3 /data/get_cpu_temp.py
volumeMounts:
- name: host-sys
mountPath: /sys
readOnly: true
- name: host-hostname
mountPath: /host/etc/hostname
readOnly: true
・・・【略】・・・Local Storageの実装周りについて
ラズパイだと容量が足りないのでUSBファイルをマウントしたフォルダに対してローカルストレージを設定する必要があります。
helmのvictoria-metrics-singleとvm-local-storageではpvcまで作成ができるので、作成する対象はpvとstorage classになります。
helmfile.yamlのlocal storageの記述部分は以下のようになっています。
- name: vm-local-storage
namespace: monitoring
chart: ./storage/chartlocal storageのフォルダ構成は以下のようになっています。
storage/
└── chart
├── Chart.yaml
└── templates
├── pv.yaml
└── storageclass.yamlpv.yamlの内容は以下です。
apiVersion: v1
kind: PersistentVolume
metadata:
name: vm-pv-victoria-metrics-0
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
storageClassName: vm-pv-victoria-metrics-0-victoria-metrics-victoria-metrics-single-server-0
persistentVolumeReclaimPolicy: Retain
local:
path: /media/appare99/CE8C-C492/k8s-data/victoriametrics/
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-worker1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: vm-pv-victoria-logs-0
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
storageClassName: vm-pv-victoria-logs-0-victoria-metrics-victoria-logs-single-server-0
persistentVolumeReclaimPolicy: Retain
local:
path: /media/appare99/CE8C-C492/k8s-data/victorialogs/
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-worker1storageclass.yamlの内容は以下です。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: vm-pv-victoria-metrics-0-victoria-metrics-victoria-metrics-single-server-0
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
reclaimPolicy: Retain
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: vm-pv-victoria-logs-0-victoria-metrics-victoria-logs-single-server-0
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
reclaimPolicy: RetainVictoriaMetrics周りの実装について
victoria metricsのhelmfile.yamlの部分は以下のようになっています。
victoria metricsに加えて、victoria metrics agentを設けています。
- name: victoria-metrics
namespace: monitoring
chart: vm/victoria-metrics-single
version: 0.28.0
needs:
- monitoring/vm-local-storage
values:
- ./vm-single-values.yaml
- name: victoria-metrics-agent
namespace: monitoring
chart: vm/victoria-metrics-agent
version: 0.29.0
needs:
- monitoring/vm-local-storage
values:
- ./vmagent-values.yamlvm-single-values.yamlの中身は以下のようになっています。
replicaCount: 1
server:
enabled: true
persistentVolume:
enabled: true
size: 5Gi
storageClassName: "vm-pv-victoria-metrics-0-victoria-metrics-victoria-metrics-single-server-0"
accessModes:
- ReadWriteOnce
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mivmagent-values.yamlの中身は以下のようになっています。
replicaCount: 1
service:
enabled: true
type: ClusterIP
port: 8429
config:
global:
scrape_interval: 30s
scrape_configs:
- job_name: kong
metrics_path: /metrics
static_configs:
- targets:
- kong-kong-status.kong.svc.cluster.local:8100
remoteWrite:
- url: http://victoria-metrics-victoria-metrics-single-server.monitoring.svc.cluster.local:8428/api/v1/write
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256MiVMのUIにアクセスすると一応、メトリクスが確認できました。

VictoriaLogs周りの実装について
helmfile.yamlのVictoriaLogsの部分はは以下のような内容になります。
- name: victoria-logs
namespace: monitoring
chart: vm/victoria-logs-single
needs:
- monitoring/vm-local-storage
version: 0.11.23
values:
- ./vlogs-values.yamlvlogs-values.yamlは以下のようになっています。
replicaCount: 1
server:
enabled: true
persistentVolume:
# name: "vm-pv-victoria-logs-0"
size: 5Gi
storageClassName: "vm-pv-victoria-logs-0-victoria-metrics-victoria-logs-single-server-0"
accessModes:
- ReadWriteOnce
# nodeSelector: { k8s-worker1 }
vector:
enabled: true
sources:
kong_logs:
type: kubernetes_logs
extra_label_selector: "app=kong"
namespace: kong
transforms:
add_labels:
type: remap
inputs:
- kong_logs
source: |
.service = "kong"
.log_type = "access"
sinks:
victoria_logs:
type: elasticsearch
inputs:
- add_labels
endpoints:
- http://victoria-logs-single.monitoring.svc.cluster.local:9428/insert/elasticsearch/
bulk:
index: kong-logs
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
VMのUIにアクセスするとログが確認できました。

最後に
アクセスされたメトリック情報とログ情報の取得をVictoriaMetricsを用いてできました。
いずれはオブザーバビリティの実装までしてみたいです。
