LoongCollector は、Alibaba Cloud Simple Log Service (SLS) の次世代ログ収集エージェントであり、Logtail のアップグレード版です。このトピックでは、Kubernetes クラスターに LoongCollector をインストールする方法について説明します。DaemonSet モードまたは Sidecar モードのいずれかでインストールできます。
事前準備
LoongCollector をインストールする前に、クラスターノードと SLS エンドポイント間のネットワーク接続を確認してください。これにより、LoongCollector がデータを正しくレポートできるようになります。
サービスエンドポイントの取得:
Simple Log Service コンソールにログインします。プロジェクトリストで、対象のプロジェクトをクリックします。
プロジェクト名の横にある
アイコンをクリックして、プロジェクトの概要ページに移動します。[エンドポイント] セクションで、プロジェクトのリージョンのパブリックエンドポイントとプライベートエンドポイントを確認します。
接続のテスト: LoongCollector コンポーネントをインストールする予定のクラスターノードにログインし、次の
curlコマンドを実行します。${ProjectName}と${SLS_ENDPOINT}を実際の情報に置き換えてください。curl https://${Project_Name}.${SLS_ENDPOINT}結果の確認:
コマンドが
{"Error":{"Code":"OLSInvalidMethod",...}}を返した場合、ノードと SLS 間のネットワーク接続は正常です。説明このテストはネットワークレイヤーの接続性のみを検証します。リクエストに必要な API パラメーターが欠落しているため、SLS はエラーを返します。この動作は想定内です。
コマンドがタイムアウトするか、
Connection refusedなどの他のネットワークレイヤーエラーを返す場合、ネットワーク接続の失敗を示します。ノードのネットワーク設定、セキュリティグループルール、または DNS 解決を確認してください。
インストール方法の選択
クラスターのタイプと要件に基づいて、次の表からインストール方法を選択してください。
インストール方法 | 利用シーン |
同一の Alibaba Cloud アカウントおよびリージョン内の ACK マネージドクラスターおよび専用クラスターからログを収集します。 | |
| |
次の要件を持つ特定のアプリケーションからログを収集します:
|
ACK クラスターへのインストール (DaemonSet モード)
logtail-ds を使用していて LoongCollector にアップグレードしたい場合は、LoongCollector をインストールする前に logtail-ds をアンインストールする必要があります。
Alibaba Cloud Container Service for Kubernetes (ACK) コンソールでワンクリックで LoongCollector をインストールします。デフォルトでは、クラスターからのコンテナログは、同じアカウントとリージョンにある SLS プロジェクトに収集されます。アカウントやリージョンをまたいでログを収集するには、「セルフマネージドクラスターへのインストール (DaemonSet モード)」をご参照ください。
既存の ACK マネージドクラスターへのインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、管理するクラスターを見つけ、その名前をクリックします。 左側のナビゲーションウィンドウで、アドオン管理 をクリックします。
[ログとモニタリング] タブで、loongcollector を見つけ、[インストール] をクリックします。
インストールが完了すると、SLS は ACK クラスターが配置されているリージョンに次のリソースを自動的に作成します。Simple Log Service コンソールにログインして表示します。
リソースタイプ
リソース名
目的
プロジェクト
k8s-log-${cluster_id}異なるサービスのログを分離するためのリソース管理ユニット。
マシングループ
k8s-group-${cluster_id}loongcollector-ds のマシングループ。主にログ収集に使用されます。
k8s-group-${cluster_id}-clusterloongcollector-cluster のマシングループ。主にメトリック収集に使用されます。
k8s-group-${cluster_id}-singleton単一インスタンスのマシングループ。主に一部の単一インスタンス収集設定に使用されます。
Logstore
config-operation-log重要この Logstore は削除しないでください。
LoongCollector コンポーネント内の alibaba-log-controller からのログを保存します。標準の Logstore と同じ方法で課金されます。詳細については、「データ書き込み量に応じた課金項目の詳細」をご参照ください。この Logstore に収集設定を作成しないでください。
新しい ACK マネージドクラスター作成時のインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[Kubernetes クラスターの作成] をクリックします。[詳細設定] セクションでは、SLS がデフォルトで有効になっています。[デフォルト設定の変更] をクリックして、プロジェクトを作成するか、既存のプロジェクトを使用します。
このトピックでは、SLS に関連する設定のみを説明します。その他の設定項目については、「ACK マネージドクラスターの作成」をご参照ください。
[プロジェクトの作成] を選択すると、SLS はデフォルトで以下のリソースを作成します。これらを表示するには、Simple Log Service コンソールにログインしてください。
リソースタイプ
リソース名
目的
プロジェクト
k8s-log-${cluster_id}異なるサービスのログを分離するためのリソース管理ユニット。
マシングループ
k8s-group-${cluster_id}loongcollector-ds のマシングループ。主にログ収集に使用されます。
k8s-group-${cluster_id}-clusterloongcollector-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 以降が実行されていることを確認してください。
操作手順
インストールパッケージのダウンロードと解凍: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.shvalues.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 を使用しないでください。
インストールスクリプトの実行:
loongcollector-custom-k8s-packageフォルダで、次のコマンドを実行して LoongCollector とその依存コンポーネントをインストールします。bash k8s-custom-install.sh installインストールの確認:インストールが完了したら、次のコマンドを実行してコンポーネントのステータスを確認します:
# Pod のステータスを確認 kubectl get po -n kube-system | grep loongcollector-ds実行結果の例:
loongcollector-ds-gnmnh 1/1 Running 0 63sコンポーネントの起動に失敗した場合 (ステータスが Running ではない場合):
設定の確認:
values.yaml内の設定項目が正しいことを確認します。イメージの確認:次のコマンドを実行し、出力の
Eventsセクションを確認して、コンテナイメージが正常にプルされたことを確認します。kubectl describe pod loongcollector-ds -n kube-system
コンポーネントがインストールされると、Simple Log Service (SLS) は自動的に次のリソースを作成します。Simple Log Service コンソールにログインして確認します。
リソースタイプ
リソース名
目的
プロジェクト
values.yamlファイルで指定したprojectNameの値異なるサービスのログを分離するためのリソース管理ユニット。
マシングループ
k8s-group-${cluster_id}ログ収集ノードのコレクション。
k8s-group-${cluster_id}-clusterloongcollector-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 構成の変更
共有ボリュームの定義
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: trueLoongCollector サイドカーコンテナーのインジェクト
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_CODE3. グレースフル終了期間の設定
spec.template.spec で、LoongCollector が残りのログをアップロードするのに十分な時間を確保するために、十分な終了猶予期間を設定します。
spec:
# ... その他の既存の spec 構成 ...
template:
spec:
terminationGracePeriodSeconds: 600 # 10分間のグレースフル停止期間
4. パラメーターの説明
変数 | 説明 |
| ご利用の Alibaba Cloud アカウントの ID に設定します。詳細については、「ユーザー識別子の設定」をご参照ください。 |
| マシングループのカスタム識別子を設定して、カスタムマシングループを作成します。例: 重要 この識別子がプロジェクトのリージョン内で一意であることを確認してください。 |
| Simple Log Service プロジェクトのリージョンとアクセス用のネットワークタイプに基づいて指定します。リージョンに関する情報については、「サービスリージョン」をご参照ください。 例:プロジェクトが中国 (杭州) リージョンにある場合、Alibaba Cloud 内部ネットワーク経由でのアクセスには |
| ボリュームのカスタム名を設定します。 重要
|
| マウントパスを設定します。これは、収集対象のテキストログが格納されているコンテナー内のディレクトリです。 |
5. 構成の適用と結果の確認
次のコマンドを実行して変更をデプロイします:
kubectl apply -f <YOUR-YAML>Pod のステータスを表示して、LoongCollector コンテナーが正常にインジェクトされたことを確認します:
kubectl describe pod <YOUR-POD-NAME>2つのコンテナー (アプリケーションコンテナーと
loongcollectorコンテナー) が表示され、それらのステータスが正常であれば、インジェクトは成功です。
6. カスタム識別子を使用したマシングループの作成
Simple Log Service (SLS) コンソールにログインし、対象のプロジェクトをクリックします。
左側のナビゲーションウィンドウで、 を選択します。[マシングループ] の横にある をクリックします。
[マシングループの作成] ダイアログボックスで、次のパラメーターを設定し、[OK] をクリックします。
[名前]:マシングループの名前です。作成後に変更することはできません。命名規則は次のとおりです:
小文字、数字、ハイフン (-)、アンダースコア (_) のみ使用できます。
先頭と末尾は小文字または数字である必要があります。
長さは 2~128 文字である必要があります。
マシン グループ識別子: [カスタム識別子] を選択します。
カスタム ID: 1. アプリケーション Pod の YAML 構成を変更するで LoongCollector コンテナーの YAML ファイルに設定した
ALIYUN_LOGTAIL_USER_DEFINED_ID環境変数の値を入力します。値は完全に一致する必要があります。一致しない場合、関連付けは失敗します。
マシングループのハートビートステータスを確認します:マシングループが作成された後、その名前をクリックし、ステータス領域でハートビートステータスを表示します。
OK:LoongCollector が SLS に正常に接続し、マシングループが登録されたことを示します。
FAIL:
構成がまだ有効になっていない可能性があります。構成が有効になるまで約 2 分かかります。ページを更新して、後でもう一度お試しください。
2 分経ってもステータスが [FAIL] のままである場合は、「Logtail マシングループの問題のトラブルシューティング」をご参照のうえ、問題を診断してください。
各 Pod は個別の LoongCollector インスタンスに対応します。アプリケーションや環境ごとに異なるカスタム識別子を使用することで、詳細な管理が容易になります。
よくある質問
ACK マネージドクラスターの LoongCollector 設定を変更して、アカウント間またはリージョン間でログを収集するにはどうすればよいですか?
Alibaba Cloud ACK Edge、ACK One、ACS、および ACK Serverless クラスターからコンテナログを収集するにはどうすればよいですか?
次のステップ
LoongCollector をインストールした後、「Kubernetes クラスターからコンテナーログを収集する」をご参照ください。このトピックでは、基本原則、主要なプロセス、選択に関する推奨事項、ベストプラクティスについて説明します。次に、以下のいずれかの方法を使用してコレクション構成を作成してください。
付録:YAML の例
この例では、NGINX アプリケーションコンテナーと LoongCollector サイドカーコンテナーを含む、完全な Kubernetes デプロイメント構成を提供します。この構成は、サイドカーパターンを使用してコンテナーログを収集するのに適しています。
開始する前に、次の 3 つの項目を置き換えてください:
${your_aliyun_user_id}をご自身の Alibaba Cloud アカウントの UID に置き換えます。${your_machine_group_user_defined_id}を ステップ 3 で作成したマシングループのカスタム ID に置き換えます。 ID は完全に一致している必要があります。${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
[+] > [マシングループの作成]