Filebeatは、軽量なログシッパーであり、Elastic Stackの一部として、ログデータを収集し、ElasticsearchまたはLogstashに転送するために設計されています。Filebeatは、ファイルシステム上のログファイルを監視し、新しいログエントリをリアルタイムで収集し、指定された宛先に送信します。
Filebeatの主な特徴:
- 軽量: システムリソースの消費が少ないため、リソースが限られた環境でも動作可能。
- 信頼性: ログデータの損失を防ぐために、データの永続化や再送信のメカニズムを備えている。
- モジュール: 一般的なログ形式(Apache, Nginx, System logsなど)に対応したモジュールが用意されており、設定を簡素化できる。
- Elastic Stackとの統合: ElasticsearchやLogstashとの連携が容易で、データの可視化や加工処理を効率的に行える。
- 自動ディスカバリー: Kubernetesなどの環境で、自動的にログファイルを検出し、収集を開始できる。
KubernetesにおけるFilebeatの主な利点:
- 自動ディスカバリー: 新しいPodが作成されたり、Podが再起動されたりした場合でも、自動的にログファイルを検出し、収集を開始します。
- メタデータ付加: ログデータにKubernetesのメタデータ(Pod名、Namespace、ラベルなど)を付加することで、ログの分析やフィルタリングが容易になります。
- 設定の簡素化: Kubernetesモジュールを使用することで、一般的なKubernetes環境におけるログ収集の設定を簡素化できます。
KubernetesにおけるFilebeatの導入方法:
1.DaemonSetとしてのデプロイ:
- FilebeatをDaemonSetとしてデプロイすることで、Kubernetesクラスタ内のすべてのノードにFilebeat Podが配置されます。これにより、各ノードで実行されているPodのログを収集できます。
- DaemonSetの設定ファイル (YAML) を作成します。以下は、基本的な設定例です。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system
labels:
k8s-app: filebeat
spec:
selector:
matchLabels:
k8s-app: filebeat
template:
metadata:
labels:
k8s-app: filebeat
spec:
terminationGracePeriodSeconds: 30
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.17.10 # バージョンは適宜変更
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
env:
- name: ELASTICSEARCH_HOST
value: "elasticsearch.default.svc.cluster.local" # Elasticsearchのホスト名
- name: ELASTICSEARCH_PORT
value: "9200" # Elasticsearchのポート番号
- name: ELASTICSEARCH_USERNAME
value: "elastic" # Elasticsearchのユーザー名
- name: ELASTICSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password # Elasticsearchのパスワードを格納したSecret
securityContext:
runAsUser: 0
volumeMounts:
- name: config
mountPath: /etc/filebeat.yml
- name: data
mountPath: /usr/share/filebeat/data
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: varlog
mountPath: /var/log
readOnly: true
volumes:
- name: config
configMap:
name: filebeat-config
- name: data
hostPath:
path: /var/lib/filebeat-data
type: DirectoryOrCreate
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
type: Directory
- name: varlog
hostPath:
path: /var/log
type: Directory
設定項目の説明:
- image: 使用するFilebeatのDockerイメージを指定します。
- args: Filebeatの起動時に渡す引数を指定します。-c /etc/filebeat.yml は設定ファイルのパスを指定し、-e は標準エラー出力にログを出力するように指定します。
- env: 環境変数を設定します。ELASTICSEARCH_HOST、ELASTICSEARCH_PORT、ELASTICSEARCH_USERNAME、ELASTICSEARCH_PASSWORD は、Elasticsearchへの接続情報を指定します。
- volumeMounts: ボリュームをコンテナにマウントします。
- config: Filebeatの設定ファイルを格納したConfigMapをマウントします。
- data: Filebeatのデータを永続化するためのボリュームをマウントします。
- varlibdockercontainers: Dockerコンテナのログファイルを格納したディレクトリをマウントします。
- varlog: システムログファイルを格納したディレクトリをマウントします。
- volumes: ボリュームを定義します。
- config: Filebeatの設定ファイルを格納したConfigMapを定義します。
- data: Filebeatのデータを永続化するためのHostPathボリュームを定義します。
- varlibdockercontainers: Dockerコンテナのログファイルを格納したディレクトリをHostPathボリュームとして定義します。
- varlog: システムログファイルを格納したディレクトリをHostPathボリュームとして定義します。
2.ConfigMapの作成:
- Filebeatの設定ファイル (filebeat.yml) をConfigMapとして作成します。
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
namespace: kube-system
labels:
k8s-app: filebeat
data:
filebeat.yml: |-
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
filebeat.autodiscover:
providers:
- type: kubernetes
hints.enabled: true
node_processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers/"
processors:
- add_cloud_metadata: ~
- add_host_metadata: ~
- add_kubernetes_metadata: ~
- decode_json_fields:
target: json
fields: ["message"]
process_array: false
max_depth: 1
overwrite_keys: false
output.elasticsearch:
hosts: ["${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}"]
username: "${ELASTICSEARCH_USERNAME}"
password: "${ELASTICSEARCH_PASSWORD}"
index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
logging.level: info
logging.selectors: ["*"]
設定項目の説明:
- filebeat.config.modules.path: モジュールの設定ファイルのパスを指定します。
- filebeat.autodiscover.providers: 自動ディスカバリーの設定を定義します。
- type: kubernetes: Kubernetes環境での自動ディスカバリーを有効にします。
- hints.enabled: true: Kubernetesのヒントを使用して、ログファイルのパスを自動的に検出します。
- node_processors: ノードに関する情報を付加するためのプロセッサを定義します。
- processors: ログデータを加工するためのプロセッサを定義します。
- add_cloud_metadata: クラウドプロバイダーのメタデータを付加します。
- add_host_metadata: ホストのメタデータを付加します。
- add_kubernetes_metadata: Kubernetesのメタデータを付加します。
- decode_json_fields: JSON形式のフィールドをデコードします。
- output.elasticsearch: Elasticsearchへの出力設定を定義します。
- hosts: Elasticsearchのホストとポートを指定します。
- username: Elasticsearchのユーザー名を指定します(セキュリティが有効な場合)。
- password: Elasticsearchのパスワードを指定します(セキュリティが有効な場合)。
- index: Elasticsearchのインデックス名を指定します。
- logging.level: ログレベルを指定します。
- logging.selectors: ログセレクターを指定します。
3.Secretの作成 (Elasticsearchの認証情報が必要な場合):
- Elasticsearchへの認証情報(ユーザー名とパスワード)をSecretとして作成します。
apiVersion: v1
kind: Secret
metadata:
name: elastic-credentials
namespace: kube-system
type: Opaque
data:
password: <base64 encoded password> # パスワードをBase64エンコード
注意: は、実際のパスワードをBase64エンコードした文字列に置き換えてください。
4.適用:
- 作成したYAMLファイルを適用します。
kubectl apply -f filebeat-daemonset.yaml
kubectl apply -f filebeat-configmap.yaml
kubectl apply -f elastic-credentials.yaml # Elasticsearchの認証情報が必要な場合
Kubernetesモジュールの使用:
- Kubernetesモジュールを使用すると、Kubernetes環境におけるログ収集の設定を簡素化できます。
- Kubernetesモジュールは、以下のログを収集できます。
- コンテナの標準出力/標準エラー出力
- kubeletのログ
- kube-proxyのログ
- kube-schedulerのログ
- kube-controller-managerのログ
- etcdのログ
- Kubernetesモジュールを有効にするには、filebeat.yml ファイルで filebeat.config.modules.path を設定し、modules.d ディレクトリにある kubernetes.yml ファイルを編集します。
自動ディスカバリーの設定:
- Filebeatの自動ディスカバリー機能を使用すると、KubernetesのPodのログを自動的に検出し、収集を開始できます。
- 自動ディスカバリーを有効にするには、filebeat.yml ファイルで filebeat.autodiscover.providers を設定します。
- hints.enabled: true を設定すると、Kubernetesのヒントを使用して、ログファイルのパスを自動的に検出します。
- Kubernetesのヒントは、Podのアノテーションとして設定できます。
ログデータの加工:
- Filebeatのプロセッサを使用すると、ログデータを加工できます。
- 例えば、add_kubernetes_metadata プロセッサを使用すると、ログデータにKubernetesのメタデータを付加できます。
- decode_json_fields プロセッサを使用すると、JSON形式のフィールドをデコードできます。
ログデータの可視化:
- 収集したログデータは、Kibanaで可視化できます。
- Kibanaでインデックスパターンを作成し、ログデータを検索、フィルタリング、集計できます。
- Kibanaには、Kubernetesのログを可視化するためのダッシュボードが用意されています。
まとめ
Filebeatは、Kubernetes環境におけるログ収集に非常に適したツールです。DaemonSetとしてデプロイし、ConfigMapで設定を管理することで、簡単に導入できます。自動ディスカバリー機能やKubernetesモジュールを使用することで、設定を簡素化できます。収集したログデータは、Kibanaで可視化し、Kubernetesクラスタの監視やトラブルシューティングに役立てることができます。