Logtail は Kubernetes から Sidecar モードでログを収集し、ログ収集を必要とするサービス容器ごとに Sidecar 容器を作成できるため、マルチ容器の分離が容易になり、収集パフォーマンスが向上します。

現在、Kubernetes クラスタにインストールされているデフォルトのログコンポーネントは DaemonSet です。これは、O&M の操作を簡素化し、リソースの占有が少なく、容器の標準出力と容器ファイルの収集をサポートし、柔軟に構成できます。

ただし、DaemonSet モードでは、Logtail はノード上のすべての容器からログを収集する必要があります。 これはパフォーマンスのボトルネックにつながり、サービスログ間の完全な分離はできません。 この問題を解決するために、Logtail は Sidecar を提供します。これにより、Logtail はログ収集を必要とする各サービス容器に対して Sidecar 容器を作成できます。 このモードでは、マルチ容器間の分離が大幅に強化され、収集パフォーマンスが向上します。 大規模な Kubernetes クラスタ、および複数のサービスを提供する PaaS プラットフォームとして機能するクラスタには、Sidecar モードの使用をお勧めします。

機能

  • Sidecar モードは、Kubernetes、オンプレミス ECS Kubernetes、および IDC のオンプレミス Kubernetes の容器サービスに適用できます。
  • Sidecar モードでは、Logtail は Pod名、Pod IP アドレス、Pod ネームスペース、およびPod が属するノードの名前と IP アドレスを含む、Pod メタデータを収集できます。
  • Sidecar モードでは、Logtail は CustomResourceDefinition(CRD)を介してプロジェクト、Logstores、インデックス、Logtail 構成、マシングループなどの Log Service リソースを自動的に作成できます。
  • Sidecar モードは動的スケーリングもサポートします。 レプリカの数はいつでも調整でき、変更はすぐに有効になります。

コンセプト

Sidecar モードでは、ログ収集で Logtail がログディレクトリをサービス容器と共有する必要があります。 簡単に言うと、サービス容器はログをログディレクトリに書き込み、Logtail はログディレクトリ内のログファイルの変更をモニタリングしてログを収集します。 詳細については、以下の説明をご参照ください。
  1. Sidecar ログ収集モードの紹介
  2. Sidecar モードの例

前提条件

  1. Log Service を有効化しました。

    まだ Log Service を有効にしていない場合は 、まず有効化します。

  2. CRD ベースの設定用にKubernetes のログ収集をインストールしました。

制限事項

  1. Logtail はログディレクトリをサービス容器と共有する必要があります。
  2. Sidecar モードは容器の標準出力の収集をサポートしません。

Sidecar 構成

Sidecar 構成には以下が含まれます:
  1. 基本操作パラメータの設定
  2. マウントパスの設定
例は次となります:
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
        # more info: https://cr.console.aliyun.com/repository/cn-hangzhou/log-service/logtail/detail
        # this images is released for every region 
        image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
        livenessProbe:
          exec:
            command:
            - /etc/init.d/ilogtaild
            - status
          initialDelaySeconds: 30
          periodSeconds: 30
        resources:
          limits:
            memory: 512Mi
          requests:
            cpu: 10m
            memory: 30Mi
        env:
          ##### base config
          # 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}"
          # config file path in logtail's container
          - name: "ALIYUN_LOGTAIL_CONFIG"
            value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
          ##### env tags config
          - 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
      ##### share this volume
      volumes:
      - name: nginx-log
        emptyDir: {}

構成 1:基本動作パラメータを設定します。

主なパラメータとその設定は次のとおりです。

##### base config
          # 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}"
          # config file path in logtail's container
          - name: "ALIYUN_LOGTAIL_CONFIG"
            value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
パラメーター 説明
$ {your_region_config} このパラメータは、プロジェクトのリージョンとネットワークの種類によって決まります。 ネットワークの種類に応じて適切な値に設定します。 有効な値:
  • インターネット:region-internet。 たとえば、中国(杭州)リージョンの値は cn-hangzhou-internet です。
  • Alibaba Cloud イントラネット:region。 たとえば、中国(杭州)リージョンの値は cn-hangzhou です。
このパラメータでの region はLogtail の Linux へのインストールです。 プロジェクトが属するリージョンに設定します。
${your_aliyun_user_id} このパラメータは、ユーザー ID を指定します。これは、文字列形式の Alibaba Cloud アカウント ID に置き換える必要があります。 IDのクエリの方法については、 ユーザー ID の設定のセクション 2.1 をご参照ください。
このパラメータ値は、 Alibaba Cloud アカウント ID である必要があります。 RAM ユーザー ID の場合は無効になります。
${your_machine_group_user_defined_id} このパラメータは、クラスタ内のマシングループのカスタム ID を指定します。 ID は、Log Service がデプロイされているリージョン内で一意である必要があります。 詳細は、マシングループにユーザー定義 ID を設定するを参照ください。

構成 2:マウントパスを設定します。

  1. Logtail とサービス容器は同じディレクトリにマウントする必要があります。
  2. emptyDir のマウント方法をお勧めします。
マウントパスの例は、前述の構成例に示されています。

ログ収集設定

ログ収集は、CRD または Log Service コンソールを介して設定できます。 CRD ベースの設定は、プロジェクト、ログストア、インデックス、マシングループ、および Logtail 構成の自動作成をサポートし、Kubernetes と簡単に統合できます。 そのため、CRD ベースの設定をお勧めします。 Kubernetes のログ収集を初めて使用、またはデバッグするユーザーにとっても、コンソールベースの設定が簡単です。

CRD ベースの設定

