すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:インストールと設定

最終更新日:Jan 23, 2026

LoongCollector は、Alibaba Cloud Simple Log Service (SLS) の次世代ログ収集エージェントであり、Logtail のアップグレード版です。このトピックでは、Kubernetes クラスターに LoongCollector をインストールする方法について説明します。DaemonSet モードまたは Sidecar モードのいずれかでインストールできます。

事前準備

LoongCollector をインストールする前に、クラスターノードと SLS エンドポイント間のネットワーク接続を確認してください。これにより、LoongCollector がデータを正しくレポートできるようになります。

  1. サービスエンドポイントの取得:

    1. Simple Log Service コンソールにログインします。プロジェクトリストで、対象のプロジェクトをクリックします。

    2. プロジェクト名の横にある image アイコンをクリックして、プロジェクトの概要ページに移動します。

    3. [エンドポイント] セクションで、プロジェクトのリージョンのパブリックエンドポイントとプライベートエンドポイントを確認します。

  2. 接続のテスト: LoongCollector コンポーネントをインストールする予定のクラスターノードにログインし、次の curl コマンドを実行します。${ProjectName}${SLS_ENDPOINT} を実際の情報に置き換えてください。

    curl https://${Project_Name}.${SLS_ENDPOINT}
  3. 結果の確認:

    • コマンドが {"Error":{"Code":"OLSInvalidMethod",...}} を返した場合、ノードと SLS 間のネットワーク接続は正常です。

      説明

      このテストはネットワークレイヤーの接続性のみを検証します。リクエストに必要な API パラメーターが欠落しているため、SLS はエラーを返します。この動作は想定内です。

    • コマンドがタイムアウトするか、Connection refused などの他のネットワークレイヤーエラーを返す場合、ネットワーク接続の失敗を示します。ノードのネットワーク設定、セキュリティグループルール、または DNS 解決を確認してください。

インストール方法の選択

クラスターのタイプと要件に基づいて、次の表からインストール方法を選択してください。

インストール方法

利用シーン

ACK クラスターへのインストール (DaemonSet モード)

同一の Alibaba Cloud アカウントおよびリージョン内ACK マネージドクラスターおよび専用クラスターからログを収集します。

セルフマネージドクラスターへのインストール (DaemonSet モード)

  • 異なる Alibaba Cloud アカウントまたはリージョン間の Alibaba Cloud ACK クラスターからログを収集します。

  • セルフマネージドのデータセンターにデプロイされた Kubernetes クラスターからログを収集します。

  • 他のクラウドプロバイダーにデプロイされた Kubernetes クラスターからログを収集します。

Sidecar モードでのインストール

次の要件を持つ特定のアプリケーションからログを収集します:

  • リソースの隔離:DaemonSet エージェントがノード上の他の Pod に影響を与えるのを防ぎます。

  • きめ細かな収集:各アプリケーションに対して、個別の収集ソース、フィルター ルール、および出力先を設定します。

ACK クラスターへのインストール (DaemonSet モード)

説明

logtail-ds を使用していて LoongCollector にアップグレードしたい場合は、LoongCollector をインストールする前に logtail-ds をアンインストールする必要があります。

Alibaba Cloud Container Service for Kubernetes (ACK) コンソールでワンクリックで LoongCollector をインストールします。デフォルトでは、クラスターからのコンテナログは、同じアカウントとリージョンにある SLS プロジェクトに収集されます。アカウントやリージョンをまたいでログを収集するには、「セルフマネージドクラスターへのインストール (DaemonSet モード)」をご参照ください。

既存の ACK マネージドクラスターへのインストール

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、管理するクラスターを見つけ、その名前をクリックします。 左側のナビゲーションウィンドウで、アドオン管理 をクリックします。

  3. [ログとモニタリング] タブで、loongcollector を見つけ、[インストール] をクリックします。

  4. インストールが完了すると、SLS は ACK クラスターが配置されているリージョンに次のリソースを自動的に作成します。Simple Log Service コンソールにログインして表示します

    リソースタイプ

    リソース名

    目的

    プロジェクト

    k8s-log-${cluster_id}

    異なるサービスのログを分離するためのリソース管理ユニット。

    マシングループ

    k8s-group-${cluster_id}

    loongcollector-ds のマシングループ。主にログ収集に使用されます。

    k8s-group-${cluster_id}-cluster

    loongcollector-cluster のマシングループ。主にメトリック収集に使用されます。

    k8s-group-${cluster_id}-singleton

    単一インスタンスのマシングループ。主に一部の単一インスタンス収集設定に使用されます。

    Logstore

    config-operation-log

    重要

    この Logstore は削除しないでください。

    LoongCollector コンポーネント内の alibaba-log-controller からのログを保存します。標準の Logstore と同じ方法で課金されます。詳細については、「データ書き込み量に応じた課金項目の詳細」をご参照ください。この Logstore に収集設定を作成しないでください。

