以前、VictoriaMetrics を紹介し、そのログ ソリューション VictoriaLogs をリリースしました。機能については簡単に紹介しましたが、使い方については紹介しませんでした。この記事では、VictoriaLogsを体験してみます。 VictoriaLogs は、ログ ストレージおよびクエリ バックエンドです。直接的なログ収集機能は提供していませんが、fluentbit、filebeat、logstash などの他の一般的なログ収集ツールと互換性があります。ここでは、ログを収集するために fluentbit を使用します。 ログ収集たとえば、Kubernetes クラスターからログを収集し、VictoriaLogs に保存する必要があります。私たちの環境ではコンテナランタイムであるcontainerdを使用しているため、使用時にはdockerと区別する必要があります。ここでは、ログを収集するために fluentbit を使用し、それを Kubernetes クラスターにデプロイします。完全なデプロイメント ファイルは次のとおりです。 apiVersion: v1 kind: ConfigMap metadata: name: fluent-bit-config namespace: monitor labels: k8s-app: fluentbit-logging kubernetes.io/cluster-service: "true" data: fluent-bit.conf: | [SERVICE] Flush 1 Log_Level info Daemon off Parsers_File parsers.conf HTTP_Server On HTTP_Listen 0.0.0.0 HTTP_Port 2020 @INCLUDE input-kubernetes.conf @INCLUDE filter-kubernetes.conf @INCLUDE output.conf output.conf: | # [OUTPUT] # Name stdout # Match kube.var.log.containers.*.* [OUTPUT] Name http Match kube.var.log.containers.*.* host victorialogs port 9428 compress gzip uri /insert/jsonline?_stream_fields=stream&_msg_field=message&_time_field=time format json_lines json_date_format iso8601 header AccountID 0 header ProjectID 0 input-kubernetes.conf: | [INPUT] Name tail Tag kube.* Path /var/log/containers/*.log Parser cri DB /var/log/flb_kube.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 filter-kubernetes.conf: | [FILTER] Name kubernetes Match kube.* Kube_URL https://kubernetes.default.svc:443 Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token Kube_Tag_Prefix kube.var.log.containers. Merge_Log On Merge_Log_Trim On Keep_Log Off K8S-Logging.Parser On K8S-Logging.Exclude Off Annotations Off Labels On [FILTER] Name nest Match kube.* Operation lift Nested_under kubernetes Add_prefix kubernetes_ [FILTER] Name nest Match kube.* Operation lift Nested_under kubernetes_labels Add_prefix kubernetes_labels_ parsers.conf: | [PARSER] Name json Format json Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z Time_Keep Off [PARSER] Name docker Format json Time_Key time Time_Format %Y-%m-%d %H:%M:%S Time_Keep Off [PARSER] Name cri Format regex Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*)$ Time_Key time Time_Format %Y-%m-%d %H:%M:%S --- # fluentbit rbac apiVersion: v1 kind: ServiceAccount metadata: name: fluentbit namespace: monitor labels: k8s-app: fluentbit-logging kubernetes.io/cluster-service: "true" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: fluentbit namespace: monitor labels: k8s-app: fluentbit-logging kubernetes.io/cluster-service: "true" rules: - apiGroups: [""] resources: - namespaces - pods - pods/log verbs: ["get", "list", "watch"] - apiGroups: ["extensions", "apps"] resources: - deployments - replicasets verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: fluentbit namespace: monitor labels: k8s-app: fluentbit-logging kubernetes.io/cluster-service: "true" roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: fluentbit subjects: - kind: ServiceAccount name: fluentbit namespace: monitor --- apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentbit namespace: monitor labels: k8s-app: fluentbit-logging kubernetes.io/cluster-service: "true" spec: selector: matchLabels: k8s-app: fluentbit-logging template: metadata: labels: k8s-app: fluentbit-logging spec: serviceAccount: fluentbit serviceAccountName: fluentbit tolerations: - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule containers: - name: fluentbit image: cr.fluentbit.io/fluent/fluent-bit:2.1.4 imagePullPolicy: Always ports: - containerPort: 2020 volumeMounts: - name: varlog mountPath: /var/log - name: fluent-bit-config mountPath: /fluent-bit/etc/fluent-bit.conf subPath: fluent-bit.conf - name: fluent-bit-config mountPath: /fluent-bit/etc/input-kubernetes.conf subPath: input-kubernetes.conf - name: fluent-bit-config mountPath: /fluent-bit/etc/filter-kubernetes.conf subPath: filter-kubernetes.conf - name: fluent-bit-config mountPath: /fluent-bit/etc/output.conf subPath: output.conf volumes: - name: varlog hostPath: path: /var/log - name: fluent-bit-config configMap: name: fluent-bit-config まず、ConfigMap で収集するログを設定します。ログ ソース パスは /var/log/containers/*.log で、これがデフォルトのコンテナー ログ パスです。ノード上で表示できますが、このパスの下のログは単なるソフト リンクであることに注意してください。実際のログ パスは /var/log/pods の下にあるため、ホストの /var/log ディレクトリを fluentbit pod にマウントする必要があります。 /var/log/containers/ ディレクトリのみをマウントすると、実際のログを取得できません。 さらに、後続のログフィルタリングを容易にするために、ログに kube.* のタグも付けます。タグに基づいてログをフィルタリングし、対応する処理を実行できます。 ログがさまざまな方法で処理された後、最も重要なのは OUTPUT 出力元の構成です。デバッグ段階では、まず stdout 出力ソースを構成できます。 [OUTPUT] Name stdout Match kube.var.log.containers.*.* このようにして、fluentbit pod ログを通じてログが収集されたかどうかを確認できます。 収集された場合は、elasticsearch、kafka、redis などの他の出力ソースを設定できます。もちろん、ログを VictoriaLogs に出力したいので、以下のように VictoriaLogs の出力ソースを設定する必要があります。 [OUTPUT] Name http Match kube.var.log.containers.*.* host victorialogs port 9428 compress gzip uri /insert/jsonline?_stream_fields=stream&_msg_field=message&_time_field=time format json_lines json_date_format iso8601 header AccountID 0 header ProjectID 0 ここで、VictoriaLogs のホストとポートを設定します。最も重要なのは uri パラメータで、これは VictoriaLogs /insert/jsonline?_stream_fields=stream&_msg_field=message& の挿入インターフェースです。ここでは、uri パラメータ内の 3 つのパラメータ _stream_fields、_msg_field、および _time_field に注意する必要があります。これら 3 つのパラメータは、VictoriaLogs の挿入インターフェースに必要です。このうち、_stream_fields はログストリームを指定するフィールドで、ここでは stream と指定します。_msg_field はログの内容を指定するフィールドで、ここでは message と指定します。_time_field はログの時刻を指定するフィールドで、ここでは time と指定します。 VictoriaLogs にログを収集できるように、取得する特定のフィールドをログに従って決定する必要があります。もちろん、異なるテナントを区別するために使用できる AccountID と ProjectID という 2 つのフィールドがあります。ここでは今のところ使用しないので、0 に設定します。 上記のリソース リストを展開するだけです。デプロイが完了したら、fluentbit のポッド ログを確認できます。ログにエラーがない場合、fluentbit のデプロイメントは成功したことを意味します。次に、VictoriaLogs をデプロイします。 VictoriaLogsをインストールするVictoriaLogs の現在のプレビュー バージョンは単一ノード アプリケーションのみであるため、以下に示すように、デプロイする必要があるのは 1 つのデプロイメントのみです。 # deploy victorialogs apiVersion: apps/v1 kind: Deployment metadata: name: victorialogs namespace: monitor labels: app: victorialogs spec: selector: matchLabels: app: victorialogs template: metadata: labels: app: victorialogs spec: containers: - name: victorialogs image: victoriametrics/victoria-logs:latest # command: # - -storageDataPath=/vlogs # 指定日志存储路径ports: - containerPort: 9428 volumeMounts: - name: logs mountPath: victoria-logs-data # 默认日志存储路径volumes: - name: logs persistentVolumeClaim: claimName: victorialogs-pvc --- # deploy victorialogs service apiVersion: v1 kind: Service metadata: name: victorialogs namespace: monitor labels: app: victorialogs spec: ports: - port: 9428 targetPort: 9428 type: NodePort selector: app: victorialogs --- # deploy victorialogs pvc apiVersion: v1 kind: PersistentVolumeClaim metadata: name: victorialogs-pvc namespace: monitor spec: accessModes: - ReadWriteOnce storageClassName: cfsauto resources: requests: storage: 10Gi ここで注意する必要があるのは、VictoriaLogs の保存パスです。 VictoriaLogs のデフォルトのストレージ パスは victoria-logs-data であり、これはパラメーター -storageDataPath で指定できます。ログ データを永続化したい場合は、パスをマウントする必要があります。たとえば、ここでは関連付けに PVC を指定します。さらに、上記では VictoriaLogs のホスト アドレスを fluentbit の victorialogs に出力したので、これを公開するには victorialogs という名前の Service オブジェクトも作成する必要があり、これは fluentbit と同じ名前空間に存在する必要があります。さらに、VictoriaLogs 自体には Web インターフェイスが付属しており、ここでは NodePort を通じて公開されているため、NodeIP:NodePort を通じて VictoriaLogs にアクセスできます。 同様に、上記のリソース リストを直接デプロイすることもできます。デプロイが完了したら、VictoriaLogs ポッド ログを確認できます。ログにエラーがない場合、VictoriaLogs のデプロイメントは成功したことを意味します。 $ kubectl get pods -n monitor NAME READY STATUS RESTARTS AGE fluentbit-6rmp8 1/1 Running 0 28m fluentbit-bbgxb 1/1 Running 0 28m fluentbit-xwrzs 1/1 Running 0 28m victorialogs-5856895b4c-mcffw 1/1 Running 0 41m $ kubectl get svc -n monitor NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE victorialogs NodePort 10.101.31.122 <none> 9428:30694/TCP 48m デプロイが完了すると、以下に示すように、NodeIP:30694 を介して VictoriaLogs にアクセスできるようになります。 以下に示すように、select/vmui をクリックすると、VictoriaLogs の Logs Explorer インターフェースにジャンプします。 次に、ログに含まれるものを照会するなど、必要に応じてログを照会できます。 alog キーワードログ: さらに、テーブルと JSON の 2 つの表示モードがあります。 ログ クエリでは VictoriaLogs の LogsQL 構文が使用されます。具体的な構文については、公式ドキュメント(https://docs.victoriametrics.com/VictoriaLogs/LogsQL.html)を参照してください。 現在、VictoriaLogs はまだプレビュー版ですので、完成していない機能がまだ多くあります。シンプルなログクエリ機能のみを備えています。たとえば、ログアラーム、ビジュアルチャート、その他の機能は現時点ではサポートされていません。ただし、VictoriaLogs の開発者はすでに開発を進めており、すぐにサポートされるようになると考えています。 |