Kubernetes環境におけるFilebeatのログ収集

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) を作成します。以下は、基本的な設定例です。
```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として作成します。
```yaml
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として作成します。
```yaml
apiVersion: v1
kind: Secret
metadata:
  name: elastic-credentials
  namespace: kube-system
type: Opaque
data:
  password: <base64 encoded password>  # パスワードをBase64エンコード
```
注意: <base64 encoded password> は、実際のパスワードをBase64エンコードした文字列に置き換えてください。
### 4.適用:
- 作成したYAMLファイルを適用します。
```console
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クラスタの監視やトラブルシューティングに役立てることができます。