新しい ACK マネージドクラスター作成時のインストール

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [Kubernetes クラスターの作成] をクリックします。[詳細設定] セクションでは、SLS がデフォルトで有効になっています。[デフォルト設定の変更] をクリックして、プロジェクトを作成するか、既存のプロジェクトを使用します。

    このトピックでは、SLS に関連する設定のみを説明します。その他の設定項目については、「ACK マネージドクラスターの作成」をご参照ください。
  3. [プロジェクトの作成] を選択すると、SLS はデフォルトで以下のリソースを作成します。これらを表示するには、Simple Log Service コンソールにログインしてください

    リソースタイプ

    リソース名

    目的

    プロジェクト

    k8s-log-${cluster_id}

    異なるサービスのログを分離するためのリソース管理ユニット。

    マシングループ

    k8s-group-${cluster_id}

    loongcollector-ds のマシングループ。主にログ収集に使用されます。

    k8s-group-${cluster_id}-cluster

    loongcollector-cluster のマシングループ。主にメトリック収集に使用されます。

    k8s-group-${cluster_id}-singleton

    単一インスタンスのマシングループ。主に一部の単一インスタンス収集設定に使用されます。

    Logstore

    config-operation-log

    重要

    この Logstore は削除しないでください。

    LoongCollector コンポーネント内の alibaba-log-controller からのログを保存します。標準の Logstore と同じ方法で課金されます。詳細については、「データ書き込み量に応じた課金項目の詳細」をご参照ください。この Logstore に収集設定を作成しないでください。

自己管理型クラスターへのインストール (DaemonSet モード)

ユースケース

  • 自己管理型のデータセンターにある Kubernetes クラスター

  • 他のクラウドプロバイダーにデプロイされた Kubernetes クラスター

  • 異なるアカウントまたはリージョンにある Alibaba Cloud ACK クラスターからコンテナログを収集

説明

自己管理型クラスターで Kubernetes 1.6 以降が実行されていることを確認してください。

操作手順

  1. インストールパッケージのダウンロードと解凍:kubectl がインストールおよび設定されているマシンで、ご利用のクラスターのリージョンに対応するコマンドを実行し、LoongCollector とその依存コンポーネントをダウンロードします。

    # 中国リージョン
    wget https://aliyun-observability-release-cn-shanghai.oss-cn-shanghai.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh
    
    # 中国以外のリージョン
    wget https://aliyun-observability-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/loongcollector/k8s-custom-pkg/3.1.6/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh
  2. values.yaml 設定ファイルの変更loongcollector-custom-k8s-package フォルダ内の ./loongcollector/values.yaml 設定ファイルを変更します。

    説明

    values.yaml

    # ===================== 必須パラメーター =====================
    # このクラスターでログ収集に使用するプロジェクト名。例:k8s-log-custom-sd89ehdq
    projectName: ""
    # プロジェクトのリージョン。例 (上海):cn-shanghai
    region: ""
    # プロジェクトを所有する Alibaba Cloud アカウントの ID。ID は引用符で囲んでください。例:"123456789"
    aliUid: ""
    # 使用するネットワーク。オプション:Internet または Intranet。デフォルト:Internet
    net: Internet
    # Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID と AccessKey Secret。
    accessKeyID: ""
    accessKeySecret: ""
    # カスタムクラスター ID。ID には、大文字、小文字、数字、ハイフン (-) を使用できます。
    clusterID: ""
    
    # ... その他のオプションパラメーターは省略 ...

    projectName String (必須)

    LoongCollector がログをアップロードするプロジェクトの名前。命名規則は次のとおりです:

    • プロジェクト名には、小文字、数字、ハイフン (-) のみ使用できます。

    • 先頭は小文字、末尾は小文字または数字である必要があります。

    • 名前の長さは 3~63 文字である必要があります。

    region String (必須)

    プロジェクトが所在するリージョンの ID。詳細については、「リージョン」をご参照ください。

    aliUid String (必須)

    プロジェクトを所有する Alibaba Cloud アカウントの ID。

    net String (必須)

    ログデータの転送に使用するネットワークタイプ

    • Internet (デフォルト):パブリックネットワーク。

    • Intranet:内部ネットワーク。

    accessKeyID String (必須)

    プロジェクトへのアクセスに使用する AccessKey ID。Resource Access Management (RAM) ユーザーの AccessKey を使用し、その RAM ユーザーに AliyunLogFullAccess システムポリシーを付与してください。RAM の詳細については、「RAM ユーザーの概要」をご参照ください。

    accessKeySecret String (必須)

    指定した AccessKey ID に対応する AccessKey Secret。

    clusterID String (必須)

    クラスターのカスタム ID。名前には、大文字、小文字、数字、ハイフン (-) のみ使用できます。

    重要

    異なる Kubernetes クラスターに同じクラスター ID を使用しないでください。

  3. インストールスクリプトの実行loongcollector-custom-k8s-package フォルダで、次のコマンドを実行して LoongCollector とその依存コンポーネントをインストールします。

    bash k8s-custom-install.sh install
  4. インストールの確認:インストールが完了したら、次のコマンドを実行してコンポーネントのステータスを確認します:

    # Pod のステータスを確認
    kubectl get po -n kube-system | grep loongcollector-ds

    実行結果の例:

    loongcollector-ds-gnmnh   1/1     Running   0    63s

    コンポーネントの起動に失敗した場合 (ステータスが Running ではない場合):

    1. 設定の確認:values.yaml 内の設定項目が正しいことを確認します。

    2. イメージの確認:次のコマンドを実行し、出力の Events セクションを確認して、コンテナイメージが正常にプルされたことを確認します。

      kubectl describe pod loongcollector-ds -n kube-system
  5. コンポーネントがインストールされると、Simple Log Service (SLS) は自動的に次のリソースを作成します。Simple Log Service コンソールにログインして確認します。

    リソースタイプ

    リソース名

    目的

    プロジェクト

    values.yaml ファイルで指定した projectName の値

    異なるサービスのログを分離するためのリソース管理ユニット。

    マシングループ

    k8s-group-${cluster_id}

    ログ収集ノードのコレクション。

    k8s-group-${cluster_id}-cluster

    loongcollector-cluster のマシングループで、主にメトリック収集に使用されます。

    k8s-group-${cluster_id}-singleton

    単一インスタンスのマシングループで、主に単一インスタンスの収集設定に使用されます。

    Logstore

    config-operation-log

    重要

    この Logstore は削除しないでください。

    LoongCollector の alibaba-log-controller コンポーネントのログを格納します。課金は標準 Logstore と同じです。詳細については、「データ書き込み量に応じた課金モードの課金項目」をご参照ください。この Logstore には収集設定を作成しないでください。

