メインコンテンツまでスキップ
Sumo Logic Japanese

Kubernetes Fluentd プラグイン


Kubernetes をモニタリングするために、Sumo では Sumo コレクタではなくオープン ソースの FluentD エージェントを使用してログ データを収集することをお勧めします。  

FluentD は Kubernetes マスタからメタデータを統合する機能のおかげで、Kubernetes 環境からログを収集するために最もよく使用されている方法です。データを直接 Sumo Logic に送信する FluentD プラグインを開発済みで、デプロイを容易にするために、FluentD と Sumo Fluentd プラグインの事前設定済みのパッケージをコンテナ化しています。 
実装を容易にするために、Sumo-FluentD 統合用の Kubernetes Helm チャートを提供しています。 

このページでは、https://github.com/SumoLogic/fluentd-kubernetes-sumologic で入手できる Sumo Kubernetes Fluentd プラグインについて説明しています。

プラグインは Kubernetes デーモンセットとして実行され、クラスタ内の各ホストでプラグインのインスタンスを実行します。各プラグイン インスタンスはシステム、kubelet、docker デーモン、コンテナのログをホストから抽出し、JSON またはテキスト形式で、Sumo サービスのホスト型コレクタ上の HTTP エンドポイントに送信します。

kubernetes2.png

ステップ 1: Sumo でのホスト型コレクタと HTTP ソースの作成

このステップでは、Sumo サービスでログを受信するために HTTP エンドポイントを作成します。このプロセスでは、Sumo のホスト型コレクタで HTTP ソースを作成します。Sumo では、コレクタがソースを使用してデータを受信します。

  1. まだ Sumo アカウントをお持ちでない場合、https://www.sumologic.com/ で [Free Trial (無料トライアル)] をクリックすればアカウントを作成できます。
  2. Sumo ヘルプの「ホスト型コレクタの設定」の手順に従って、ホスト型コレクタを作成します (すでにある Sumo ホスト型コレクタを使用する場合は、このステップをスキップします)。
  3. 前のステップで作成したコレクタで HTTP ソースを作成します。手順については、Sumo ヘルプの「HTTP ログとメトリクス ソース」を参照してください。
  4. HTTP ソースの設定が完了したら、Sumo に HTTP エンドポイントの URL が表示されます。この URL を書き留めます。この URL は、データを Sumo に送信するために Kubernetes サービスを設定するときに使用します。

ステップ 2: Kubernetes シークレットの作成

HTTP ソース URL を使用して Kubernetes でシークレットを作成します。シークレット名を変更するには、それに合わせて Kubernetes マニフェストを変更する必要があります。

kubectl create secret generic sumologic --from-literal=collector-url=INSERT_HTTP_URL

確認メッセージが表示されます。

secret "sumologic" created

ステップ 3: Sumo Kubernetes FluentD プラグインのインストール

下記の「オプション A」の手順に従い、kubectl を使用してプラグインをインストールします。Helm チャートを使用する場合は、「オプション B」を参照してください。

開始する前に、カスタマイズできる設定、注釈を使用して選択した環境変数を上書きし、Sumo への送信からデータを除外する方法について、環境変数を確認してください。

オプション A: kubectl を使用したプラグインのインストール

fluentd.yaml で Kubernetes デーモンセットおよびロールのサンプルを参照してください。

  1. GitHub リポジトリを複製します。
  2. fluentd-kubernetes-sumologic で、kubectl を使用してチャートをインストールします。

使用する .yaml ファイルは、認証用に RBAC を実行しているかどうかによって異なります。RBAC は Kubernetes 1.6 以上ではデフォルトで有効になっています。

RBAC を使用しない場合 (Kubernetes 1.5 以下)

kubectl create -f /daemonset/nonrbac/fluentd.yaml

RBAC を使用する場合 (Kubernetes 1.6 以上) 

kubectl create -f /daemonset/rbac/fluentd.yaml

ヘッドラインの例

オプション B: Helm チャート

Helm を使用して Kubernetes リソースを管理する場合は、https://github.com/kubernetes/charts/tree/master/stable/sumologic-fluentd にプラグイン用の Helm チャートがあります。

プラグインをインストールしてから数分以内にログが Sumo に取り込まれ始めます。

環境変数

環境変数は、すべての Fluentd ソースに適用されるとは限りません。それぞれの変数によって影響を受ける Fluentd ソースについては、環境変数の定義の後に掲載されているテーブルを参照してください。

環境変数  説明
CONCAT_SEPARATOR 最終的な連結メッセージ内で行を区切るために使用する文字。複数行のメッセージのほとんどには、各行末に改行が含まれています。

