Log Serviceを使用してKubernetes環境からログを収集する方法 後編(Alibaba Cloud)

2023年3月23日掲載

キービジュアル

ご覧いただきありがとうございます。ソフトバンクの小柳です。

前回の記事ではAlibaba CloudのLog Serviceを使用して、Kubernetes環境からログを収集する方法について紹介しました。

今回は前回の続きとなり、Log ServiceのエージェントにあたるLogtailをDaemonSetモードとSidecarモードで設定してKubernetes環境からログを収集する方法について、Alibaba Cloudコンソールの操作画像付きで説明します。

目次

前回のおさらい

はじめに、箇条書きで簡単に前回記事のおさらいをします。
後編にあたる本記事では、ログファイルを収集する2つの方法を紹介します。
続けて読んでいただいている方や、ログファイルを収集するデモから見たい方は次の項目からご覧ください。

  • Log Serviceとは、Alibaba Cloud上やオンプレのリソースから出力されるログを一元管理することができるフルマネージドサービスです。
  • Log Serviceを使用して、Kuberenetes環境からログを取得する方法は複数あります。
  • 前回は簡単なデモ環境の構築と、DaemonSetモードで標準出力を収集する方法を説明しました。

DaemonSetモードでログファイルを収集する手順

DaemonSetモードでテキストログを収集するLogtailの設定は、Log ServiceのコンソールとCRDによる設定の両方で設定することができます。

どの利用者でも、テキストログを収集したいという要件はあるはずなので、参考としてLog ServiceのコンソールとCRDの設定のそれぞれの設定方法の公式ドキュメントをご案内します。筆者のお勧めとしては、CRD方式の方がおすすめです。

ここからはデモに移っていきます。
ログデータ収集のデモのために、Nginxをベースとしたアプリケーションを作成します。

NginxのイメージはAlibaba Cloudから提供されており、以下のYAMLを使用してアプリケーションを構築すると、Nginxのデモ環境を構築できます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
        command: ["/bin/mock_log"]
        args: ["--log-type=nginx", "--stdout=false", "--stderr=true", "--path=/var/log/nginx/access.log", "--total-count=1000000000", "--logs-per-sec=100"]
        env:
          - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
            value: "test-daemonset"
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/nginx
      volumes:
        - name: nginx-log
          emptyDir: {}

コンソールからリソースを作成します。

dataintegration
dataintegration

アプリケーションを実行すると、Nginxのアクセスログが継続的に生成されます。

dataintegration

デモ用のアプリケーション環境が用意できました。

Log ServiceコンソールからLogtailの設定する方法

この段階ではまだログ収集はできていませんので、Log ServiceコンソールからLogtailの設定する方法を紹介していきます。
まず、Log Serviceのコンソールに移動して、新しいLogstoreを作成します。

dataintegration
  1. Log Serviceのプロジェクトをクリックして「Add」ボタンをクリックします。

  2. 必要な設定項目を入力します。

  3. 「OK」ボタンをクリックし、操作を実行します。

ログストアが作成され、通知ウィンドウが表示されます。ウィンドウ内の「Data Import Wizard」ボタンをクリックすると、Logtailの設定が始まります。

