syslogサーバーをk8sの上に作る

サーバー
この記事は約11分で読めます。

壊れたから作り直し

以前の構成

以前以下の記事を参考にルーターのログを受けるsyslogサーバーを作り、そのまま同VMでLokiとGrafanaで良い感じに見れる環境は作っていました。しかしVMで作った関係でVMホストごと逝ってしまったので作り直しです。

Grafana + Loki + Fluentdで実装するSyslogサーバー

今はk8sクラスタを作ったのでその上で動くようにします

そもそもsyslogとは?

ネットワーク機器からUnix系のシステムで標準で入ってることが多いログを転送するプロトコルで、集約するSyslogサーバーに対してシステムログやイベントログを送りつける事ができます

やっすいルーター(B○ffaloとか)などにも付いているので何度か見てなんぞこいやってずっと思ってました

例に漏れずNECのIX2215君やNETGEARのWAX610君もSyslogぐらいしか取り出せないので使っていきます

出てくるヤツ

rsyslog

syslogを受けるサーバーアプリケーションの一つですね

今回は受けたログをすべて別のアプリケーションにTCPで送りつけるだけの役割にしています

vector

元の参考記事ではfluentdの安定版td-agentを使っていましたが、今回はたまたま見つけたvectorと言うログ転送ツールを利用します

プラグインなど無しに様々なデータソースから取り出し転送できて、軽量とのことなのでお試しに使ってみました

Vector
A lightweight, ultra-fast tool for building observability pipelines

Loki

ログを集約するヤツですね

今回は用意がめんどくさかったのでLokiだけGrafana Cloudの物にしました(そのうちローカルでも立てる予定)

全体像

やってることは簡単でk8s部分はDockerComposeでも代用できます

ルーターやAPなどから送信されたsyslogは514/udpでrsyslogコンテナ転送されます。
それをvectorコンテナの9000/tcp宛てに転送しvectorはLoki宛てにhttpsで転送しています。

あとはLokiに記録されたログをGrafanaから閲覧するだけですね。
(Grafana君もVMで作っていますがk8sやDockerでも問題無いです)

デプロイとか

説明が面倒くなってしまったので以下のYAMLを参考にしてください(k8s)

ConfigMap

apiVersion: v1
data:
  vector.yaml: |
    sources:
      syslog:
        type: "syslog"
        address: "0.0.0.0:9000"
        mode: tcp
    transforms:
      parse_logs:
        type: "remap"
        inputs: ["syslog"]
        source: |
          . = parse_syslog!(string!(.message))
    sinks:
      print:
        type: "console"
        inputs: ["parse_logs"]
        encoding:
          codec: "json"
          json:
            pretty: true
      loki-cloud:
        type: loki
        inputs: ["parse_logs"]
        encoding:
          codec: "json"
        labels:
          "*": "{{.}}"
        endpoint: https://$USERNAME:$APITOKEN@$LOKIHOSTNAME
kind: ConfigMap
metadata:
  name: vector
  namespace: zin3

Service

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloudprovider.harvesterhci.io/ipam: dhcp
    field.cattle.io/targetWorkloadIds: '["zin3/syslog"]'
    management.cattle.io/ui-managed: 'true'
  name: syslog
  namespace: zin3
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: syslog-udp
      port: 514
      protocol: UDP
      targetPort: 514
  selector:
    workload.user.cattle.io/workloadselector: apps.deployment-zin3-syslog
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    cloudprovider.harvesterhci.io/ipam: dhcp
    field.cattle.io/targetWorkloadIds: '["zin3/syslog"]'
    management.cattle.io/ui-managed: 'true'
    metallb.universe.tf/ip-allocated-from-pool: mishe-ip-pool
    metallb.universe.tf/loadBalancerIPs: 172.16.99.100
  name: syslog-loadbalancer
  namespace: zin3
spec:
  allocateLoadBalancerNodePorts: true
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: syslog-udp
      nodePort: 31548
      port: 514
      protocol: UDP
      targetPort: 514
  selector:
    workload.user.cattle.io/workloadselector: apps.deployment-zin3-syslog
  sessionAffinity: None
  type: LoadBalancer

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    workload.user.cattle.io/workloadselector: apps.deployment-zin3-syslog
  name: syslog
  namespace: zin3
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      workload.user.cattle.io/workloadselector: apps.deployment-zin3-syslog
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        workload.user.cattle.io/workloadselector: apps.deployment-zin3-syslog
    spec:
      containers:
        - env:
            - name: TZ
              value: Asia/Tokyo
          image: ghcr.io/zinntikumugai/rsyslog
          imagePullPolicy: Always
          name: syslog
          ports:
            - containerPort: 514
              name: syslog-udp
              protocol: UDP
          securityContext:
            allowPrivilegeEscalation: true
            privileged: false
            readOnlyRootFilesystem: false
            runAsNonRoot: false
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        - env:
            - name: TZ
              value: Asia/Tokyo
          image: timberio/vector:0.39.0-debian
          imagePullPolicy: Always
          name: vector
          securityContext:
            allowPrivilegeEscalation: false
            privileged: false
            readOnlyRootFilesystem: false
            runAsNonRoot: false
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /etc/vector/vector.yaml
              name: vol-config
              readOnly: true
              subPath: vector.yaml
      dnsPolicy: Default
      hostNetwork: true
      restartPolicy: Always
      schedulerName: default-scheduler
      terminationGracePeriodSeconds: 30
      volumes:
        - configMap:
            name: vector
          name: vol-config

解説

ConfigMap

rsyslog

rsyslogについては以下のリポジトリを参照してください

GitHub - zinntikumugai/rsyslog-docker
Contribute to zinntikumugai/rsyslog-docker development by creating an account on GitHub.

UDPでsyslogパケットを受けてvectorコンテナに向けて転送しているだけです

vector

こちらは9000/tcpで受けたものをsyslogとして受け取ってLokiに転送しています
(ほぼデフォルトのコンフィグ)

今回Grafana Cloudの LokiなのでBasicAuthで認証をしていますが、ローカルな認証がないLokiの場合はホスト名だけで問題ないです

Service

こちらは外からのアクセスを受けるため514/udp(syslog)をPodに転送しています

LoadBalancerはMetalLBを使用してるのでmetallb.universe.tf/ip-allocated-from-poolmetallb.universe.tf/loadBalancerIPsはよしなに変えてください

Deployment

一つのPodにrsyslogとvectorを入れています

注意事項としてHostNetworkとtrueにしているのとDnsPolicyをDefaultにしています

これをしないと転送されたsyslogのホストを解決できないのでクラスターノードのIPで記録されてしまいます

 

おわじ

ひとまずsyslogを受けられるようになったのでひとまず満足(え?)
ちゃんとやるならアラート出したいけど必要なアラートがどれかはまだわからんのだった()

でもこの作業中に古いIPアドレス宛に転送しているコンフィグ類が見つかったりと割と有効活用はできている気がする

あと今回時点で破棄しているuserファシリティログとかも収集した方が良いのかなぁ…

参考

Grafana + Loki + Fluentdで実装するSyslogサーバー
rsyslog.confの文法 - Qiita
■ rsyslogとはアプリケーションから通知されたメッセージをログファイルに保存するLinuxのログ管理システム。■ /etc/rsyslog.confの文法● 基本構成セレクタ(出力対象…
Loki sink
Deliver log event data to the Loki aggregation system
Vectorとは|データ収集処理基盤のVectorを試してみよう

コメント