サイドカーパターンを使用したインストール

サイドカーパターンは、詳細なログ管理、マルチテナントデータ分離、またはログ収集をアプリケーションライフサイクルにバインドするために使用します。このパターンでは、独立した LoongCollector (Logtail) コンテナーをアプリケーション Pod にインジェクトし、その Pod 内で専用のログ収集を可能にします。アプリケーションをデプロイしていない場合や、プロセスをテストしたい場合は、付録:YAML の例 を使用して、フローを迅速に検証できます。

1. アプリケーション Pod の YAML 構成の変更

  1. 共有ボリュームの定義

    spec.template.spec.volumescontainers セクションと同じレベルに、3つの共有ボリュームを追加します:

    volumes:
      # 共有ログディレクトリ (アプリケーションコンテナーによって書き込まれ、サイドカーによって読み取られる)
      - name: ${shared_volume_name} # <-- volumeMounts 内の名前と同じにする必要があります。
        emptyDir: {}
      
      # コンテナー間通信用のシグナリングディレクトリ (グレースフルな起動と停止のため)
      - name: tasksite
        emptyDir:
          medium: Memory  # パフォーマンス向上のため、媒体としてメモリを使用します。
          sizeLimit: "50Mi"
      
      # 共有ホストのタイムゾーン構成:Pod 内のすべてのコンテナーのタイムゾーンを同期します。
      - name: tz-config # <-- volumeMounts 内の名前と同じにする必要があります。
        hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai  # 必要に応じてタイムゾーンを変更します。
    
  2. アプリケーションコンテナーのボリュームマウントの設定

    your-business-app-container など、ご利用のアプリケーションコンテナーの volumeMounts セクションに、次のマウント構成を追加します:

    LoongCollector がログを収集できるように、アプリケーションコンテナーがログを ${shared_volume_path} ディレクトリに書き込むようにしてください。
    volumeMounts:
      # 共有ログボリュームをアプリケーションのログ出力ディレクトリにマウントします。
      - name: ${shared_volume_name}
        mountPath: ${shared_volume_path}  # 例:/var/log/app
    
      # 通信ディレクトリをマウントします。
      - name: tasksite
        mountPath: /tasksite  # LoongCollector コンテナーとの通信用の共有ディレクトリ。
    
      # タイムゾーンファイルをマウントします。
      - name: tz-config
        mountPath: /etc/localtime
        readOnly: true
    
  3. LoongCollector サイドカーコンテナーのインジェクト

    spec.template.spec.containers 配列に、次のサイドカーコンテナー定義を追加します:

    - name: loongcollector
      image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
      command: ["/bin/bash", "-c"]
      args:
        - |
          echo "[$(date)] LoongCollector: Starting initialization"
          
          # LoongCollector サービスを開始します。
          /etc/init.d/loongcollectord start
          
          # 構成がダウンロードされ、サービスが準備完了になるのを待ちます。
          sleep 15
          
          # サービスステータスを確認します。
          if /etc/init.d/loongcollectord status; then
            echo "[$(date)] LoongCollector: Service started successfully"
            touch /tasksite/cornerstone
          else
            echo "[$(date)] LoongCollector: Failed to start service"
            exit 1
          fi
          
          # アプリケーションコンテナーが完了するのを待ちます (tombstone ファイルシグナル経由)。
          echo "[$(date)] LoongCollector: Waiting for business container to complete"
          until [[ -f /tasksite/tombstone ]]; do
            sleep 2
          done
          
          # 残りのログをアップロードするための時間を確保します。
          echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
          sleep 30
          
          # サービスを停止します。
          echo "[$(date)] LoongCollector: Stopping service"
          /etc/init.d/loongcollectord stop
          echo "[$(date)] LoongCollector: Shutdown complete"
      # ヘルスチェック
      livenessProbe:
        exec:
          command: ["/etc/init.d/loongcollectord", "status"]
        initialDelaySeconds: 30
        periodSeconds: 10
        timeoutSeconds: 5
        failureThreshold: 3
      # リソース構成
      resources:
        requests:
          cpu: "100m"
          memory: "128Mi"
        limits:
          cpu: "2000m"
          memory: "2048Mi"
      # 環境変数構成
      env:
        - name: ALIYUN_LOGTAIL_USER_ID
          value: "${your_aliyun_user_id}"
        - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
          value: "${your_machine_group_user_defined_id}"
        - name: ALIYUN_LOGTAIL_CONFIG
          value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
        # Pod が終了する前にすべてのログが送信されるように、フルドレインモードを有効にします。
        - name: enable_full_drain_mode
          value: "true"  
        # Pod 環境情報をログタグとして追加します。
        - name: ALIYUN_LOG_ENV_TAGS
          value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
        # Pod とノードのメタデータをログタグとして自動的にインジェクトします。
        - 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: ${shared_volume_name} # <-- 共有ログディレクトリ名
          mountPath: ${dir_containing_your_files} # <-- サイドカー内の共有ディレクトリのパス
          readOnly: true
        # 通信ディレクトリをマウントします。
        - name: tasksite
          mountPath: /tasksite
        # タイムゾーンをマウントします。
        - name: tz-config
          mountPath: /etc/localtime
          readOnly: true
    

