壊れたから作り直し
以前の構成
以前以下の記事を参考にルーターのログを受けるsyslogサーバーを作り、そのまま同VMでLokiとGrafanaで良い感じに見れる環境は作っていました。しかしVMで作った関係でVMホストごと逝ってしまったので作り直しです。
今はk8sクラスタを作ったのでその上で動くようにします
そもそもsyslogとは?
ネットワーク機器からUnix系のシステムで標準で入ってることが多いログを転送するプロトコルで、集約するSyslogサーバーに対してシステムログやイベントログを送りつける事ができます
やっすいルーター(B○ffaloとか)などにも付いているので何度か見てなんぞこいやってずっと思ってました
例に漏れずNECのIX2215君やNETGEARのWAX610君もSyslogぐらいしか取り出せないので使っていきます
出てくるヤツ
rsyslog
syslogを受けるサーバーアプリケーションの一つですね
今回は受けたログをすべて別のアプリケーションにTCPで送りつけるだけの役割にしています
vector
元の参考記事ではfluentdの安定版td-agentを使っていましたが、今回はたまたま見つけたvectorと言うログ転送ツールを利用します
プラグインなど無しに様々なデータソースから取り出し転送できて、軽量とのことなのでお試しに使ってみました
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については以下のリポジトリを参照してください
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-pool
とmetallb.universe.tf/loadBalancerIPs
はよしなに変えてください
Deployment
一つのPodにrsyslogとvectorを入れています
注意事項としてHostNetworkとtrueにしているのとDnsPolicyをDefaultにしています
これをしないと転送されたsyslogのホストを解決できないのでクラスターノードのIPで記録されてしまいます
おわじ
ひとまずsyslogを受けられるようになったのでひとまず満足(え?)
ちゃんとやるならアラート出したいけど必要なアラートがどれかはまだわからんのだった()
でもこの作業中に古いIPアドレス宛に転送しているコンフィグ類が見つかったりと割と有効活用はできている気がする
あと今回時点で破棄しているuserファシリティログとかも収集した方が良いのかなぁ…
コメント