LoongCollector adalah agen pengumpulan log generasi berikutnya untuk Alibaba Cloud Simple Log Service (SLS) yang meningkatkan Logtail dengan kemampuan lebih canggih. Anda dapat menginstalnya di kluster Kubernetes dalam mode DaemonSet atau Sidecar.
Prasyarat
Sebelum menginstal LoongCollector, verifikasi konektivitas jaringan antara node kluster dan titik akhir server Simple Log Service. Node harus dapat mencapai titik akhir tersebut agar pengumpulan log dapat melaporkan data.
-
Dapatkan titik akhir layanan:
-
Masuk ke Konsol Simple Log Service. Di daftar proyek, klik proyek target.
-
Klik ikon
di samping nama proyek untuk membuka halaman ikhtisar proyek. -
Di bagian Informasi Dasar, temukan titik akhir publik dan internal untuk wilayah proyek tersebut.
-
-
Jalankan uji konektivitas: Masuk ke node kluster tempat Anda akan menginstal LoongCollector dan jalankan perintah
curlberikut. Ganti${ProjectName}dan${SLS_ENDPOINT}dengan nilai aktualnya.curl https://${ProjectName}.${SLS_ENDPOINT} -
Periksa hasil pengujian:
-
Jika perintah mengembalikan
{"Error":{"Code":"OLSInvalidMethod",...}}, artinya node memiliki konektivitas jaringan ke Simple Log Service.CatatanPengujian ini hanya memverifikasi konektivitas lapisan jaringan. Respons error tersebut diharapkan karena permintaan tidak menyertakan parameter API yang diperlukan.
-
Jika perintah timeout atau mengembalikan error lapisan jaringan lain seperti
Connection refused, periksa konfigurasi jaringan node, aturan security group, atau resolusi DNS.
-
Metode instalasi
Pilih metode instalasi berdasarkan jenis kluster dan kebutuhan Anda.
|
Metode instalasi |
Kasus Penggunaan |
|
Kumpulkan log dari kluster ACK yang dikelola dan khusus dalam Akun Alibaba Cloud dan wilayah yang sama. |
|
|
|
|
Kumpulkan log dari aplikasi tertentu yang memerlukan:
|
Instal di kluster ACK (mode DaemonSet)
Anda dapat menginstal LoongCollector dengan satu klik di Konsol Container Service for Kubernetes (ACK). Secara default, LoongCollector mengumpulkan log kontainer dan mengirimkannya ke Proyek dalam Akun Alibaba Cloud dan wilayah yang sama. Untuk mengumpulkan log lintas akun atau wilayah, lihat Instal di kluster self-managed (mode DaemonSet).
Instal di kluster ACK yang dikelola yang sudah ada
-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Components and Add-ons .
-
Di tab Logs and Monitoring, temukan loongcollector dan klik Install.
-
Setelah instalasi, Simple Log Service (SLS) secara otomatis membuat resource berikut di wilayah kluster ACK. Anda dapat melihatnya di Konsol Simple Log Service (SLS).
Jenis resource
Nama resource
Tujuan
Project
k8s-log-${cluster_id}Mengisolasi log dari layanan yang berbeda.
Machine group
k8s-group-${cluster_id}Kelompok mesin untuk loongcollector-ds, digunakan untuk pengumpulan log.
k8s-group-${cluster_id}-clusterKelompok mesin untuk loongcollector-cluster, digunakan untuk pengumpulan metrik.
k8s-group-${cluster_id}-singletonKelompok mesin untuk konfigurasi pengumpulan instans tunggal tertentu.
PentingKomponen LoongCollector tidak membuat LogStore bernama
config-operation-log. Jika LogStore ini sudah ada, LoongCollector tidak akan menulis log ke dalamnya.
Instal saat membuat kluster ACK yang dikelola
-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Klik Create Cluster. Di halaman Component Configurations, pilih kotak centang Enable Log Service. Anda kemudian dapat memilih Create a new Project atau Use an existing Project.
Topik ini hanya menjelaskan pengaturan untuk Simple Log Service (SLS). Untuk informasi lebih lanjut tentang item konfigurasi lainnya, lihat Create an ACK managed cluster.
-
Saat Anda memilih Create Project, Simple Log Service (SLS) secara otomatis membuat resource berikut. Anda dapat melihatnya di Konsol Simple Log Service (SLS).
Jenis resource
Nama resource
Tujuan
Project
k8s-log-${cluster_id}Mengisolasi log dari layanan yang berbeda.
Machine group
k8s-group-${cluster_id}Kelompok mesin untuk loongcollector-ds, digunakan untuk pengumpulan log.
k8s-group-${cluster_id}-clusterKelompok mesin untuk loongcollector-cluster, digunakan untuk pengumpulan metrik.
k8s-group-${cluster_id}-singletonKelompok mesin untuk konfigurasi pengumpulan instans tunggal tertentu.
PentingKomponen LoongCollector tidak membuat LogStore bernama
config-operation-log. Jika LogStore ini sudah ada, LoongCollector tidak akan menulis log ke dalamnya.
Instal di kluster self-managed (mode DaemonSet)
Kasus penggunaan
-
Kluster Kubernetes di pusat data self-managed
-
Kluster Kubernetes yang dideploy di penyedia cloud lain
-
Kumpulkan log kontainer dari kluster ACK lintas berbagai Akun Alibaba Cloud atau wilayah
Pastikan kluster self-managed Anda menjalankan Kubernetes versi 1.6 atau lebih baru.
Prosedur
-
Unduh dan ekstrak paket instalasi: Dari mesin yang telah menginstal dan mengonfigurasi kubectl, jalankan perintah yang sesuai dengan wilayah kluster Anda untuk mengunduh LoongCollector beserta dependensinya.
# Wilayah Tiongkok 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 # Wilayah luar Tiongkok daratan 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 -
Ubah file konfigurasi
values.yaml: Buka direktoriloongcollector-custom-k8s-packagedan edit file konfigurasi./loongcollector/values.yaml.Parameter
values.yaml
# ===================== Parameter wajib ===================== # Nama proyek untuk pengumpulan log di kluster ini. Contoh: k8s-log-custom-sd89ehdq projectName: "" # Wilayah proyek. Contoh untuk Shanghai: cn-shanghai region: "" # ID Akun Alibaba Cloud yang memiliki proyek. Sertakan ID dalam tanda kutip. Contoh: "123456789" aliUid: "" # Jaringan yang digunakan. Opsi: Internet (jaringan publik) atau Intranet (jaringan internal). Default: Internet net: Internet # ID AccessKey dan Rahasia AccessKey dari Akun Alibaba Cloud atau Pengguna RAM. accessKeyID: "" accessKeySecret: "" # ID kluster kustom. ID dapat berisi huruf besar, huruf kecil, angka, dan tanda hubung (-). clusterID: "" # ... Parameter opsional dihilangkan ...projectName
String(Wajib)Nama proyek tempat LoongCollector mengunggah log. Nama harus memenuhi aturan berikut:
-
Hanya boleh berisi huruf kecil, angka, dan tanda hubung (-).
-
Harus dimulai dengan huruf kecil dan diakhiri dengan huruf kecil atau angka.
-
Panjangnya antara 3 hingga 63 karakter.
region
String(Wajib)ID wilayah proyek. Untuk daftar ID wilayah, lihat Wilayah.
aliUid
String(Wajib)ID Akun Alibaba Cloud yang memiliki proyek.
net
String(Wajib)Jenis jaringan untuk transmisi data log.
-
Internet (default): Jaringan publik.
-
Intranet: Jaringan internal.
accessKeyID
String(Wajib)ID AccessKey yang digunakan untuk mengakses proyek. Disarankan menggunakan Pasangan Kunci Akses Pengguna RAM. Berikan kebijakan sistem AliyunLogFullAccess kepada Pengguna RAM tersebut. Untuk informasi selengkapnya tentang RAM, lihat Ikhtisar.
accessKeySecret
String(Wajib)Rahasia AccessKey yang sesuai dengan ID AccessKey tersebut.
clusterID
String(Wajib)ID kustom untuk kluster. ID hanya boleh berisi huruf besar, huruf kecil, angka, dan tanda hubung (-).
PentingJangan gunakan ID kluster yang sama untuk kluster Kubernetes yang berbeda.
-
-
Jalankan skrip instalasi: Di direktori
loongcollector-custom-k8s-package, jalankan perintah berikut untuk menginstal LoongCollector beserta dependensinya.bash k8s-custom-install.sh install -
Verifikasi instalasi: Setelah instalasi selesai, jalankan perintah berikut untuk memeriksa status pod:
# Periksa status pod kubectl get po -n kube-system | grep loongcollector-dsContoh output:
loongcollector-ds-gnmnh 1/1 Running 0 63sJika pod gagal dimulai (status bukan Running):
-
Periksa konfigurasi: Pastikan parameter dalam file
values.yamlsudah benar. -
Periksa gambar: Jalankan perintah berikut dan tinjau bagian
Eventspada output untuk memverifikasi bahwa gambar kontainer berhasil ditarik.kubectl describe pod loongcollector-ds -n kube-system
-
-
Setelah LoongCollector diinstal, Simple Log Service secara otomatis membuat resource berikut. Anda dapat melihatnya di Konsol Simple Log Service.
Jenis resource
Nama resource
Deskripsi
Project
Nilai
projectNameyang ditentukan dalam filevalues.yaml.Unit manajemen resource yang mengisolasi log dari layanan yang berbeda.
Machine group
k8s-group-${cluster_id}Kelompok mesin yang berisi semua node yang mengumpulkan log.
k8s-group-${cluster_id}-clusterKelompok mesin untuk loongcollector-cluster. Terutama digunakan untuk pengumpulan metrik.
k8s-group-${cluster_id}-singletonKelompok mesin instans tunggal untuk konfigurasi pengumpulan tertentu.
PentingLoongCollector tidak membuat LogStore bernama config-operation-log. Jika LogStore ini sudah ada, LoongCollector tidak akan menulis log ke dalamnya.
Instal dalam mode Sidecar
Mode Sidecar bekerja dengan menyuntikkan kontainer LoongCollector (Logtail) khusus ke dalam Pod aplikasi Anda untuk mengumpulkan log secara eksklusif dari Pod tersebut. Pola ini ideal bila Anda memerlukan manajemen log detail halus, isolasi multi-tenant, atau pengikatan erat antara pengumpulan log dan siklus hidup aplikasi. Jika Anda belum mendeploy aplikasi atau ingin menguji prosesnya, Anda dapat menggunakan Lampiran: contoh YAML untuk memverifikasi alur kerja dengan cepat.
1. Ubah konfigurasi YAML pod
-
Definisikan volume bersama
Di
spec.template.spec.volumes, tambahkan tiga volume bersama pada level yang sama dengancontainers:volumes: # Direktori log bersama (ditulis oleh kontainer aplikasi, dibaca oleh sidecar) - name: ${shared_volume_name} # <-- Nama harus sesuai dengan nama di volumeMounts emptyDir: {} # Direktori sinyal untuk komunikasi antar-kontainer (untuk mulai mulus/berhenti mulus) - name: tasksite emptyDir: medium: Memory # Gunakan memori sebagai media untuk performa lebih baik sizeLimit: "50Mi" # Konfigurasi zona waktu host bersama: Menyinkronkan zona waktu untuk semua kontainer dalam pod - name: tz-config # <-- Nama harus sesuai dengan nama di volumeMounts hostPath: path: /usr/share/zoneinfo/Asia/Shanghai # Ubah zona waktu sesuai kebutuhan -
Konfigurasikan pemasangan kontainer aplikasi
Di bagian
volumeMountskontainer aplikasi Anda, sepertiyour-business-app-container, tambahkan pemasangan volume berikut:Pastikan kontainer aplikasi menulis log ke direktori
${shared_volume_path}agar LoongCollector dapat mengumpulkannya.volumeMounts: # Pasang volume log bersama ke direktori output log aplikasi - name: ${shared_volume_name} mountPath: ${shared_volume_path} # Contoh: /var/log/app # Pasang direktori komunikasi - name: tasksite mountPath: /tasksite # Direktori bersama untuk komunikasi dengan kontainer LoongCollector # Pasang file zona waktu - name: tz-config mountPath: /etc/localtime readOnly: true -
Suntikkan kontainer sidecar LoongCollector
Di array
spec.template.spec.containers, tambahkan definisi kontainer sidecar berikut:- 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" # Mulai layanan LoongCollector /etc/init.d/loongcollectord start # Tunggu konfigurasi diunduh dan layanan siap sleep 15 # Verifikasi status layanan 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 # Tunggu kontainer aplikasi selesai (melalui sinyal file tombstone) echo "[$(date)] LoongCollector: Waiting for application container to complete" until [[ -f /tasksite/tombstone ]]; do sleep 2 done # Beri waktu untuk mengunggah log yang tersisa echo "[$(date)] LoongCollector: Business completed, waiting for log transmission" sleep 30 # Hentikan layanan echo "[$(date)] LoongCollector: Stopping service" /etc/init.d/loongcollectord stop echo "[$(date)] LoongCollector: Shutdown complete" # Pemeriksaan kesehatan livenessProbe: exec: command: ["/etc/init.d/loongcollectord", "status"] initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 # Konfigurasi resource resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "2000m" memory: "2048Mi" # Konfigurasi variabel lingkungan 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" # Aktifkan mode full drain untuk memastikan semua log dikirim sebelum pod dihentikan - name: enable_full_drain_mode value: "true" # Tambahkan informasi lingkungan pod sebagai tag log - name: ALIYUN_LOG_ENV_TAGS value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_" # Secara otomatis menyuntikkan metadata pod dan node sebagai tag log - 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 # Pemasangan volume (dibagi dengan kontainer aplikasi) volumeMounts: # Pemasangan baca-saja untuk direktori log aplikasi - name: ${shared_volume_name} # <-- Nama direktori log bersama mountPath: ${dir_containing_your_files} # <-- Path ke direktori bersama di sidecar readOnly: true # Pasang direktori komunikasi - name: tasksite mountPath: /tasksite # Pasang zona waktu - name: tz-config mountPath: /etc/localtime readOnly: true
2. Sesuaikan logika siklus hidup kontainer aplikasi
Bergantung pada jenis beban kerja, modifikasi kontainer aplikasi untuk mendukung keluar yang terkoordinasi dengan sidecar:
Tugas berumur pendek (Job/CronJob)
# 1. Tunggu LoongCollector siap
echo "[$(date)] Application: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] Application: LoongCollector is ready, starting application logic"
# 2. Jalankan logika inti aplikasi (pastikan log ditulis ke direktori bersama)
echo "Hello, World!" >> /app/logs/business.log
# 3. Simpan kode keluar
retcode=$?
echo "[$(date)] Application: Task completed with exit code: $retcode"
# 4. Beri tahu LoongCollector bahwa tugas aplikasi selesai
touch /tasksite/tombstone
echo "[$(date)] Application: Tombstone created, exiting"
exit $retcode
Layanan berumur panjang (Deployment / StatefulSet)
# Definisikan fungsi penanganan sinyal
_term_handler() {
echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
# Kirim sinyal QUIT ke Nginx untuk penghentian mulus
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
# Tunggu Nginx berhenti secara mulus
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
fi
# Beri tahu LoongCollector bahwa kontainer aplikasi telah berhenti
echo "[$(date)] [nginx-demo] Writing tombstone file"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# Daftarkan penanganan sinyal
trap _term_handler SIGTERM SIGINT SIGQUIT
# Tunggu LoongCollector siap
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 application logic"
# Mulai Nginx
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# Tunggu proses Nginx
wait $NGINX_PID
EXIT_CODE=$?
# Juga beri tahu LoongCollector jika keluar tidak disebabkan oleh sinyal
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
3. Atur periode tenggang penghentian
Di spec.template.spec, atur periode tenggang penghentian yang cukup lama untuk memungkinkan LoongCollector mengunggah semua log yang tersisa.
spec:
# ... Konfigurasi spec lainnya ...
template:
spec:
terminationGracePeriodSeconds: 600 # Periode berhenti mulus 10 menit4. Variabel
|
Parameter |
Deskripsi |
|
|
ID Akun Alibaba Cloud Anda. Konfigurasikan pengenal pengguna. |
|
|
Pengenal kustom yang digunakan untuk membuat kelompok mesin. Contoh: Penting
Pastikan pengenal ini unik dalam wilayah Proyek tersebut. |
|
|
Konfigurasi yang sesuai dengan wilayah Proyek SLS Anda dan jenis akses jaringan. Wilayah layanan. Contoh: Jika Proyek Anda berada di wilayah Tiongkok (Hangzhou), gunakan |
|
|
Nama kustom untuk volume bersama. Penting
|
|
|
Path pemasangan di kontainer LoongCollector tempat log teks berada. |
5. Terapkan konfigurasi dan verifikasi
-
Jalankan perintah berikut untuk menerapkan perubahan:
kubectl apply -f <YOUR-YAML> -
Periksa status pod untuk memastikan kontainer LoongCollector berhasil disuntikkan:
kubectl describe pod <YOUR-POD-NAME>Jika Anda melihat dua kontainer (kontainer aplikasi dan
loongcollector) dan statusnya Running, penyuntikan berhasil.
6. Buat kelompok mesin berbasis pengenal kustom
-
Masuk ke Konsol Simple Log Service, lalu klik proyek target.
-
Di bilah navigasi kiri, pilih , dan klik di sebelah kanan Machine Groups.
-
Di kotak dialog Create Machine Group, konfigurasikan parameter berikut dan klik OK.
-
Name: Nama kelompok mesin. Anda tidak dapat mengubah nama ini setelah pembuatan. Nama harus memenuhi persyaratan berikut:
-
Hanya boleh berisi huruf kecil, angka, tanda hubung (-), dan garis bawah (_).
-
Harus dimulai dan diakhiri dengan huruf kecil atau angka.
-
Panjangnya harus antara 2 hingga 128 karakter.
-
-
Machine Group Identifier: Pilih Custom Identifier.
-
Custom Identifier: Masukkan nilai variabel lingkungan
ALIYUN_LOGTAIL_USER_DEFINED_IDyang Anda tetapkan untuk kontainer LoongCollector di file YAML pada 1. Ubah konfigurasi YAML Pod layanan. Ini harus persis sama. Jika tidak, asosiasi akan gagal.
-
-
Untuk memeriksa detak jantung kelompok mesin, klik nama kelompok mesin yang baru dibuat dan temukan area status kelompok mesin.
-
OK: Menunjukkan bahwa LoongCollector berhasil terhubung ke Simple Log Service dan kelompok mesin telah terdaftar.
-
FAIL:
-
Perubahan konfigurasi dapat memakan waktu hingga 2 menit untuk diterapkan. Muat ulang halaman untuk memeriksa lagi.
-
Jika status masih FAIL setelah 2 menit, lihat Pemecahan masalah kelompok mesin Logtail.
-
-
Setiap Pod memiliki instans LoongCollector khusus. Kami menyarankan Anda menggunakan pengenal kustom yang berbeda untuk aplikasi atau lingkungan yang berbeda guna manajemen detail halus.
FAQ
Bagaimana cara mengubah konfigurasi LoongCollector kluster ACK yang dikelola untuk mengumpulkan log lintas akun atau wilayah?
Bagaimana cara mengumpulkan log kontainer dari kluster ACK Edge, ACK One, ACS, dan ACK Serverless?
Bagaimana cara mengubah parameter projectName komponen LoongCollector?
Langkah selanjutnya
Setelah menginstal LoongCollector, baca Panduan Pengumpulan Log Kontainer dari Kluster Kubernetes untuk memahami prinsip inti, proses, dan praktik terbaik pengumpulan log kontainer. Selanjutnya, buat konfigurasi pengumpulan menggunakan salah satu metode berikut:
Lampiran: contoh YAML
Contoh berikut menunjukkan konfigurasi Deployment Kubernetes lengkap yang mencakup kontainer aplikasi (Nginx) dan kontainer sidecar LoongCollector, digunakan untuk mengumpulkan log kontainer dalam mode sidecar.
Sebelum menggunakan konfigurasi ini, lakukan penggantian berikut:
-
Ganti
${your_aliyun_user_id}dengan UID Akun Alibaba Cloud Anda. -
Ganti
${your_machine_group_user_defined_id}dengan ID kustom kelompok mesin yang Anda buat di Langkah 3. ID tersebut harus persis sama. -
Ganti
${your_region_config}dengan nama konfigurasi yang sesuai dengan wilayah dan jenis jaringan proyek Simple Log Service (SLS) Anda.Contoh: Jika proyek Anda berada di wilayah Tiongkok (Hangzhou), gunakan
cn-hangzhouuntuk akses jaringan internal ataucn-hangzhou-internetuntuk akses jaringan publik.
Tugas berumur pendek (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:
# Kontainer aplikasi
- name: demo-job
image: debian:bookworm-slim
command: ["/bin/bash", "-c"]
args:
- |
# Tunggu LoongCollector siap.
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"
# Jalankan logika aplikasi.
echo "Hello, World!" >> /app/logs/business.log
# Simpan kode keluar.
retcode=$?
echo "[$(date)] Business: Task completed with exit code: $retcode"
# Beri tahu LoongCollector bahwa tugas selesai.
touch /tasksite/tombstone
echo "[$(date)] Business: Tombstone created, exiting"
exit $retcode
# Permintaan dan batas resource
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500"
memory: "512Mi"
# pemasangan volume
volumeMounts:
- name: app-logs
mountPath: /app/logs
- name: tasksite
mountPath: /tasksite
# Kontainer sidecar 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"
# Mulai layanan LoongCollector.
/etc/init.d/loongcollectord start
# Tunggu konfigurasi diunduh dan layanan siap.
sleep 15
# Verifikasi status layanan.
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
# Tunggu kontainer aplikasi selesai.
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"
# Beri waktu cukup untuk mengirim log yang tersisa.
sleep 30
echo "[$(date)] LoongCollector: Stopping service"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown complete"
# pemeriksaan kesehatan
livenessProbe:
exec:
command: ["/etc/init.d/loongcollectord", "status"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# Permintaan dan batas resource
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
# variabel lingkungan
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_"
# Suntikkan metadata 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
# pemasangan volume
volumeMounts:
- name: app-logs
mountPath: /app/logs
readOnly: true
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# Definisi volume
volumes:
- name: app-logs
emptyDir: {}
- name: tasksite
emptyDir:
medium: Memory
sizeLimit: "10Mi"
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
Layanan berumur panjang (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 # Periode shutdown mulus 10 menit
containers:
# Kontainer aplikasi - Aplikasi web
- name: nginx-demo
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
# Perintah startup dan penanganan sinyal
command: ["/bin/sh", "-c"]
args:
- |
# Definisikan penanganan sinyal.
_term_handler() {
echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
# Kirim sinyal QUIT ke Nginx untuk penghentian mulus.
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
# Tunggu Nginx berhenti secara mulus.
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
fi
# Beri tahu LoongCollector bahwa kontainer aplikasi telah berhenti.
echo "[$(date)] [nginx-demo] Writing tombstone file"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# Daftarkan penanganan sinyal.
trap _term_handler SIGTERM SIGINT SIGQUIT
# Tunggu LoongCollector siap.
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"
# Mulai Nginx.
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# Tunggu proses Nginx keluar.
wait $NGINX_PID
EXIT_CODE=$?
# Jika proses keluar tanpa sinyal, beri tahu LoongCollector.
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
# Permintaan dan batas resource
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
# pemasangan volume
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# Kontainer sidecar 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"
# Mulai layanan LoongCollector.
/etc/init.d/loongcollectord start
# Tunggu konfigurasi diunduh dan layanan siap.
sleep 15
# Verifikasi status layanan.
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
# Tunggu kontainer aplikasi selesai.
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"
# Beri waktu cukup untuk mengirim log yang tersisa.
sleep 30
echo "[$(date)] LoongCollector: Stopping service"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown complete"
# pemeriksaan kesehatan
livenessProbe:
exec:
command: ["/etc/init.d/loongcollectord", "status"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# Permintaan dan batas resource
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "2000m"
memory: "2048Mi"
# variabel lingkungan
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"
# Aktifkan mode full drain untuk mengirim semua log saat pod berhenti.
- name: enable_full_drain_mode
value: "true"
# Tambahkan informasi lingkungan pod sebagai tag log.
- name: "ALIYUN_LOG_ENV_TAGS"
value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
# Dapatkan informasi pod dan 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
# pemasangan volume
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
readOnly: true
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# Definisi volume
volumes:
- name: nginx-logs
emptyDir: {}
- name: tasksite
emptyDir:
medium: Memory
sizeLimit: "50Mi"
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
> Create Machine Group