LoongCollector は、Alibaba Cloud の Simple Log Service (SLS) 向けの次世代ログ収集エージェントであり、Logtail のアップグレード版です。このトピックでは、Kubernetes クラスターに LoongCollector をインストールする方法について説明します。DaemonSet モードまたはサイドカーモードのいずれかでインストールできます。
事前準備
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単一インスタンスのマシングループ。主に一部の単一インスタンス収集設定に使用されます。
重要LoongCollector は config-operation-log という名前の Logstore を作成しません。この Logstore が既に存在する場合、LoongCollector はそこへのログ書き込みを停止します。
新しい 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単一インスタンスのマシングループ。主に一部の単一インスタンス収集設定に使用されます。
重要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.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 の詳細については、「概要」をご参照ください。
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単一インスタンスのマシングループで、主に単一インスタンスの収集設定に使用されます。
重要LoongCollector は config-operation-log という名前の Logstore を作成しません。この Logstore がすでに存在する場合、LoongCollector はそこへのログ書き込みを停止します。
サイドカーパターンによるインストール
細かい粒度でのログ管理、マルチテナントデータ分離、またはログ収集をアプリケーションライフサイクルに紐付ける場合に、サイドカーパターンを使用します。このパターンでは、アプリケーションポッドに LoongCollector(Logtail)の別コンテナを挿入し、そのポッド内での専用ログ収集を可能にします。アプリケーションをまだデプロイしていない場合、または手順の検証を行いたい場合は、付録: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: 初期化を開始しています" # 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 および Node のメタデータを自動的にログタグとして挿入します。 - 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)] ビジネス: LoongCollector の準備完了を待機しています..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] ビジネス: LoongCollector が準備完了しました。ビジネスロジックを開始します"
# 2. コアビジネスロジックを実行します(ログが共有ディレクトリに出力されるよう確認してください)。
echo "Hello, World!" >> /app/logs/business.log
# 3. 終了コードを保存します。
retcode=$?
echo "[$(date)] ビジネス: タスクが終了コード $retcode で完了しました"
# 4. ビジネスタスクの完了を LoongCollector に通知します。
touch /tasksite/tombstone
echo "[$(date)] ビジネス: トゥームストーンファイルを作成しました。終了します"
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] トゥームストーンファイルを書き込みます"
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] 予期せぬ終了です。トゥームストーンファイルを書き込みます"
touch /tasksite/tombstone
fi
exit $EXIT_CODE3. グレースフル終了期間を設定する
spec.template.spec 内で、LoongCollector が残りのログを確実に送信できる十分な猶予期間(グレースフル終了期間)を設定します。
spec:
# ... その他の既存の spec 構成 ...
template:
spec:
terminationGracePeriodSeconds: 600 # 10 分間のグレースフルシャットダウン期間。4. 変数
パラメーター | 説明 |
| メインアカウント ID を設定します。詳細については、「ユーザー識別子の構成」をご参照ください。 |
| マシングループを作成するために使用するカスタム識別子を設定します。例: 重要 この識別子は、プロジェクトのリージョン内で一意である必要があります。 |
| Log Service プロジェクトのリージョンおよびネットワークアクセス方式に基づいて値を設定します。リージョンに関する情報については、「サービスリージョン」をご参照ください。 例:プロジェクトが中国 (杭州) リージョンにある場合、内部ネットワークアクセスには |
| ボリュームのカスタム名を設定します。 重要
|
| マウントパスを設定します。これは、テキストログを含むコンテナ内のディレクトリです。 |
5. 構成を適用して検証する
以下のコマンドを実行して変更をデプロイします:
kubectl apply -f <YOUR-YAML>Pod のステータスを確認し、LoongCollector コンテナが正常に挿入されたことを確認します:
kubectl describe pod <YOUR-POD-NAME>2 つのコンテナ(アプリケーションコンテナおよび
loongcollector)が表示され、それぞれのステータスが Running である場合、挿入は成功しています。
6. カスタム識別子を持つマシングループを作成する
Simple Log Service コンソール にログインし、対象のプロジェクトをクリックします。
左側のナビゲーションウィンドウで、 を選択します。次に、マシングループ の横にある をクリックします。
マシングループの作成 ダイアログボックスで、以下のパラメーターを設定し、OK をクリックします。
名前:マシングループの名前です。作成後は変更できません。命名規則は以下のとおりです。
小文字、数字、ハイフン(-)、アンダースコア(_)のみ使用可能です。
先頭および末尾は小文字または数字で始まり・終わる必要があります。
長さは 2~128 文字である必要があります。
マシングループ識別子: カスタム識別子 を選択します。
カスタム識別子:「1. アプリケーションポッドの YAML 構成を変更する」で YAML ファイルに設定した LoongCollector コンテナの環境変数
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 application container to complete"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: Application task 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_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"
- 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 application container to complete"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: Application task 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
> マシングループの作成