2. アプリケーションコンテナーのライフサイクルロジックの変更

ワークロードの種類に応じて、サイドカーとの協調的な終了をサポートするためにアプリケーションコンテナーを変更する必要があります。

短期タスク (Job/CronJob)

# 1. LoongCollector の準備が完了するのを待ちます。
echo "[$(date)] Business: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
  sleep 1
done
echo "[$(date)] Business: LoongCollector is ready, starting business logic"

# 2. コアビジネスロジックを実行します (ログが共有ディレクトリに書き込まれることを確認してください)。
echo "Hello, World!" >> /app/logs/business.log

# 3. 終了コードを保存します。
retcode=$?
echo "[$(date)] Business: Task completed with exit code: $retcode"

# 4. LoongCollector にビジネスタスクが完了したことを通知します。
touch /tasksite/tombstone
echo "[$(date)] Business: Tombstone created, exiting"

exit $retcode

長期サービス (Deployment/StatefulSet)

# シグナルハンドラー関数を定義します。
_term_handler() {
    echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."

    # グレースフル停止のために Nginx に QUIT シグナルを送信します。
    if [ -n "$NGINX_PID" ]; then
        kill -QUIT "$NGINX_PID" 2>/dev/null || true
        echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"

        # Nginx がグレースフルに停止するのを待ちます。
        wait "$NGINX_PID"
        EXIT_CODE=$?
        echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
    fi

    # LoongCollector にアプリケーションコンテナーが停止したことを通知します。
    echo "[$(date)] [nginx-demo] Writing tombstone file"
    touch /tasksite/tombstone

    exit $EXIT_CODE
}

# シグナルハンドラーを登録します。
trap _term_handler SIGTERM SIGINT SIGQUIT

# LoongCollector の準備が完了するのを待ちます。
echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do 
    sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting business logic"

# Nginx を起動します。
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"

# Nginx プロセスを待ちます。
wait $NGINX_PID
EXIT_CODE=$?

# シグナルが原因でない終了の場合も LoongCollector に通知します。
if [ ! -f /tasksite/tombstone ]; then
    echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
    touch /tasksite/tombstone
fi

exit $EXIT_CODE

3. グレースフル終了期間の設定

spec.template.spec で、LoongCollector が残りのログをアップロードするのに十分な時間を確保するために、十分な終了猶予期間を設定します。

spec:
  # ... その他の既存の spec 構成 ...
  template:
    spec:
      terminationGracePeriodSeconds: 600  # 10分間のグレースフル停止期間

4. パラメーターの説明

変数

説明

${your_aliyun_user_id}

ご利用の Alibaba Cloud アカウントの ID に設定します。詳細については、「ユーザー識別子の設定」をご参照ください。

${your_machine_group_user_defined_id}

マシングループのカスタム識別子を設定して、カスタムマシングループを作成します。例:nginx-log-sidecar

重要

この識別子がプロジェクトのリージョン内で一意であることを確認してください。

${your_region_config}

Simple Log Service プロジェクトのリージョンとアクセス用のネットワークタイプに基づいて指定します。リージョンに関する情報については、「サービスリージョン」をご参照ください。

例:プロジェクトが中国 (杭州) リージョンにある場合、Alibaba Cloud 内部ネットワーク経由でのアクセスには cn-hangzhou を使用し、パブリックネットワーク経由でのアクセスには cn-hangzhou-internet を使用します。

${shared_volume_name}

ボリュームのカスタム名を設定します。

重要

volumeMounts ノード配下の name パラメーターと volumes ノード配下の name パラメーターは、同じ値に設定する必要があります。これにより、LoongCollector コンテナーとアプリケーションコンテナーが同じボリュームをマウントすることが保証されます。

${dir_containing_your_files}

マウントパスを設定します。これは、収集対象のテキストログが格納されているコンテナー内のディレクトリです。

5. 構成の適用と結果の確認

  1. 次のコマンドを実行して変更をデプロイします:

    kubectl apply -f <YOUR-YAML>
  2. Pod のステータスを表示して、LoongCollector コンテナーが正常にインジェクトされたことを確認します:

    kubectl describe pod <YOUR-POD-NAME>

    2つのコンテナー (アプリケーションコンテナーと loongcollector コンテナー) が表示され、それらのステータスが正常であれば、インジェクトは成功です。

6. カスタム識別子を使用したマシングループの作成

  1. Simple Log Service (SLS) コンソールにログインし、対象のプロジェクトをクリックします。

  2. 左側のナビゲーションウィンドウで、image[リソース] > [マシングループ] を選択します。[マシングループ] の横にある 机器组[+] > [マシングループの作成] をクリックします。

  3. [マシングループの作成] ダイアログボックスで、次のパラメーターを設定し、[OK] をクリックします。

    • [名前]:マシングループの名前です。作成後に変更することはできません。命名規則は次のとおりです:

      • 小文字、数字、ハイフン (-)、アンダースコア (_) のみ使用できます。

      • 先頭と末尾は小文字または数字である必要があります。

      • 長さは 2~128 文字である必要があります。

    • マシン グループ識別子: [カスタム識別子] を選択します。

    • カスタム ID: 1. アプリケーション Pod の YAML 構成を変更するで LoongCollector コンテナーの YAML ファイルに設定した ALIYUN_LOGTAIL_USER_DEFINED_ID 環境変数の値を入力します。値は完全に一致する必要があります。一致しない場合、関連付けは失敗します。

  4. マシングループのハートビートステータスを確認します:マシングループが作成された後、その名前をクリックし、ステータス領域でハートビートステータスを表示します。

    • OK:LoongCollector が SLS に正常に接続し、マシングループが登録されたことを示します。

    • FAIL:

      • 構成がまだ有効になっていない可能性があります。構成が有効になるまで約 2 分かかります。ページを更新して、後でもう一度お試しください。

      • 2 分経ってもステータスが [FAIL] のままである場合は、「Logtail マシングループの問題のトラブルシューティング」をご参照のうえ、問題を診断してください。

