LoongCollector は、Alibaba Cloud の Simple Log Service (SLS) 向けの次世代ログ収集エージェントであり、Logtail をアップグレードして機能を強化したものです。DaemonSet または Sidecar モードで Kubernetes クラスターにインストールできます。
前提条件
LoongCollector をインストールする前に、クラスターノードと Simple Log Service のサーバー側エンドポイントとの間のネットワーク接続性を確認してください。ログ収集でデータを報告するには、ノードがそのエンドポイントに到達できる必要があります。
-
サービスエンドポイントの取得:
-
Simple Log Service コンソールにログインします。プロジェクトリストで、対象のプロジェクトをクリックします。
-
プロジェクト名の横にある
アイコンをクリックして、プロジェクトの概要ページを開きます。 -
「基本情報」セクションで、プロジェクトのリージョンに対応するパブリックエンドポイントと内部エンドポイントを確認します。
-
-
接続性テストの実行:LoongCollector をインストールするクラスターノードにログインし、次の
curlコマンドを実行します。${ProjectName}と${SLS_ENDPOINT}を実際の値に置き換えてください。curl https://${ProjectName}.${SLS_ENDPOINT} -
テスト結果の確認:
-
コマンドが
{"Error":{"Code":"OLSInvalidMethod",...}}を返した場合、ノードは Simple Log Service へのネットワーク接続性があります。説明このテストはネットワーク層の接続性のみを検証します。リクエストに必要な API パラメーターが不足しているため、このエラー応答は想定内の動作です。
-
コマンドがタイムアウトするか、
Connection refusedなどの他のネットワーク層エラーを返す場合は、ノードのネットワーク設定、セキュリティグループルール、または DNS の名前解決を確認してください。
-
インストール方法
クラスターのタイプと要件に基づいてインストール方法を選択してください。
|
インストール方法 |
利用シーン |
|
同一の Alibaba Cloud アカウントおよびリージョン内の ACK マネージドクラスターおよび専用クラスターからログを収集します。 |
|
|
|
|
以下を必要とする特定のアプリケーションからログを収集します:
|
ACK クラスターへのインストール (DaemonSet モード)
Container Service for Kubernetes (ACK) コンソールでワンクリックで LoongCollector をインストールできます。デフォルトでは、LoongCollector はコンテナログを収集し、同じ Alibaba Cloud アカウントおよびリージョン内のプロジェクトに送信します。アカウントやリージョンをまたいでログを収集するには、「セルフマネージドクラスターへのインストール (DaemonSet モード)」をご参照ください。
既存の ACK マネージドクラスターへのインストール
-
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 [コンポーネントとアドオン] をクリックします。
-
ログとモニタリング タブで loongcollector を見つけ、インストール をクリックします。
-
インストール後、Simple Log Service (SLS) は ACK クラスターのリージョンに以下のリソースを自動的に作成します。これらは Simple Log Service (SLS) コンソールで確認できます。
リソースタイプ
リソース名
目的
プロジェクト
k8s-log-${cluster_id}異なるサービスのログを隔離します。
マシングループ
k8s-group-${cluster_id}loongcollector-ds のマシングループで、ログ収集に使用されます。
k8s-group-${cluster_id}-clusterloongcollector-cluster のマシングループで、メトリック収集に使用されます。
k8s-group-${cluster_id}-singleton特定の単一インスタンス収集設定用のマシングループ。
重要LoongCollector コンポーネントは
config-operation-logという名前の Logstore を作成しません。この Logstore が既に存在する場合、LoongCollector はそこにログを書き込みません。
ACK マネージドクラスター作成時のインストール
-
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターの作成 をクリックします。コンポーネント設定 ページで、Log Service の使用 チェックボックスを選択します。その後、[新しいプロジェクトを作成] または [既存のプロジェクトを使用] を選択できます。
このトピックでは、Simple Log Service (SLS) の設定のみを説明します。他の設定項目に関する詳細については、「ACK マネージドクラスターの作成」をご参照ください。
-
プロジェクトの作成 を選択すると、SLS は自動的に以下のリソースを作成します。これらは Simple Log Service (SLS) コンソールで確認できます。
リソースタイプ
リソース名
目的
プロジェクト
k8s-log-${cluster_id}異なるサービスのログを隔離します。
マシングループ
k8s-group-${cluster_id}loongcollector-ds のマシングループで、ログ収集に使用されます。
k8s-group-${cluster_id}-clusterloongcollector-cluster のマシングループで、メトリック収集に使用されます。
k8s-group-${cluster_id}-singleton特定の単一インスタンス収集設定用のマシングループ。
重要LoongCollector コンポーネントは
config-operation-logという名前の Logstore を作成しません。この Logstore が既に存在する場合、LoongCollector はそこにログを書き込みません。
セルフマネージドクラスターへのインストール (DaemonSet モード)
利用シーン
-
セルフマネージドのデータセンターにある Kubernetes クラスター
-
他のクラウドプロバイダーにデプロイされた Kubernetes クラスター
-
異なる Alibaba Cloud アカウントまたはリージョン間で ACK クラスターからコンテナログを収集する
ご利用のセルフマネージドクラスターが Kubernetes 1.6 以降を実行していることを確認してください。
操作手順
-
インストールパッケージのダウンロードと展開:kubectl がインストールされ設定されているマシンから、クラスターのリージョンに応じた適切なコマンドを実行して、LoongCollector とその依存関係をダウンロードします。
# 中国リージョン wget https://aliyun-observability-release-cn-shanghai.oss-cn-shanghai.aliyuncs.com/loongcollector/k8s-custom-pkg/3.2.6/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.2.6/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh -
設定ファイル
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。リージョン ID のリストについては、「リージョン」をご参照ください。
aliUid
String(必須)プロジェクトを所有する Alibaba Cloud アカウントの ID。
net
String(必須)ログデータ転送のためのネットワークタイプ。
-
Internet (デフォルト):パブリックネットワーク。
-
Intranet:内部ネットワーク。
accessKeyID
String(必須)プロジェクトへのアクセスに使用される AccessKey ID。RAM ユーザーの AccessKey ペアを使用することを推奨します。RAM ユーザーに AliyunLogFullAccess システム権限ポリシーを付与してください。RAM の詳細については、「概要」をご参照ください。
accessKeySecret
String(必須)AccessKey ID に対応する AccessKey Secret。
clusterID
String(必須)クラスターのカスタム ID。ID には、大文字、小文字、数字、ハイフン (-) のみを含む必要があります。
重要異なる Kubernetes クラスターに同じクラスター ID を割り当てないでください。
-
-
インストールスクリプトの実行:
loongcollector-custom-k8s-packageディレクトリで、次のコマンドを実行して LoongCollector とその依存関係をインストールします。bash k8s-custom-install.sh install -
インストールの確認:インストールが完了したら、次のコマンドを実行して Pod のステータスを確認します:
# Pod のステータスを確認 kubectl get po -n kube-system | grep loongcollector-ds出力例:
loongcollector-ds-gnmnh 1/1 Running 0 63sPod の起動に失敗した場合 (ステータスが Running でない場合):
-
設定の確認:
values.yaml内のパラメーターが正しいことを確認します。 -
イメージの確認:次のコマンドを実行し、出力の
Eventsセクションを確認して、コンテナイメージが正常にプルされたことを確認します。kubectl describe pod loongcollector-ds -n kube-system
-
-
LoongCollector がインストールされると、Simple Log Service は自動的に以下のリソースを作成します。これらは Simple Log Service コンソールで確認できます。
リソースタイプ
リソース名
説明
プロジェクト
values.yamlファイルで指定されたprojectNameの値。異なるサービスのログを隔離するリソース管理ユニット。
マシングループ
k8s-group-${cluster_id}ログを収集するすべてのノードを含むマシングループ。
k8s-group-${cluster_id}-clusterloongcollector-cluster のマシングループ。主にメトリック収集に使用されます。
k8s-group-${cluster_id}-singleton特定の収集設定のための単一インスタンスのマシングループ。
重要LoongCollector は config-operation-log という名前の Logstore を作成しません。この Logstore が既に存在する場合、LoongCollector はそこにログを書き込みません。
Sidecar モードでのインストール
Sidecar モードは、専用の LoongCollector (Logtail) コンテナをアプリケーション Pod に注入し、その Pod からのみログを収集することで機能します。このパターンは、詳細なログ管理、マルチテナントの分離、またはログ収集とアプリケーションライフサイクルの密接な連携が必要な場合に最適です。アプリケーションをデプロイしていない場合や、プロセスをテストしたい場合は、「付録:YAML の例」を使用してワークフローを迅速に確認できます。
1. Pod の YAML 設定の変更
-
共有ボリュームの定義
spec.template.spec.volumesで、containersと同じレベルに 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 # 必要に応じてタイムゾーンを変更 -
アプリケーションコンテナのマウント設定
アプリケーションコンテナ (例:
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 -
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: 初期化を開始します" # LoongCollector サービスを開始 /etc/init.d/loongcollectord start # 設定がダウンロードされ、サービスが準備完了になるまで待機 sleep 15 # サービスステータスを確認 if /etc/init.d/loongcollectord status; then echo "[$(date)] LoongCollector: サービスが正常に開始されました" touch /tasksite/cornerstone else echo "[$(date)] LoongCollector: サービスの開始に失敗しました" exit 1 fi # アプリケーションコンテナの完了を待機 (tombstone ファイルシグナル経由) echo "[$(date)] LoongCollector: アプリケーションコンテナの完了を待機しています" until [[ -f /tasksite/tombstone ]]; do sleep 2 done # 残りのログをアップロードする時間を確保 echo "[$(date)] LoongCollector: ビジネスが完了し、ログ転送を待機しています" sleep 30 # サービスを停止 echo "[$(date)] LoongCollector: サービスを停止しています" /etc/init.d/loongcollectord stop echo "[$(date)] LoongCollector: シャットダウンが完了しました" # ヘルスチェック 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)] Application: LoongCollector の準備が完了するのを待っています..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] Application: LoongCollector の準備が完了しました。アプリケーションロジックを開始します"
# 2. コアアプリケーションロジックを実行 (ログが共有ディレクトリに書き込まれることを確認)
echo "Hello, World!" >> /app/logs/business.log
# 3. 終了コードを保存
retcode=$?
echo "[$(date)] Application: タスクは終了コード $retcode で完了しました"
# 4. アプリケーションタスクが完了したことを LoongCollector に通知
touch /tasksite/tombstone
echo "[$(date)] Application: Tombstone を作成し、終了します"
exit $retcode
長期サービス (Deployment / StatefulSet)
# シグナルハンドラ関数を定義
_term_handler() {
echo "[$(date)] [nginx-demo] SIGTERM をキャッチしました。グレースフルシャットダウンを開始します..."
# グレースフルストップのために Nginx に QUIT シグナルを送信
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Nginx PID: $NGINX_PID に SIGQUIT を送信しました"
# Nginx がグレースフルに停止するのを待つ
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx は終了コード $EXIT_CODE で停止しました"
fi
# アプリケーションコンテナが停止したことを LoongCollector に通知
echo "[$(date)] [nginx-demo] Tombstone ファイルを書き込みます"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# シグナルハンドラを登録
trap _term_handler SIGTERM SIGINT SIGQUIT
# LoongCollector の準備が完了するのを待つ
echo "[$(date)] [nginx-demo]: LoongCollector の準備が完了するのを待っています..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector の準備が完了しました。アプリケーションロジックを開始します"
# Nginx を開始
echo "[$(date)] [nginx-demo] Nginx を開始します..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx は PID: $NGINX_PID で開始されました"
# Nginx プロセスを待つ
wait $NGINX_PID
EXIT_CODE=$?
# シグナルが原因でない終了の場合も LoongCollector に通知
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] 予期しない終了です。Tombstone を書き込みます"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
3. 終了猶予期間の設定
spec.template.spec で、LoongCollector が残りのすべてのログをアップロードするのに十分な長さの終了猶予期間を設定します。
spec:
# ... その他の既存の spec 設定 ...
template:
spec:
terminationGracePeriodSeconds: 600 # 10 分間のグレースフルストップ期間4. 変数
|
パラメーター |
説明 |
|
|
ご利用の Alibaba Cloud アカウントの ID。ユーザー識別子の設定。 |
|
|
マシングループを作成するために使用されるカスタム識別子。例: 重要
この識別子がプロジェクトのリージョン内で一意であることを確認してください。 |
|
|
SLS プロジェクトのリージョンとネットワークアクセスタイプに対応する設定。サービスリージョン。 例:プロジェクトが中国 (杭州) リージョンにある場合、Alibaba Cloud 内部ネットワークアクセスには |
|
|
共有ボリュームのカスタム名。 重要
|
|
|
テキストログが配置されている LoongCollector コンテナ内のマウントパス。 |
5. 設定の適用と確認
-
次のコマンドを実行して変更をデプロイします:
kubectl apply -f <YOUR-YAML> -
Pod のステータスを確認して、LoongCollector コンテナが正常に注入されたことを確認します:
kubectl describe pod <YOUR-POD-NAME>2 つのコンテナ (アプリケーションコンテナと
loongcollector) が表示され、それらのステータスが Running であれば、注入は成功です。
6. カスタム識別子ベースのマシングループの作成
-
Simple Log Service コンソールにログインし、対象のプロジェクトをクリックします。
-
左側のナビゲーションバーで、 を選択し、マシングループ の右側にある をクリックします。
-
マシングループの作成 ダイアログボックスで、次のパラメーターを設定し、OK をクリックします。
-
名前:マシングループの名前。作成後にこの名前は変更できません。名前は次の要件を満たす必要があります:
-
小文字、数字、ハイフン (-)、アンダースコア (_) のみを含むことができます。
-
小文字または数字で始まり、終わる必要があります。
-
長さは 2~128 文字である必要があります。
-
-
マシングループの識別子:ユーザー定義 ID を選択します。
-
ユーザー定義 ID:「1. サービス Pod の YAML 設定の変更」で LoongCollector コンテナに設定した
ALIYUN_LOGTAIL_USER_DEFINED_ID環境変数の値を入力します。これは完全に一致する必要があります。そうでなければ、関連付けは失敗します。
-
-
マシングループのハートビートを確認するには、新しく作成されたマシングループの名前をクリックし、マシングループのステータス領域を見つけます。
-
OK:LoongCollector が Simple Log Service に正常に接続し、マシングループが登録されたことを示します。
-
FAIL:
-
設定の変更が適用されるまで最大 2 分かかることがあります。ページを更新して再度確認してください。
-
2 分経ってもステータスが FAIL のままである場合は、「Logtail マシングループの問題のトラブルシューティング」をご参照ください。
-
-
各 Pod には専用の LoongCollector インスタンスがあります。詳細な管理のために、異なるアプリケーションや環境には異なるカスタム識別子を使用することを推奨します。
よくある質問
ACK マネージドクラスターの LoongCollector 設定を変更して、アカウントやリージョンをまたいでログを収集するにはどうすればよいですか?
ACK Edge、ACK One、ACS、ACK Serverless クラスターからコンテナログを収集するにはどうすればよいですか?
LoongCollector コンポーネントの projectName パラメーターを変更するにはどうすればよいですか?
次のステップ
LoongCollector をインストールした後、「Kubernetes クラスターからコンテナログを収集するためのガイドライン」を参照して、コンテナログ収集の核心的な原則、プロセス、ベストプラクティスを理解してください。その後、次のいずれかの方法で収集設定を作成します:
付録:YAML の例
この例は、アプリケーションコンテナ (Nginx) と LoongCollector サイドカーコンテナを含む完全な Kubernetes Deployment 設定を示しています。Sidecar モードでコンテナログを収集するために使用します。
設定を使用する前に、次の置き換えを行ってください:
-
${your_aliyun_user_id}をご利用の Alibaba Cloud アカウントの UID に置き換えます。 -
${your_machine_group_user_defined_id}を、ステップ 3 で作成したマシングループのカスタム ID に置き換えます。ID は完全に一致する必要があります。 -
${your_region_config}を、ご利用の Log Service (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: LoongCollector の準備が完了するのを待っています..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] Business: LoongCollector の準備が完了しました。ビジネスロジックを開始します"
# アプリケーションロジックを実行します。
echo "Hello, World!" >> /app/logs/business.log
# 終了コードを保存します。
retcode=$?
echo "[$(date)] Business: タスクは終了コード $retcode で完了しました"
# タスクが終了したことを LoongCollector に通知します。
touch /tasksite/tombstone
echo "[$(date)] Business: Tombstone を作成し、終了します"
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: 初期化を開始します"
# LoongCollector サービスを開始します。
/etc/init.d/loongcollectord start
# 設定がダウンロードされ、サービスが準備完了になるまで待ちます。
sleep 15
# サービスステータスを確認します。
if /etc/init.d/loongcollectord status; then
echo "[$(date)] LoongCollector: サービスが正常に開始されました"
touch /tasksite/cornerstone
else
echo "[$(date)] LoongCollector: サービスの開始に失敗しました"
exit 1
fi
# アプリケーションコンテナが終了するのを待ちます。
echo "[$(date)] LoongCollector: ビジネスコンテナの完了を待っています"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: ビジネスが完了し、ログ転送を待機しています"
# 残りのログを送信するのに十分な時間を確保します。
sleep 30
echo "[$(date)] LoongCollector: サービスを停止しています"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: シャットダウンが完了しました"
# ヘルスチェック
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] SIGTERM をキャッチしました。グレースフルシャットダウンを開始します..."
# グレースフルストップのために Nginx に QUIT シグナルを送信します。
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Nginx PID: $NGINX_PID に SIGQUIT を送信しました"
# Nginx がグレースフルに停止するのを待ちます。
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx は終了コード $EXIT_CODE で停止しました"
fi
# アプリケーションコンテナが停止したことを LoongCollector に通知します。
echo "[$(date)] [nginx-demo] Tombstone ファイルを書き込みます"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# シグナルハンドラを登録します。
trap _term_handler SIGTERM SIGINT SIGQUIT
# LoongCollector の準備が完了するのを待ちます。
echo "[$(date)] [nginx-demo]: LoongCollector の準備が完了するのを待っています..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector の準備が完了しました。ビジネスロジックを開始します"
# Nginx を開始します。
echo "[$(date)] [nginx-demo] Nginx を開始します..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx は PID: $NGINX_PID で開始されました"
# Nginx プロセスが終了するのを待ちます。
wait $NGINX_PID
EXIT_CODE=$?
# プロセスがシグナルなしで終了した場合、LoongCollector に通知します。
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] 予期しない終了です。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: 初期化を開始します"
# LoongCollector サービスを開始します。
/etc/init.d/loongcollectord start
# 設定がダウンロードされ、サービスが準備完了になるまで待ちます。
sleep 15
# サービスステータスを確認します。
if /etc/init.d/loongcollectord status; then
echo "[$(date)] LoongCollector: サービスが正常に開始されました"
touch /tasksite/cornerstone
else
echo "[$(date)] LoongCollector: サービスの開始に失敗しました"
exit 1
fi
# アプリケーションコンテナが終了するのを待ちます。
echo "[$(date)] LoongCollector: ビジネスコンテナの完了を待っています"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: ビジネスが完了し、ログ転送を待機しています"
# 残りのログを送信するのに十分な時間を確保します。
sleep 30
echo "[$(date)] LoongCollector: サービスを停止しています"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: シャットダウンが完了しました"
# ヘルスチェック
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
> マシングループの作成