詳細は、CRD での Kubernetes ログ収集の設定をご参照ください。 DaemonSet 収集モードと比較して、CRD ベースの設定には以下の制限があります。
  1. ログ収集が必要なプロジェクトの名前を指定しなければなりません。 そうしないと、ログが収集され、ログコンポーネントがデフォルトでインストールされているプロジェクトに送信されます。
  2. 設定を有効にするには、マシングループを指定する必要があります。 そうしないと、設定は DaemonSet が属するマシングループにデフォルトで適用されます。
  3. Sidecar モードはファイル収集のみをサポートします、ファイル収集している間に dockerFile を false に設定する必要があります。
詳細は、次の例をご参照ください。

コンソールベースの設定

  1. マシングループの構成。
    Log Service コンソールで、Pod IP アドレスの変更に動的に適応するために、ID がカスタム ID に設定された Logtail マシングループを作成します。 そうするには、次の手順を実行します:
    1. Log Service を有効にして、プロジェクトとログストアを作成します。 詳細は、準備をご参照ください。
    2. マシングループリストページで、 マシングループの作成をクリックします。
    3. ID をカスタム ID ALIYUN_LOGTAIL_USER_DEFINED_ID に設定します。
  2. 収集モードの設定。

    対象のファイルの収集詳細を設定します。 現在、シンプルモード、Nginx アクセスモード、区切り文字モード、JSON モード、通常モードなど、さまざまなモードがサポートされています。 詳細は、テキストファイルの収集次をご参照ください。

    次の図にこの例の設定を示します。
    Docker ファイルを無効にする必要があります。

シナリオ:
  1. Kubernetes クラスタは IDC のオンプレミスクラスタであり、Log Service がデプロイされているリージョンは中国(杭州)です。 ログはインターネットから収集されます。
  2. 次の例では、マウントオブジェクトは nginx-log で、マウントタイプは emptyDir です。 これらはそれぞれ nginx-log-demo および logtail 容器内の /var/log/nginx ディレクトリにマウントされています。
  3. アクセスログは /var/log/nginx/access.log で、保存先ログストアは nginx-access です。
  4. エラーログは /var/log/nginx/error.log で、保存先ログストアは nginx-error です。
  • Sidecar 設定:
    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
            # more info: https://cr.console.aliyun.com/repository/cn-hangzhou/log-service/logtail/detail
            # this images is released for every region 
            image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
            livenessProbe:
              exec:
                command:
                - /etc/init.d/ilogtaild
                - status
              initialDelaySeconds: 30
              periodSeconds: 30
            env:
              ##### base config
              # user id
              - name: "ALIYUN_LOGTAIL_USER_ID"
                value: "xxxxxxxxxx"
              # user defined id
              - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
                value: "nginx-log-sidecar"
              # config file path in logtail's container
              - name: "ALIYUN_LOGTAIL_CONFIG"
                value: "/etc/ilogtail/conf/cn-hangzhou-internet/ilogtail_config.json"
              ##### env tags config
              - 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
          ##### share this volume
          volumes:
          - name: nginx-log
            emptyDir: {}
  • CRD 設定:
    # config for access log
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in you k8s cluster
      name: nginx-log-access-example
    spec:
      # project name to upload log
      project: k8s-nginx-sidecar-demo
      # logstore name to upload log
      logstore: nginx-access
      # machine group list to apply config, should be same with your sidecar' [ALIYUN_LOGTAIL_USER_DEFINED_ID]
      machineGroups:
      - nginx-log-sidecar
      # logtail config detail
      logtailConfig:
        # log file's input type is 'file'
        inputType: file
        # logtail config name, should be same with [metadata.name]
        configName: nginx-log-access-example
        inputDetail:
          # Simple logs with logType set to common_reg_log
          logType: common_reg_log
          # Log folder
          logPath: /var/log/nginx
          # File name with wildcards supported, for example, log_*.log
          filePattern: access.log
          # Sidecar mode with dockerFile set to false
          dockerFile: false
          # Line start regular expression, which is set to .* is the log contains only a line
          logBeginRegex: '. *'
          # Regular expression for parsing
          regex: '(\S+)\s(\S+)\s\S+\s\S+\s"(\S+)\s(\S+)\s+([^"]+)"\s+(\S+)\s(\S+)\s(\d+)\s(\d+)\s(\S+)\s"([^"]+)"\s. *'
          # List of the extracted keys
          key : ["time", "ip", "method", "url", "protocol", "latency", "payload", "status", "response-size",ser-agent"]
    # config for error log
    # config for error log
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # your config name, must be unique in you k8s cluster
      name: nginx-log-error-example
    spec:
      # project name to upload log
      project: k8s-nginx-sidecar-demo
      # logstore name to upload log
      logstore: nginx-error
      # machine group list to apply config, should be same with your sidecar' [ALIYUN_LOGTAIL_USER_DEFINED_ID]
      machineGroups:
      - nginx-log-sidecar
      # logtail config detail
      logtailConfig:
        # log file's input type is 'file'
        inputType: file
        # logtail config name, should be same with [metadata.name]
        configName: nginx-log-error-example
        inputDetail:
          # Simple logs with logType set to common_reg_log
          logType: common_reg_log
          # Log folder
          logPath: /var/log/nginx
          # File name with wildcards supported, for example, log_*.log
          filePattern: error.log
          # Sidecar mode with dockerFile set to false
          dockerFile: false
  • ログ収集エラーの表示

    上記の設定が Kubernetes クラスタに適用されると、Logtail 容器は対応するプロジェクト、ログストア、マシングループ、および Logtail 構成を自動的に作成し、収集されたログを Log Service に自動的に送信します。 Log Service コンソールにログインして詳細を表示できます。