各 Pod は個別の LoongCollector インスタンスに対応します。アプリケーションや環境ごとに異なるカスタム識別子を使用することで、詳細な管理が容易になります。

よくある質問

ACK マネージドクラスターの LoongCollector 設定を変更して、アカウント間またはリージョン間でログを収集するにはどうすればよいですか?

Alibaba Cloud の ACK コンソールから LoongCollector をインストールした場合、デフォルトでは、クラスターから同じ Alibaba Cloud アカウント配下の SLS プロジェクトにコンテナログが収集されます。アカウント間またはリージョン間でコンテナログを収集するには、次の 2 つのいずれかの方法を使用します。

方法 1:アンインストールと再インストール

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、管理対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、アドオン管理 をクリックします。

  3. [ログとモニタリング] タブで loongcollector を見つけ、[アンインストール] をクリックします。

  4. コンポーネントを再インストールします。詳細については、「セルフマネージドクラスターへのインストール (DaemonSet モード)」をご参照ください。

方法 2:Helm 設定を更新して LoongCollector を再デプロイ

  1. ACK コンソールにログインします。クラスターページに移動します。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。

  2. Helm ページで loongcollector を見つけ、[操作] 列の [更新] をクリックします。[リリースを更新] ページで、次の表に記載されている設定のみを変更し、[OK] をクリックします。

    クラスターとプロジェクト

    変更するパラメーター

    同一アカウント、別リージョン

    region:SLS プロジェクトが配置されているリージョンの リージョン ID

    net:値を `Internet` に設定します。異なるリージョン間では、内部ネットワーク経由でのデータ転送はできません。

    別アカウント、同一リージョン

    aliUid:SLS プロジェクトが属する Alibaba Cloud アカウントの ID。複数のアカウント ID はコンマ (,) で区切ります。

    net:値を `Intranet` に設定します。同一リージョン内では、内部ネットワーク経由でデータを転送できます。

    別アカウント、別リージョン

    aliUid:SLS プロジェクトが属する Alibaba Cloud アカウントの ID。複数のアカウント ID はコンマ (,) で区切ります。

    region:プロジェクトが配置されているリージョンの リージョン ID

    net:値を `Internet` に設定します。異なるリージョン間では、内部ネットワーク経由でのデータ転送はできません。

  3. マシングループの作成

    1. Simple Log Service コンソールにログインし、対象のプロジェクトをクリックします。

    2. 左側のナビゲーションウィンドウで、imageリソース > マシングループ に移動します。[マシングループ] の右側にある 机器组 > マシングループの作成 をクリックします。

    3. [マシングループの作成] ダイアログボックスで、次のパラメーターを設定し、[OK] をクリックします。

      1. マシングループの名前を入力します。

      2. [マシングループ ID][カスタム ID] に設定します。

      3. [カスタム ID] フィールドに k8s-group-${cluster_id} を入力します。${cluster_id} をご利用のクラスターの実際の clusterID に置き換えます。

    4. マシングループが作成されたら、マシングループのリストでそれを見つけて名前をクリックします。[マシングループ設定] > [マシングループステータス] セクションで、[ハートビート] のステータスを確認します。ステータスが [OK] の場合は、マシングループが正常に作成されたことを示します。ハートビートが失敗した場合は、ユーザー ID とカスタム ID を確認してください。

  4. 設定を変更したら、[OK] をクリックします。


Alibaba Cloud ACK Edge、ACK One、ACS、および ACK Serverless クラスターからコンテナログを収集するにはどうすればよいですか?

次のステップ

LoongCollector をインストールした後、「Kubernetes クラスターからコンテナーログを収集する」をご参照ください。このトピックでは、基本原則、主要なプロセス、選択に関する推奨事項、ベストプラクティスについて説明します。次に、以下のいずれかの方法を使用してコレクション構成を作成してください。

付録:YAML の例

この例では、NGINX アプリケーションコンテナーと LoongCollector サイドカーコンテナーを含む、完全な Kubernetes デプロイメント構成を提供します。この構成は、サイドカーパターンを使用してコンテナーログを収集するのに適しています。

開始する前に、次の 3 つの項目を置き換えてください:

  1. ${your_aliyun_user_id} をご自身の Alibaba Cloud アカウントの UID に置き換えます。

  2. ${your_machine_group_user_defined_id}ステップ 3 で作成したマシングループのカスタム ID に置き換えます。 ID は完全に一致している必要があります。

  3. ${your_region_config} を、SLS プロジェクトのリージョンとネットワークタイプに一致する構成名で置き換えます。

    例えば、中国 (杭州) リージョンのプロジェクトの場合、内部ネットワークアクセスには cn-hangzhou を、パブリックネットワークアクセスには cn-hangzhou-internet を使用します。