dataintegration
dataintegration
dataintegration
dataintegration
dataintegration
dataintegration
dataintegration
  1. データインポートウィザードで「Kubernetes - Object」オプションを選択します。

  2. 「Use Existing Machine Group」ボタンをクリックします。クラスタ作成時にLog Service機能を有効にすると、クラスタに基づいたマシングループが作成されます。

  3. クラスタIDで指定されたマシングループのチェックボックスにチェックを入れます。

  4. 「Move」ボタンをクリックすると、適用されたサーバーグループに追加されます。

  5. 「Next」ボタンをクリックして、マシングループの設定を終了します。

  6. 設定名とログファイルのパスを設定します。今回はNginxのアクセスログを利用するので、パスは「/var/log/nginx/access.log」と設定します。

  7. 「Docker File」オプションがオンになっていることを確認します。次に、「Deploy in K8S」オプションをオンにします。

  8. 「K8S Label Whitelist」にフィルタを1つ追加します。ここでは例として 「app:nginx」を選択します。

  9. 「Next」ボタンをクリックして、設定作業を終了します。

    「Next」 ボタンをクリックする前に、データ解析モードを変更することができます。デフォルトでは、「Simple Mode」に設定されており、ログデータは1行で収集されます。

    これは要件に応じて更新することができます。「JSON Mode」、「Delimiter Mode」、「Full Regex Mode」などにも対応しています。テストでは、デフォルトで「Simple Mode」を使用します。

    設定が終わると、ページ上でデータをプレビューできるようになりますが、ログデータはLogtailの設定に従って収集されます。ここでデータが収集されない場合は、設定を再確認し、修正する必要があります。

dataintegration

「Automatic Index Generation」ボタンをクリックすると、収集したデータを元にインデックスを自動生成することができます。

dataintegration

「Simple Mode」でデータを収集するため、行全体が「Content」という1つのフィールドとして認識されます。

dataintegration

「Next」ボタンをクリックすると、設定作業が終了し、成功のメッセージが表示されます。

dataintegration

収集したログは、「Log Query」ボタンをクリックすることでリアルタイムに確認することができます。

dataintegration

Logtailの設定を確認することもできます。

dataintegration

CRDでLogtailを設定する方法

もう1つの方法として、CRDでLogtailの設定を行う方法を紹介します。Log Serviceコンソールから設定する場合に比べて、YAMLを用意してカスタムリソースを作成すればよいだけなので、YAMLに慣れていればCRDの方が手順が少なくてすみます。

以下のようなYAMLを用意し、CRDでカスタムリソースオブジェクトを作成します。

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: simple-file-example
spec:
  logstore: k8s-file
  logtailConfig:
    inputType: file
    configName: simple-file-example
    inputDetail:
      logType: common_reg_log
      logPath: /var/log/nginx
      filePattern: access.log
      dockerFile: true
      IncludeK8sLabel:
        app: "nginx"
dataintegration
dataintegration

Log Serviceコンソールで、作成されたLogstore、収集されたログデータ、Logtailの設定を確認することができます。

dataintegration
dataintegration

Sidecarモードでログファイルを収集する手順

次にCRDを使って、Sidecar モードでコンテナのテキストログを収集します。

Sidecarモードでは、Logtailコンテナが作成されてアプリケーションコンテナとログディレクトリを共有します。
アプリケーションコンテナは、共有ディレクトリにログを書き込み、Logtailは共有ディレクトリのログファイルを監視してログを収集します。
DaemonSetモードと比較して、SidecarモードのほうがYAMLの記述量は増えます。

以下のようなYAMLを用意して、カスタムリソースオブジェクトを作成します。

apiVersion: batch/v1
kind: Job
metadata:
  name: nginx-log-sidecar-demo
  namespace: default
spec:
  template:
    metadata:
      name: nginx-log-sidecar-demo
    spec:
      restartPolicy: Never
      containers:
      - name: nginx-log-demo
        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
        command: ["/bin/mock_log"]
        args: ["--log-type=nginx", "--stdout=false", "--stderr=true", "--path=/var/log/nginx/access.log", "--total-count=1000000000", "--logs-per-sec=100"]
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/nginx
      ##### logtail sidecar container
      - name: logtail
        # 詳細情報: https://cr.console.aliyun.com/repository/cn-hangzhou/log-service/logtail/detail
        # このイメージは全地域で公開されています。
        image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
        # sigtermを受信すると、logtailは10秒遅れて停止します。
        command:
        - sh
        - -c
        - /usr/local/ilogtail/run_logtail.sh 10
        livenessProbe:
          exec:
            command:
            - /etc/init.d/ilogtaild
            - status
          initialDelaySeconds: 30
          periodSeconds: 30
        env:
          ##### 基本設定
          # user id
          - name: "ALIYUN_LOGTAIL_USER_ID"
            value: "${your_aliyun_user_id}"
          # user defined id
          - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
            value: "${your_machine_group_user_defined_id}"
          # Logtailのコンテナ内の設定ファイルのパス
          - name: "ALIYUN_LOGTAIL_CONFIG"
            value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
          ##### イベントタグの設定
          - name: "ALIYUN_LOG_ENV_TAGS"
            value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
          - name: "_pod_name_"
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: "_pod_ip_"
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: "_namespace_"
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: "_node_name_"
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: "_node_ip_"
            valueFrom:
              fieldRef:
                fieldPath: status.hostIP
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/nginx
      ##### ボリューム情報の共有
      volumes:
      - name: nginx-log
        emptyDir: {}


