KongのアクセスをVictoriaMetricsとVictoriaLogsで表示するまで

スポンサーリンク
Uncategorized

はじめに

タイトルにある通り、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/chart

local storageのフォルダ構成は以下のようになっています。

storage/
└── chart
    ├── Chart.yaml
    └── templates
        ├── pv.yaml
        └── storageclass.yaml

pv.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-worker1

storageclass.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: Retain

VictoriaMetrics周りの実装について

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.yaml

vm-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: 256Mi

vmagent-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: 256Mi

VMの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.yaml

vlogs-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を用いてできました。

いずれはオブザーバビリティの実装までしてみたいです。

タイトルとURLをコピーしました