短期タスク (Job/CronJob)

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-job
spec:
  backoffLimit: 3                   
  activeDeadlineSeconds: 3600        
  completions: 1                     
  parallelism: 1                    
  
  template:
    spec:
      restartPolicy: Never         
      terminationGracePeriodSeconds: 300 
      
      containers:
        # アプリケーションコンテナー
        - name: demo-job
          image: debian:bookworm-slim
          command: ["/bin/bash", "-c"]
          args:
            - |
              # LoongCollector の準備が完了するまで待機します。
              echo "[$(date)] Business: Waiting for LoongCollector to be ready..."
              until [[ -f /tasksite/cornerstone ]]; do 
                sleep 1
              done
              echo "[$(date)] Business: LoongCollector is ready, starting business logic"
              
              # ビジネスロジックを実行します。
              echo "Hello, World!" >> /app/logs/business.log
              
              # 終了コードを保存します。
              retcode=$?
              echo "[$(date)] Business: Task completed with exit code: $retcode"
              
              # ビジネスロジックの完了を LoongCollector に通知します。
              touch /tasksite/tombstone
              echo "[$(date)] Business: Tombstone created, exiting"
              
              exit $retcode
          
          # リソース制限
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500"
              memory: "512Mi"
          
          # ボリュームマウント
          volumeMounts:
            - name: app-logs
              mountPath: /app/logs
            - name: tasksite
              mountPath: /tasksite


        # LoongCollector サイドカーコンテナー
        - name: loongcollector
          image: aliyun-observability-release-registry.cn-hongkong.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
          command: ["/bin/bash", "-c"]
          args:
            - |
              echo "[$(date)] LoongCollector: Starting initialization"
              
              # LoongCollector サービスを開始します。
              /etc/init.d/loongcollectord start
              
              # 構成がダウンロードされ、サービスが準備完了になるまで待機します。
              sleep 15
              
              # サービスステータスを確認します。
              if /etc/init.d/loongcollectord status; then
                echo "[$(date)] LoongCollector: Service started successfully"
                touch /tasksite/cornerstone
              else
                echo "[$(date)] LoongCollector: Failed to start service"
                exit 1
              fi
              
              # アプリケーションコンテナーが完了するのを待ちます。
              echo "[$(date)] LoongCollector: Waiting for business container to complete"
              until [[ -f /tasksite/tombstone ]]; do 
                sleep 2
              done
              
              echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
              # 残りのログを転送するために十分な時間を確保します。
              sleep 30
              
              echo "[$(date)] LoongCollector: Stopping service"
              /etc/init.d/loongcollectord stop
              
              echo "[$(date)] LoongCollector: Shutdown complete"
          
          # ヘルスチェック
          livenessProbe:
            exec:
              command: ["/etc/init.d/loongcollectord", "status"]
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          
          # リソース構成
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          
          # 環境変数の構成
          env:
            - name: ALIYUN_LOGTAIL_USER_ID
              value: "your-user-id"
            - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
              value: "your-user-defined-id"
            - name: ALIYUN_LOGTAIL_CONFIG
              value: "/etc/ilogtail/conf/cn-hongkong/ilogtail_config.json"
            - name: ALIYUN_LOG_ENV_TAGS
              value: "_pod_name_|_pod_ip_|_namespace_|_node_name_"
            
            # Pod 情報のインジェクション
            - 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
          
          # ボリュームマウント
          volumeMounts:
            - name: app-logs
              mountPath: /app/logs
              readOnly: true
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
      
      # ボリューム定義
      volumes:
        - name: app-logs
          emptyDir: {}
        - name: tasksite
          emptyDir:
            medium: Memory
            sizeLimit: "10Mi"
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai

長期サービス (Deployment/StatefulSet)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
  namespace: production
  labels:
    app: nginx-demo
    version: v1.0.0
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1      
      maxSurge: 1          
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
        version: v1.0.0    
    spec:
      terminationGracePeriodSeconds: 600  # 10 分間のグレースフルストップ期間
      
      containers:
        # アプリケーションコンテナー - Web アプリケーション
        - name: nginx-demo
          image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6          
          # 開始コマンドとシグナルハンドリング
          command: ["/bin/sh", "-c"]
          args:
            - |
              # シグナルハンドラー関数を定義します。
              _term_handler() {
                  echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
                  
                  # グレースフルストップのために Nginx に QUIT シグナルを送信します。
                  if [ -n "$NGINX_PID" ]; then
                      kill -QUIT "$NGINX_PID" 2>/dev/null || true
                      echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
                      
                      # Nginx がグレースフルに停止するのを待ちます。
                      wait "$NGINX_PID"
                      EXIT_CODE=$?
                      echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
                  fi
                  
                  # アプリケーションコンテナーが停止したことを LoongCollector に通知します。
                  echo "[$(date)] [nginx-demo] Writing tombstone file"
                  touch /tasksite/tombstone
                  
                  exit $EXIT_CODE
              }
              
              # シグナルハンドラーを登録します。
              trap _term_handler SIGTERM SIGINT SIGQUIT

              # LoongCollector の準備が完了するまで待機します。
              echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
              until [[ -f /tasksite/cornerstone ]]; do 
                sleep 1
              done
              echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting business logic"
              
              # Nginx を開始します。
              echo "[$(date)] [nginx-demo] Starting Nginx..."
              nginx -g 'daemon off;' &
              NGINX_PID=$!
              echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
              
              # Nginx プロセスを待ちます。
              wait $NGINX_PID
              EXIT_CODE=$?
              
              # シグナルが原因で終了しなかった場合も LoongCollector に通知します。
              if [ ! -f /tasksite/tombstone ]; then
                  echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
                  touch /tasksite/tombstone
              fi
              
              exit $EXIT_CODE
                    
          # リソース構成
          resources:
            requests:
              cpu: "200m"
              memory: "256Mi"
            limits:
              cpu: "1000m"
              memory: "1Gi"
          
          # ボリュームマウント
          volumeMounts:
            - name: nginx-logs
              mountPath: /var/log/nginx
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true

        # LoongCollector サイドカーコンテナー
        - name: loongcollector
          image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
          command: ["/bin/bash", "-c"]
          args:
            - |
              echo "[$(date)] LoongCollector: Starting initialization"
              
              # LoongCollector サービスを開始します。
              /etc/init.d/loongcollectord start
              
              # 構成がダウンロードされ、サービスが準備完了になるまで待機します。
              sleep 15
              
              # サービスステータスを確認します。
              if /etc/init.d/loongcollectord status; then
                echo "[$(date)] LoongCollector: Service started successfully"
                touch /tasksite/cornerstone
              else
                echo "[$(date)] LoongCollector: Failed to start service"
                exit 1
              fi
              
              # アプリケーションコンテナーが完了するのを待ちます。
              echo "[$(date)] LoongCollector: Waiting for business container to complete"
              until [[ -f /tasksite/tombstone ]]; do 
                sleep 2
              done
              
              echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
              # 残りのログを転送するために十分な時間を確保します。
              sleep 30
              
              echo "[$(date)] LoongCollector: Stopping service"
              /etc/init.d/loongcollectord stop
              
              echo "[$(date)] LoongCollector: Shutdown complete"
          
          # ヘルスチェック
          livenessProbe:
            exec:
              command: ["/etc/init.d/loongcollectord", "status"]
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          # リソース構成
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "2000m"
              memory: "2048Mi"
          
          # 環境変数の構成
          env:
            - name: ALIYUN_LOGTAIL_USER_ID
              value: "${your_aliyun_user_id}"
            - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
              value: "${your_machine_group_user_defined_id}"
            - name: ALIYUN_LOGTAIL_CONFIG
              value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
            
            # Pod 停止時にすべてのログが送信されるように、フルドレインモードを有効にします。
            - name: enable_full_drain_mode
              value: "true"
            
            # Pod の環境情報をログタグとして追加します。
            - name: "ALIYUN_LOG_ENV_TAGS"
              value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
            # Pod とノードの情報を取得します。
            - 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-logs
              mountPath: /var/log/nginx
              readOnly: true
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
      
      # ボリューム定義
      volumes:
        - name: nginx-logs
          emptyDir: {}
        - name: tasksite
          emptyDir:
            medium: Memory
            sizeLimit: "50Mi"
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai

関連情報

リージョン

  1. Simple Log Service コンソールにログインします。プロジェクトリストで、ターゲットプロジェクトをクリックします。

  2. プロジェクト名の右側にある image アイコンをクリックして、プロジェクトの概要ページを開きます。

  3. [基本情報] セクションで、現在のプロジェクトのリージョン名を表示します。リージョン名とリージョン ID のマッピングについては、次の表をご参照ください。

    リージョンは、Alibaba Cloud サービスの物理データセンターが設置されている地理的な場所を指します。リージョン ID は、Alibaba Cloud サービスのリージョンの一意の識別子です。

    リージョン名

    リージョン ID

    中国 (青島)

    cn-qingdao

    中国 (北京)

    cn-beijing

    中国 (張家口)

    cn-zhangjiakou

    中国 (フフホト)

    cn-huhehaote

    中国 (ウランチャブ)

    cn-wulanchabu

    中国 (杭州)

    cn-hangzhou

    中国 (上海)

    cn-shanghai

    中国 (南京-ローカルリージョン - 提供終了)

    cn-nanjing

    中国 (福州-ローカルリージョン - 提供終了)

    cn-fuzhou

    中国 (深セン)

    cn-shenzhen

    中国 (河源)

    cn-heyuan

    中国 (広州)

    cn-guangzhou

    フィリピン (マニラ)

    ap-southeast-6

    韓国 (ソウル)

    ap-northeast-2

    マレーシア (クアラルンプール)

    ap-southeast-3

    日本 (東京)

    ap-northeast-1

    タイ (バンコク)

    ap-southeast-7

    中国 (成都)

    cn-chengdu

    シンガポール

    ap-southeast-1

    インドネシア (ジャカルタ)

    ap-southeast-5

    中国 (香港)

    cn-hongkong

    ドイツ (フランクフルト)

    eu-central-1

    米国 (バージニア)

    us-east-1

    米国 (シリコンバレー)

    us-west-1

    イギリス (ロンドン)

    eu-west-1

    UAE (ドバイ)

    me-east-1

    サウジアラビア (リヤド - パートナー運営)

    me-central-1

Loongcollector のネットワーク転送タイプ

