Simple Log Serviceに加えて、Container Compute Service (ACS) クラスタにデプロイされたアプリケーションのログを収集するために、独自のログ収集システム (ElasticSearch、FileBeat、Kibanaなど) を開発することもできます。ACSはDaemonSetコンポーネントをサポートしていません。そのため、ログ収集エージェントFileBeatは、ログを収集するためにサイドカーコンテナで実行する必要があります。このトピックでは、ACSクラスタにカスタムログ収集エージェントをデプロイする方法について説明します。
前提条件
ACSクラスタが作成されていること。詳細については、ACSクラスタの作成を参照してください。
背景情報
通常のログ収集ソリューションでは、ビジネスログを収集するためにエージェントがデプロイされます。これは、FileBeatなど、ビジネスポッド以外の各ポッドのサイドカーコンテナで実行されます。エージェントは、ビジネスコンテナによって生成されたログを収集します。
サイドカーモードでは、ログ収集エージェントはビジネスコンテナとログディレクトリを共有する必要があります。ビジネスコンテナは、共有ディレクトリにログを書き込みます。Logtailは、共有ディレクトリに保存されているログファイルの変更をリッスンし、新しいログを収集します。
次のタイプのログを収集できます。
stdoutログ
stdoutログは、MediumがStdoutのEmptyDirボリュームを使用して収集されます。ポッドを作成するときに、stdlogボリュームをサイドカーコンテナにマウントできます。サイドカーコンテナは、ACSの基本コンポーネントによってファイルとして収集された標準出力にアクセスできます。
説明各ポッドは、MediumがStdoutのEmptyDirボリュームを1つだけ持つことができます。ボリュームは、少なくとも1つのコンテナにマウントする必要があります。
stdoutログを収集すると、パフォーマンスのオーバーヘッドとストレージコストが増加します。
stdoutログには自動ローテーションが設定されています。詳細については、ログローテーションを参照してください。ログファイルのサイズが10 MiBに達すると、ログローテーションがトリガーされます。各コンテナは最大5つのログファイルを保存できます。
テキストログ
テキストログを収集するには、ポッドで共有ボリュームを使用する必要があります。ボリュームは、ポッド内の複数のコンテナにマウントできます。サイドカーコンテナは、ビジネスコンテナによって共有ボリュームに保存されたテキストログを収集できます。
ログ収集の概要
コンテナの起動と終了の順序、およびジョブによって作成されたポッド
サイドカーコンテナには、通常、次の要件があります。
サイドカーコンテナは、ビジネスコンテナよりも早く起動し、ビジネスコンテナよりも遅く終了する必要があります。
ジョブによって作成されたポッドの場合、サイドカーコンテナはビジネスコンテナの終了後に積極的に終了する必要があります。
ACSシナリオでこの目標を達成するために、サイドカーコンテナの構成で環境変数__IS_SIDECAR__="true"
を指定できます。
サイドカーモードでコンテナログファイルを収集する
サイドカーコンテナは、共有ボリュームを使用して、ビジネスコンテナによって生成されたログを収集できます。詳細については、サイドカーモードでビジネスコンテナのログを収集するを参照してください。
サイドカーモードでは、コンテナのstdoutログの収集はサポートされていません。
ACSシナリオでコンテナからstdoutログを収集するには、volumes.emptyDir.medium=Stdout
を指定します。詳細については、シナリオ1を参照してください。
シナリオ1:アプリケーションログとstdoutログを収集する
次の内容に基づいて、FileBeatサイドカーコンテナを使用してDeploymentを作成します。
StatefulSetも同じ方法で作成できます。
次のコマンドを実行して、ポッドに関する情報をクエリします。
kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE nginx-85776xxxxx-xxxxx 2/2 Running 0 13m
ログを表示します。
次のコマンドを実行して、FileBeatコンテナにログオンします。
kubectl exec -it deploy/nginx -c filebeat -- /bin/bash
FileBeatコンテナでアプリケーションログを表示します。
cat /var/log/error.log
期待される結果:
2024/10/30 10:38:28 [notice] 1#1: using the "epoll" event method 2024/10/30 10:38:28 [notice] 1#1: nginx/1.21.5 2024/10/30 10:38:28 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 2024/10/30 10:38:28 [notice] 1#1: OS: Linux 5.10.134-17.0.2.lifsea8.x86_64 2024/10/30 10:38:28 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2024/10/30 10:38:28 [notice] 1#1: start worker processes 2024/10/30 10:38:28 [notice] 1#1: start worker process 32
FileBeatコンテナでstdoutログを表示します。
cat /stdout/nginx/0.log
期待される結果:
2024-10-30T18:38:28.37305498+08:00 stdout F /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration 2024-10-30T18:38:28.373072927+08:00 stdout F /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ 2024-10-30T18:38:28.379999685+08:00 stdout F /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 2024-10-30T18:38:28.391562633+08:00 stdout F 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 2024-10-30T18:38:28.405538758+08:00 stdout F 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf 2024-10-30T18:38:28.405657957+08:00 stdout F /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh 2024-10-30T18:38:28.409014952+08:00 stdout F /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh 2024-10-30T18:38:28.410397615+08:00 stdout F /docker-entrypoint.sh: Configuration complete; ready for start up
シナリオ2:ジョブによって作成されたポッドからログを収集する
busyboxに基づいてstdoutログを出力するジョブを作成します。ジョブは、100秒間実行された後に自動的に終了します。
次のYAMLテンプレートは、2つの方法でサイドカーコンテナを設定する方法を示しています。ジョブは同じです。
Kubernetes 1.28以前
次の内容に基づいて、ジョブbusybox-stdoutをデプロイします。
FileBeatコンテナにログオンします。NGINXコンテナのテキストログとstdoutログを見つけることができます。
% kubectl exec -it busybox-stdout-4fwnx -c filebeat -- /bin/bash $ cat /stdout/busybox/0.log 2024-11-07T18:46:06.77002301+08:00 stdout F Log message 1 2024-11-07T18:46:07.77143368+08:00 stdout F Log message 2 2024-11-07T18:46:08.772840307+08:00 stdout F Log message 3 2024-11-07T18:46:09.774047629+08:00 stdout F Log message 4 2024-11-07T18:46:10.776122173+08:00 stdout F Log message 5 2024-11-07T18:46:11.778271688+08:00 stdout F Log message 6
Kubernetes 1.29以降
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
data:
filebeat.yml: |
# 以下のパスをFilebeatが監視するように設定します。
filebeat.inputs:
- type: log
paths:
- /stdout/*
# Elasticsearchの出力設定
output.elasticsearch:
host: '${NODE_NAME}'
hosts: '["https://${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}"]'
username: '${ELASTICSEARCH_USERNAME}'
password: '${ELASTICSEARCH_PASSWORD}'
protocol: https
ssl.certificate_authorities: [ "/usr/share/filebeat/certs/ca.crt" ]
---
apiVersion: batch/v1
kind: Job
metadata:
name: busybox-stdout
spec:
template:
spec:
initContainers:
# Filebeatサイドカーコンテナ
- args:
- -e
- -E
- http.enabled=true
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: ELASTICSEARCH_USERNAME
valueFrom:
secretKeyRef:
key: username
name: elasticsearch-master-credentials
- name: ELASTICSEARCH_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: elasticsearch-master-credentials
image: mirrors-ssl.aliyuncs.com/docker.elastic.co/beats/filebeat:8.5.1
imagePullPolicy: Always
# サイドカーコンテナを宣言します。
restartPolicy: Always
name: filebeat
resources:
limits:
cpu: 250m
ephemeral-storage: 30Gi
memory: 512Mi
requests:
cpu: 250m
ephemeral-storage: 30Gi
memory: 512Mi
volumeMounts:
- mountPath: /stdout
name: stdout-log
readOnly: true
- mountPath: /usr/share/filebeat/certs/
name: elasticsearch-master-certs
- mountPath: /usr/share/filebeat/filebeat.yml
name: filebeat-config
readOnly: true
subPath: filebeat.yml
containers:
# busyboxコンテナ
- name: busybox
image: mirrors-ssl.aliyuncs.com/busybox:latest
command: [ "sh", "-c" ]
args:
- |
for i in $(seq 1 100); do
echo "Log message $i"
sleep 1
done
volumes:
# stdoutログを収集します。
- emptyDir:
medium: Stdout
name: stdout-log
- name: elasticsearch-master-certs
secret:
secretName: elasticsearch-master-certs
- configMap:
name: filebeat-config
name: filebeat-config
restartPolicy: OnFailure
# 以下の設定は参考用です。
# EFKによって生成された設定に置き換えてください。
---
apiVersion: v1
data:
ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJakNDQWdxZ0F3SUJBZ0lSQUl0SDZxR2YzRG9VNFBuVWRJOUdITlV3RFFZSktvWklodmNOQVFFTEJRQXcKR3pFWk1CY0dBMVVFQXhNUVpXeGhjM1JwWTNObFlYSmphQzFqWVRBZUZ3MHlOREV3TWprd056RTNNamxhRncweQpOVEV3TWprd056RTNNamxhTUJzeEdUQVhCZ05WQkFNVEVHVnNZWE4wYVdOelpXRnlZMmd0WTJFd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFET1Zxc0svVXAvWTVNRVY5T3hzTUk2TTZMTFhYMGsKNFBGSjE0SklVNStUVnBRVVNhVmx3N0REeGtJaUQ3RDVHZ3I3Snh4WHV0cFNjVlo0QWN0UzNrNFJvV3lqdzg0cApoYW4wY3JZL2VaQmJlWjVFUUhCSXprU0ZhMWd4bkpUcVErSSsvR3lKSlNHNkQyR21UVHRqRXZ2R2pWL1loSDNHCk1DMnRadVNXN1hPYWZBKzFqWUNkVFpIZkNpeDdBZURVNU0zcVplNzR4MjhTeitDNkM4WUFCQ0ZSTnJsVGNFQW8KaGQ5WGNnellPUGdJY2VZSUJWb25DTDdzVWFPZGVKa1hrbmdBR2ZzWjB6RnJhMm1qZGZtcHVIaWZFM21LbUZ1agpydGhXVFZTdE9oZGtIUnZTck52NDZaSFdtYlErNXZCb1RiODllTFZuNTNwbzhmSkJIWWpHZ24zdEFnTUJBQUdqCllUQmZNQTRHQTFVZER3RUIvd1FFQXdJQ3BEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUgKQXdJd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTU2dmVtcDRMem9QdVJiOUY3bjlmcU9JNQp2blF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUs2alBULzc2RnV2K0RLSmsxNG15b0ZzNThnRjRqbjlLWEUwCmFqOEMrZ1BUd2o2dUpUTjRLcWFmcnV0VGxlZWM5cXhabVZjQTgzanJhTEkySzlNN2ZyVE9pVE1vSnhmNnFrU1AKZ1ozazF2OG40Z0JGbzhsczZpc2YrankvL1dpMiswUVdWOElIU1lRbDlucklCT0lpb25rS1ljbDVQY2tKWVo4RQpkYVJUYW1xbi8zRTFGODFGaXFDT3dPc0NGRk5IRHhPRDRRb25NbU5ReFFvb1I3Mks1V2R6TmQrTG5BbjE4eHZlCjE2b3gybzZNQ3hjQS9RWDE0d3dDVi9lb1Y4KzIwWlJRY01LT1U5Y0djSjZNYm9TSW1odzJzS0NpNkpYcUQwQWMKSFZscWFzTGh4cHZBc3lJdXY3TjB5VnVhVVdZVDVMV1oyOFBGUVozcmwvYTIvNHZHNStJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURpRENDQW5DZ0F3SUJBZ0lSQUp3R2cyNVR5YUNEVmlxNWJEbDliREF3RFFZSktvWklodmNOQVFFTEJRQXcKR3pFWk1CY0dBMVVFQXhNUVpXeGhjM1JwWTNObFlYSmphQzFqWVRBZUZ3MHlOREV3TWprd056RTNNamxhRncweQpOVEV3TWprd056RTNNamxhTUI4eEhUQWJCZ05WQkFNVEZHVnNZWE4wYVdOelpXRnlZMmd0YldGemRHVnlNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0L1QzMUp5VzJTSCtHZjhVTHJXVmhYZmwKdHhJRytMcGFGK0l6Q2lnSGh6QW5ZZnoyM0luQTZLOG9WWWtsejZLZzRzbEZjeXRHbStxd01ta3c3QzZXeHRVRwpSWlZiUXloZDZ6L1laRGhGUVpCQXZMWDVRVnIwWmIyRlN0NjdQM3dNa3Z1RE16TVZnRXoxZ2x0TmRyOVZiOXQyCjRUTXBka09GeFpPV24rZ0IyM0l3YnlNb0ZIMVNDZ1ZtcC9EQTNHZU1ENGErWURUcGowd1dSUFRRemdNcXh4YkUKd3FFdGN5R01yLzF6Sm4ycDZ6SWdmV3E0K1pwM2lRU2VOdjFUWWpHVm5xYzdWWUhDd29nb3pSRDI5TldTbC9BMApVSTVsbld3SDI3aU51QU1pVWFQRmx4eWtNbTlFbSs4SUcrT2VsRks4aDlBSEl2TDVYSFJjT3VOQzk2SjU1d0lECkFRQUJvNEhDTUlHL01BNEdBMVVkRHdFQi93UUVBd0lGb0RBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkKS3dZQkJRVUhBd0l3REFZRFZSMFRBUUgvQkFJd0FEQWZCZ05WSFNNRUdEQVdnQlRucTk2YW5ndk9nKzVGdjBYdQpmMStvNGptK2REQmZCZ05WSFJFRVdEQldnaFJsYkdGemRHbGpjMlZoY21Ob0xXMWhjM1JsY29JY1pXeGhjM1JwClkzTmxZWEpqYUMxdFlYTjBaWEl1WkdWbVlYVnNkSUlnWld4aGMzUnBZM05sWVhKamFDMXRZWE4wWlhJdVpHVm0KWVhWc2RDNXpkbU13RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURwMVlXOFBmMm5YMldqeU5YZlVTSVJiamN0YQo2RTVpQzEwdENlbUxFZVpPZlpSRGtKOUVSaUNFQ2tUVUNCNy9QemFrTlE1UGNYQzVmcmYyWCtucGZ3RFFyREN4ClM0WkpEMWZFeHN0Yis3L29yQmgrWXNYcHJiUUJMbDJ6M0w0dm5tZ1kyb3V5bjdyT2NOdWQveENvWUdBVUd4a0YKdmVvUDNld0NUVzlaUVhGVWF0WUUzMno1bHRXTlRTOE5RU1hQRUtoSUlqYWNOL29SQ2ZhY1pRaTFoOUhTczdzQQpOcmludkRCTnE4bDl0b3g5NFZadCtXN3NmUXZvVU5hTTV1OXk0UU5Ib25rdUZ2enZMdkpGeEtvbWE0RmtFOHl5CmphR2RpUXh2NVFXdW1sTlBzZ3VOUUpSMnp3QzJEUkVVZUR1WC96Zk9xdDBucDFOZWpoWU11VTIyVk5zPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBNC9UMzFKeVcyU0grR2Y4VUxyV1ZoWGZsdHhJRytMcGFGK0l6Q2lnSGh6QW5ZZnoyCjNJbkE2SzhvVllrbHo2S2c0c2xGY3l0R20rcXdNbWt3N0M2V3h0VUdSWlZiUXloZDZ6L1laRGhGUVpCQXZMWDUKUVZyMFpiMkZTdDY3UDN3TWt2dURNek1WZ0V6MWdsdE5kcjlWYjl0MjRUTXBka09GeFpPV24rZ0IyM0l3YnlNbwpGSDFTQ2dWbXAvREEzR2VNRDRhK1lEVHBqMHdXUlBUUXpnTXF4eGJFd3FFdGN5R01yLzF6Sm4ycDZ6SWdmV3E0CitacDNpUVNlTnYxVFlqR1ZucWM3VllIQ3dvZ296UkQyOU5XU2wvQTBVSTVsbld3SDI3aU51QU1pVWFQRmx4eWsKTW05RW0rOElHK09lbEZLOGg5QUhJdkw1WEhSY091TkM5Nko1NXdJREFRQUJBb0lCQUhSK3VEaDdYY3ZSUjE1WgpzU0s5d1kvWDJobFlxUjlyZktjLy9mMXV2NG9pM2IyQjNWYVBQM3FxS042dG5Ca2tienYyeC9zM1hucEgwWXV4Cm5rTFUvRkRZaE1BQ3VBVDJHQ2tsRTUwRDlNQ3d5NlNsQ3FDUHJ0NWZvRUxHMk1KMHpxZyt5S25kclZ0SCtSK0oKTVdsQ0ZwTjNnS1ZOMUI2UUcwa0JSN1NvaUdwd1ZhSEFOMEc2Q0NKTnR0eDByZHo5UVRpU3BCMmlzYmhaSVpRVgp2U1NwemY3R2ZzaU5pN1VaOTN0WkZ5S21PRE1CUW5yZm5xWkphVXdVeWhHYk02Y2h4YWpmY0dka1dadWJ6azZJCnUrTWFDcE5VOWsvSXpDUkhnNjVyZGhITlozeVdDYzh6UXRDdFNkaWFPRmFwclZ4aHhSeFU5WW9FT2hsaVlVS0wKNGhIN1VPRUNnWUVBNkkrL3MyMDN5WGx1R0tqb3VIRXc5Z29aNU9YNHk3WWFGb2dzTm9jMTBZdUxRSURjTEozTQpLWjc4aTZ1dlV3d2lVMVpKTmRYbHFhcFFDNFRBN2N0bktnTVpNRnhzYzFPQzZsTnJ6b3FXM3FST0NDNW9DRUJOCmVSQlR2V1FjOVhXUUxrK2wwcHBEZ3BaVFVjc0tYS2NJSldlakhVb0xuajMrcmo2ZjFsOHlhU01DZ1lFQSt1NXEKd1ZtU2NkQ1pqdXQzbktsZ3V6ZGlpbWpvZ0Jkc1VnRUg4WXhkK2QzTXgveVR0eGthdGNwMnYvTHNPQ3BMV1YzSQpNVTdCTUtVR3BpZGpOMzdYQ3FMREZHM3UzdHZhMHBjditsOENaYk45NWdVN3RNeHB2WjZyZjRwVFlKdG1Ya2RsCkVmUkNxMkhocU11UEpSUlhjMllOaDU2TjNSUW5CWnJRVmxLdjBtMENnWUVBb0Fvc2RpRjIvcU1kN01Kd1JGMUEKd0ZCN09WWTVQSmI0cFFEWXpEMkgvOGZ6OEZPOU1NYjJ0TDNBTmEzVVhXWkFTUEZjT0R3V2JBZlVSZGo1bTZzYQpONE1pVm5HRUFHazc4bDJ1RnRpd3NrNkhsSUc2L2RLaWZlbUtkdzdxRHREMGc2bzBCeFk1MXlmejlwbXZhOHRXCmc4Y3FMUUhEdFFZY3VYUkhNcE1ZY2RrQ2dZRUFrZHdxbys5OEo3cDR1Rkg1T2xCZWtSVFZxOXpsWVNlOGFFSi8KS3BKTVFpVUNsekVqY0NnZ2xaRjF5NGZhZFo5b0l5OVhZZ29FVkZGbzl3WW9MeWNFdXdMM1lKV3laMHJtL01pegpNOWNzWG8raVhDV29taVRFUmx2SUZxQUNiVUtIazcvdWFTeFI0S3RKNzhNN2x2TW5Ea1pCRVJkQ0lVTklsNEp4CkhleDhsVlVDZ1lCdlVMQUU3WkMyTkFnZUpYUmpRalFRd2laNU1jS09rTTBvVjlsYUlaR0xZUUVTOHVtYXA0THYKMVc5clN4UElxMTg3Q1haejBuOTdPN210aUpwYXhERDg1QVdZMEg5MGhFNitvZUltWmlPN3ZYbW5RTVRNZjNtWgp6dUcvNk84ckpsNWcyNnY4NTVBYjVUbC9ZQTNRcW1tOVdKdUt5eGw1bWxvMGkxNU14cWNia1E9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
kind: Secret
metadata:
name: elasticsearch-master-certs
type: kubernetes.io/tls
---
apiVersion: v1
data:
password: Z3BVMTFFZXZNWWFmMkVCUw==
username: ZWxhc3RpYw==
kind: Secret
metadata:
name: elasticsearch-master-credentials
type: Opaque
シナリオ3:OpenKruise SidecarSetに基づいてサイドカーコンテナを自動的に挿入する
前述の方法では、サイドカーコンテナ構成を各ワークロードに追加する必要があります。これは、ワークロードの数が多い場合に複雑になります。OpenKruise SidecarSet を使用して、サイドカーコンテナを管理できます。これにより、サイドカーコンテナを自動的に挿入し、個別にアップグレードできます。