デフォルト: ""
EXCLUDE_CONTAINER_REGEX コンテナの正規表現。一致するコンテナは Sumo から除外されます。ログは引き続き Fluentd に送信されます。
EXCLUDE_FACILITY_REGEX syslog ファシリティの正規表現。一致するファシリティは Sumo から除外されます。ログは引き続き Fluentd に送信されます。
EXCLUDE_HOST_REGEX    ホストの正規表現。一致するホストは Sumo から除外されます。ログは引き続き Fluentd に送信されます。
EXCLUDE_NAMESPACE_REGEX 名前空間の正規表現。一致する名前空間は Sumo から除外されます。ログは引き続き Fluentd に送信されます。
EXCLUDE_PATH このパターンに一致するファイルは in_tail プラグインによって無視され、Kubernetes または Sumo に送信されません。これはコンマ区切りのリストである場合もあります。詳細については、in_tail のドキュメントを参照してください。

たとえば、以下のように EXCLUDE_PATH を定義すると、/var/log/containers/*.log に一致するすべてのファイルが除外されます。
 
...env: - name: EXCLUDE_PATH value: "[\"/var/log/containers/*.log\"]"
EXCLUDE_POD_REGEX ポッドの正規表現。一致するポッドは Sumo から除外されます。ログは引き続き Fluentd に送信されます。
EXCLUDE_PRIORITY_REGEX syslog プライオリティの正規表現。一致するプライオリティは Sumo から除外されます。ログは引き続き Fluentd に送信されます。
EXCLUDE_UNIT_REGEX systemd ユニットの正規表現。一致するユニットは Sumo から除外されます。ログは引き続き Fluentd に送信されます。
FLUENTD_SOURCE Fluentd はファイルの tail または systemd のクエリができます。使用可能な値: filesystemd

デフォルト: file
FLUENTD_USER_CONFIG_DIR    ユーザ定義の Fluentd 設定ファイルのディレクトリ。コンテナの *.conf ディレクトリ内にある必要があります。
FLUSH_INTERVAL ログを Sumo に転送する頻度。

デフォルト: 30s
KUBERNETES_META JSON ログ形式を使用している場合、namespacepod_name などの Kubernetes メタデータを包含または除外します。

デフォルト: true
LOG_FORMAT ログを Sumo に転送するときの形式。使用可能な値:
  • text—ログが text 形式で SumoLogic に表示されます。
  • json—ログが json 形式で SumoLogic に表示されます。
  • json_mergejson の場合と同じですが、コンテナが json 形式で stdout にログする場合は、ルート レベルのコンテナ json ログでマージされ、ログ フィールドが削除されます。
デフォルト:json
MULTILINE_START_REGEXP 複数行のメッセージをマージするときに使用するコンタクト プラグインの正規表現。デフォルトは Jul 29, 2017 などのユリウス日です。
NUM_THREADS Sumo への HTTP スレッドの数を設定します。ログが重いクラスタではこの操作を実行する必要がある場合があります。

デフォルト: 1
READ_FROM_HEAD ファイルの末尾ではなく先頭からログの読み取りを開始します。コンテナ ログ ファイルにのみ適用されます。詳細については、in_tail のドキュメントを参照してください。

デフォルト: true
SOURCE_CATEGORY Sumo で _sourceCategory メタデータ フィールドを設定します。

デフォルト: "%{namespace}/%{pod_name}"
SOURCE_CATEGORY_PREFIX クラスタを識別する文字列を Sumo の _sourceCategory メタデータ フィールドの先頭に追加します。

デフォルト: kubernetes/
SOURCE_CATEGORY_REPLACE_DASH ダッシュ (-) 文字を別の文字に置換するために使用されます。

デフォルト: /

たとえば、名前空間アプリケーション内の travel-nginx-3629474229-dirmo という名前のポッドは _sourceCategory=app/travel/nginx で Sumo に表示されます。
SOURCE_HOST Sumo で _sourceHost メタデータ フィールドを設定します。

デフォルト: ""
SOURCE_NAME Sumo で _sourceName メタデータ フィールドを設定します。

デフォルト: "%{namespace}.%{pod}.%{container}"
AUDIT_LOG_PATH [Kubernetes 監査ログ] (https://kubernetes.io/docs/tasks/debug-application-cluster/audit/) へのパスを定義します。

デフォルト: /mnt/log/kube-apiserver-audit.log
TIME_KEY 時間として使用する必要がある json 形式のソースのフィールド名。「time_key」を参照してください。

デフォルト: time

次のテーブルでは、どの環境変数がどの Fluentd ソースに影響を与えるかを示しています。

環境変数 コンテナ Docker    Kubernetes Systemd
EXCLUDE_CONTAINER_REGEX
EXCLUDE_FACILITY_REGEX
EXCLUDE_HOST_REGEX
EXCLUDE_NAMESPACE_REGEX
EXCLUDE_PATH
EXCLUDE_PRIORITY_REGEX
EXCLUDE_POD_REGEX
EXCLUDE_UNIT_REGEX
TIME_KEY

注釈を使用した環境変数の上書き

LOG_FORMATSOURCE_CATEGORYSOURCE_NAME の各環境変数は、ポッドごとに Kubernetes 注釈を使用して上書きできます。例:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    app: mywebsite
  template:
    metadata:
      name: nginx
      labels:
        app: mywebsite
      annotations:
        sumologic.com/format: "text"
        sumologic.com/sourceCategory: "mywebsite/nginx"
        sumologic.com/sourceName: "mywebsite_nginx"
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

注釈を使用したデータの除外

sumologic.com/exclude 注釈を使用してデータを Sumo から除外することもできます。このデータは Fluentd には送信されますが、Sumo には送信されません。

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    app: mywebsite
  template:
    metadata:
      name: nginx
      labels:
        app: mywebsite
      annotations:
        sumologic.com/format: "text"
        sumologic.com/sourceCategory: "mywebsite/nginx"
        sumologic.com/sourceName: "mywebsite_nginx"
        sumologic.com/exclude: "true"
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

ステップ 4: メトリクス収集用の Heapster のセットアップ

Kubernetes クラスタからメトリクスを収集するためのお勧めの方法は、Heapster と Sumo コレクタおよび Graphite ソースを使用する方法です。

Heapster は Kubenetes クラスタ全体のメトリクスを集計します。Heapster はクラスタ内のポッドとして実行され、クラスタのすべてのノードを検出して各ノードの kubelet (マシン上の Kubernetes エージェント) から使用量情報を照会します。

Heapster は、クラスタ、ノード、およびポッド レベルのメトリクスを提供します。

Heapster を Kubernetes クラスタにインストールし、データを Graphite 形式で Sumo に送信するように Graphite Sink を設定します。手順については、https://github.com/kubernetes/heapster/blob/master/docs/sink-configuration.md#graphitecarbon を参照してください。

下の YAML ファイルを使用してシステムを設定したことを前提とすると、graphite の sink オプションは '--sink=graphite:tcp://sumo-graphite.kube-system.svc:2003' のようになります。デプロイを実行する名前空間、サービスの名前、Graphite ソースのポート番号に応じて変更する必要がある場合があります。

Sumo Docker コンテナを使用します。手順については、https://hub.docker.com/r/sumologic/collector/ を参照してください。

以降のセクションには、sources.json 設定を含む configmap の例、サービス例、実装例があります。kubectl を使用して Kubernetes でこれらのマニフェストを作成します。

Kubernetes configMap

kind: ConfigMap
apiVersion: v1
metadata:
  name: "sumo-sources"
data:
  sources.json: |-
    {
      "api.version": "v1",
      "sources": [
        {
          "name": "SOURCE_NAME",
          "category": "SOURCE_CATEGORY",
          "automaticDateParsing": true,
          "contentType": "Graphite",
          "timeZone": "UTC",
          "encoding": "UTF-8",
          "protocol": "TCP",
          "port": 2003,
          "sourceType": "Graphite"
        }
      ]
    }

Kubernetes service

apiVersion: v1
kind: Service
metadata:
  name: sumo-graphite
spec:
  ports:
   - port: 2003
  selector:
   app: sumo-graphite

Kubernetes デプロイ

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: sumo-graphite
  name: sumo-graphite
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: sumo-graphite
    spec:
      volumes:
      - name: sumo-sources
        configMap:
          name: sumo-sources
          items:
          - key: sources.json
            path: sources.json
      containers:
      - name: sumo-graphite
        image: sumologic/collector:latest
        ports:
        - containerPort: 2003
        volumeMounts:
        - mountPath: /sumo
          name: sumo-sources
        env:
        - name: SUMO_ACCESS_ID
          value: <SUMO_ACCESS_ID>
        - name: SUMO_ACCESS_KEY
          value: <SUMO_ACCESS_KEY>
        - name: SUMO_SOURCES_JSON
          value: /sumo/sources.json

ログ データ

上記の設定を実行した後で、ログが適切なメタデータを含めて json または text 形式で Sumo にストリーミングされ始めます。json 形式を使用している場合は、たとえば次のようにフィールドを自動的に抽出できます。

_sourceCategory=some/app | json auto.

Docker

docker.png

Kubelet

kubelet.png

コンテナ
container.png

taint と toleration

デフォルトでは、Fluentd ポッドは taint を持たないワーカー ノードとデフォルトのマスタ taint を超えて taint を持たないマスタ ノードでスケジュールされるため、これらからログを収集します。taint に関係なくすべてのノードでポッドをスケジュールするには、適用する前に fluentd.yaml で次の行を非コメント化します。

tolerations:
           #- operator: "Exists"

OpenShift での実行

このデーモンセット設定は /var/log をサービス アカウント FluentD としてマウントするため、コンテナを特権コンテナとして実行する必要があります。コマンド例を紹介します。

oc adm policy add-scc-to-user privileged system:serviceaccount:logging:sumologic-fluentd
oc adm policy add-cluster-role-to-user cluster-reader system:serviceaccount:logging:sumologic-fluentd
oc label node —all logging-sumologic-fluentd=true
oc patch ds sumologic-fluentd -p "spec:
  template:
    spec:
      containers:
      - image: sumologic/fluentd-kubernetes-sumologic:latest
        name: fluentd
        securityContext:
          privileged: true"
oc delete pod -l name = fluentd-sumologic
  • この記事は役に立ちましたか?