---


apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: nginx-log-access-example
spec:
  project: k8s-demo
  logstore: nginx-access
  machineGroups:
  - ${your_machine_group_user_defined_id}
  logtailConfig:
    inputType: file
    configName: nginx-log-access-example
    inputDetail:
      logType: common_reg_log
      logPath: /var/log/nginx
      filePattern: access.log
      dockerFile: false

上記のYAMLをベースにする場合は、基本設定と下部にあるSpec以降の箇所は、ご自身の環境に応じて設定を変更してください。

…
         ##### 基本設定
          # user id
          - name: "ALIYUN_LOGTAIL_USER_ID"
            value: "${your_aliyun_user_id}"
          # user defined id
          - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
            value: "${your_machine_group_user_defined_id}"
          # Logtailのコンテナ内の設定ファイルのパス
          - name: "ALIYUN_LOGTAIL_CONFIG"
            value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
          ##### イベントタグの設定
…
spec:
  project: k8s-demo
  logstore: nginx-access
  machineGroups:
  - ${your_machine_group_user_defined_id}
  logtailConfig:
…

環境に応じて変更頂く箇所は、以下の箇所です。

  • ${your_aliyun_user_id}: Alibaba CloudアカウントのIDです。

  • ${your_machine_group_user_defined_id}: マシングループのカスタム識別子です。例:nginx-log-sidecar。

  • ${your_region_config}: プロジェクトが存在するリージョンの ID と、プロジェクトが使用するネットワークの種類を指定します。例えば、ap-northeast-1 と設定すると、日本リージョンでイントラネット経由でログデータを収集し、ap-northeast-1-internet と設定すると、インターネット経由でログデータを収集します。

${your_machine_group_user_defined_id} は2か所ありますので、JobとCRDで定義されているそれぞれの ${your_machine_group_user_defined_id} が同じものであることを確認してください。

 

dataintegration
dataintegration
dataintegration
dataintegration

Log Serviceコンソールで、作成されたLogstore、収集されたログデータ、Logtailの設定を確認します。適用されたサーバーグループ情報が、設定ファイルに設定した ${your_machine_group_user_defined_id} と同じであることが確認できます。

dataintegration
dataintegration

まとめ

後編ではLog Serviceを使用して、Kubernetes環境のログデータを収集するためのデモを2つ紹介しました。

今回は収集方法までになりますが、収集したデータはクエリーを使って簡単な分析をしたり、クエリーの結果を使って、アラート通知したりすることもできます。

今まで他の記事では紹介されてこなかったLog Serviceですが、運用を効率化したり、負荷を下げるには良い製品になりますので、独自にSyslogサーバを構築されている方などは、ぜひ利用をご検討ください。

最後に本記事は2023年2月23日時点でのサービス内容、SLA、価格について説明になります。最新の情報はAlibaba Cloud公式サイトにて確認ください。

記事内容とAlibaba Cloud公式サイトに相違があった場合は、Alibaba Cloud上の情報を優先して確認ください。

関連サービス

Alibaba Cloud

Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。

おすすめの記事

条件に該当するページがございません