エンドポイントは、Simple Log Service のアクセスドメイン名です。これは、プロジェクトとそのログデータにアクセスするために使用される URL であり、プロジェクトが配置されているリージョンに関連しています。Simple Log Service は、プライベートエンドポイント、パブリックエンドポイント、およびアクセラレーションエンドポイントを提供します。エンドポイントは次のように表示できます:

  1. Simple Log Service コンソールにログインし、プロジェクトリストでターゲットプロジェクトをクリックします。

  2. プロジェクト名の右側にある image アイコンをクリックして、プロジェクトの概要ページに移動します。

  3. [エンドポイント] セクションで、現在のプロジェクトのエンドポイント情報を表示できます。異なるネットワーク転送方式は、異なるエンドポイントに対応します。適切なネットワーク転送方式は、より高速で安定したログデータ転送を保証するのに役立ちます。

ネットワークタイプ

適用ドメイン名

説明

シナリオ

Alibaba Cloud プライベートネットワーク

プライベートエンドポイント

Alibaba Cloud プライベートネットワークは、ギガビット共有ネットワークです。Alibaba Cloud プライベートネットワークを介してログデータを転送すると、パブリックネットワークを介するよりも高速で安定します。プライベートネットワークには、VPC とクラシックネットワークが含まれます。

ECS インスタンスと Simple Log Service プロジェクトが同じリージョンにある場合、またはオンプレミスサーバーがプライベートネットワークに接続されている場合。

説明

ECS インスタンスと同じリージョンに Simple Log Service プロジェクトを作成します。これにより、パブリック帯域幅を消費することなく、Alibaba Cloud プライベートネットワークを介して ECS インスタンスからログを収集できます。

パブリックネットワーク

パブリックエンドポイント

パブリックネットワークを使用してログデータを転送する場合、データ収集の速度と安定性は、ネットワーク帯域幅の制限、ネットワークジッター、遅延、パケット損失の影響を受ける可能性があります。

次の 2 つのケースでは、パブリックネットワークを介してデータを転送することを選択できます:

  • ECS インスタンスと Simple Log Service プロジェクトが異なるリージョンにある。

  • サーバーが他のクラウドプロバイダーまたはオンプレミスのデータセンターのものである。

転送アクセラレーション

アクセラレーションエンドポイント

この方式では、Alibaba Cloud CDN の POP (Points of Presence) を利用してログ収集を高速化します。パブリックネットワークでの収集と比較して、ネットワーク遅延と安定性において大きな利点があります。ただし、トラフィックに対して課金されます。

ビジネスサーバーと Simple Log Service プロジェクトが異なるリージョン (たとえば、一方が中国本土に、もう一方が中国以外にあるなど) にある場合、パブリックネットワークを使用すると、高いネットワーク遅延と不安定な転送が発生する可能性があります。この場合、転送アクセラレーションの使用を選択できます。詳細については、「転送アクセラレーション」をご参照ください。

Loongcollector の実行モード

属性

DaemonSet モード

Sidecar モード

デプロイ方法

各ノードに 1 つの収集コンテナーをデプロイします。

各 Pod に 1 つの収集コンテナーをデプロイします。

リソース消費

低い (ノードリソースを共有)

高い (各 Pod が個別に占有)

ユースケース

ノードレベルでの統合ログ収集。

特定のアプリケーションのための分離されたログ収集。

隔離

ノードレベルの共有

Pod レベルの独立性

DaemonSet モードの仕組み

クラスターの各ノードに LoongCollector がデプロイされ、そのノード上のすべてのコンテナーからログを収集します。このモードは、シンプルな O&M、低いリソース消費、柔軟な設定を特徴としますが、隔離性は弱いです。

  • DaemonSet モードでは、Kubernetes クラスターは各ノードで 1 つの LoongCollector コンテナーのみが実行されることを保証します。このコンテナーは、同じノード上の他のすべてのコンテナーからログを収集します。

  • 新しいノードがクラスターに参加すると、Kubernetes は自動的にそのノードに LoongCollector コンテナーを作成します。ノードがクラスターから離脱すると、Kubernetes はそのノード上の LoongCollector コンテナーを自動的に破棄します。DaemonSet の自動スケーリングメカニズムと識別子ベースのマシングループにより、LoongCollector インスタンスを手動で管理する必要がなくなります。

image

Sidecar モードの仕組み

LoongCollector Sidecar コンテナーは、アプリケーションコンテナーと一緒に各 Pod に注入されます。アプリケーションコンテナーのログディレクトリは、emptyDir、hostPath、または永続ボリューム (PV) などの Kubernetes ボリュームを使用して共有ボリュームとしてマウントされます。これにより、ログファイルはアプリケーションコンテナーと Sidecar コンテナーの両方のマウントパスで利用可能になり、LoongCollector が直接読み取ることができます。このモードは、優れたマルチテナントデータ分離とパフォーマンスを特徴とします。ただし、より多くのリソースを消費し、設定と保守がより複雑になります。

  • Sidecar モードでは、各 Pod 内で LoongCollector コンテナーが実行され、その Pod 内の他のすべてのコンテナーからログを収集します。異なる Pod のログ収集は分離されます。

  • 同じ Pod 内の他のコンテナーからログファイルを収集するには、共有ボリュームを使用できます。同じボリュームをアプリケーションコンテナーと LoongCollector コンテナーの両方にマウントする必要があります。

  • ノード上の Pod のデータ量が非常に大きく、DaemonSet モードの収集パフォーマンスの制限を超える場合、Sidecar モードを使用して LoongCollector に特定のリソースを割り当てることができます。これにより、ログ収集のパフォーマンスと安定性が向上します。

  • サーバーレスコンテナーにはノードの概念がないため、従来の DaemonSet デプロイモードは使用できません。このシナリオでは、Sidecar モードをサーバーレスアーキテクチャと組み合わせて、柔軟で適応性のあるログ収集プロセスを確保できます。

image