LoongCollector adalah agen pengumpulan log generasi berikutnya untuk Simple Log Service (SLS) dan penerus Logtail. Instalasikan di kluster Kubernetes menggunakan mode DaemonSet atau sidecar.
Prasyarat
Sebelum menginstal LoongCollector, verifikasi konektivitas jaringan antara node kluster Anda dan titik akhir SLS.
-
Dapatkan titik akhir:
-
Masuk ke Konsol Simple Log Service. Di daftar proyek, klik proyek tujuan.
-
Klik ikon
di samping nama proyek untuk membuka halaman ikhtisar proyek. -
Di bagian titik akhir, temukan titik akhir publik dan pribadi untuk wilayah proyek tersebut.
-
-
Jalankan uji konektivitas: Masuk ke node kluster dan jalankan perintah
curlberikut. Ganti${PROJECT_NAME}dan${SLS_ENDPOINT}dengan nilai aktual Anda.curl https://${PROJECT_NAME}.${SLS_ENDPOINT} -
Periksa hasilnya:
-
Jika perintah mengembalikan
{"Error":{"Code":"OLSInvalidMethod",...}}, koneksi jaringan antara node Anda dan Simple Log Service telah terbentuk.CatatanError ini diharapkan — pengujian hanya memverifikasi konektivitas jaringan. SLS mengembalikan error karena permintaan tidak memiliki parameter API yang diperlukan.
-
Jika perintah timeout atau mengembalikan error seperti
Connection refused, periksa konfigurasi jaringan node, aturan security group, dan resolusi DNS.
-
Pilih metode instalasi
Pilih metode berdasarkan jenis kluster Anda.
|
Metode instalasi |
Kasus penggunaan |
|
Kumpulkan log dari kluster ACK yang dikelola dan kluster khusus dalam akun dan wilayah Alibaba Cloud yang sama. |
|
|
|
|
Kumpulkan log dari aplikasi tertentu dengan persyaratan berikut:
|
Instal di kluster ACK (mode DaemonSet)
Jika melakukan upgrade dari logtail-ds, uninstal terlebih dahulu sebelum menginstal LoongCollector.
Instal LoongCollector dengan satu klik di Konsol ACK. Secara default, log kontainer dikumpulkan ke proyek dalam akun dan wilayah yang sama. Untuk pengumpulan cross-account atau cross-region, lihat Instal di kluster self-managed (mode DaemonSet).
Kluster ACK 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, lalu klik Install.
-
Setelah instalasi, SLS secara otomatis membuat resource berikut di wilayah kluster, yang dapat dilihat di Konsol Simple Log Service.
Type
Parameter
Deskripsi
Project
k8s-log-${cluster_id}Unit manajemen sumber daya yang mengisolasi log dari layanan berbeda.
machine group
k8s-group-${cluster_id}Machine group untuk pengumpulan log loongcollector-ds.
k8s-group-${cluster_id}-clusterMachine group untuk pengumpulan metrik loongcollector-cluster.
k8s-group-${cluster_id}-singletonMachine group untuk pengumpulan instans tunggal.
PentingLoongCollector tidak membuat LogStore bernama config-operation-log. Jika sudah ada, LoongCollector tidak menulis ke dalamnya.
Kluster ACK baru
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Klik Create Cluster. Di halaman Component Configurations, pilih kotak centang Enable Log Service, lalu pilih Create New Project atau Use Existing Project.
Topik ini hanya mencakup konfigurasi terkait SLS. Pengaturan kluster lainnya didokumentasikan di Buat kluster ACK yang dikelola.
-
Jika Anda memilih Create Project, SLS secara otomatis membuat resource berikut. Anda dapat melihatnya di Konsol Simple Log Service.
Type
Parameter
Deskripsi
Project
k8s-log-${cluster_id}Unit manajemen sumber daya yang mengisolasi log dari layanan berbeda.
machine group
k8s-group-${cluster_id}Machine group untuk pengumpulan log loongcollector-ds.
k8s-group-${cluster_id}-clusterMachine group untuk pengumpulan metrik loongcollector-cluster.
k8s-group-${cluster_id}-singletonMachine group untuk pengumpulan instans tunggal.
PentingLoongCollector tidak membuat LogStore bernama config-operation-log. Jika sudah ada, LoongCollector tidak menulis ke dalamnya.
Instal di kluster self-managed (mode DaemonSet)
Kasus penggunaan
-
Kluster Kubernetes di pusat data lokal
-
Kluster Kubernetes yang dideploy di penyedia cloud lain
-
Mengumpulkan log kontainer dari kluster ACK Alibaba Cloud di akun atau wilayah berbeda
Pastikan kluster self-managed Anda menjalankan Kubernetes 1.6 atau lebih baru.
Prosedur
-
Unduh dan ekstrak paket instalasi: Di mesin dengan kubectl yang telah dikonfigurasi, jalankan perintah sesuai wilayah kluster Anda.
# Wilayah di Tiongkok daratan 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 di 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 -
Edit
values.yaml: Di direktoriloongcollector-custom-k8s-package, edit./loongcollector/values.yaml.Deskripsi
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: "" # Jenis jaringan yang digunakan. Opsi: Internet atau Intranet. 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 kapital, huruf kecil, angka, dan tanda hubung (-). clusterID: "" # ... Parameter opsional lainnya dihilangkan ...projectName
String(Wajib)Nama Proyek tempat LoongCollector mengunggah log. Konvensi penamaan sebagai berikut:
-
Nama Proyek hanya boleh berisi huruf kecil, angka, dan tanda hubung (-).
-
Harus dimulai dengan huruf kecil dan diakhiri dengan huruf kecil atau angka.
-
Nama harus terdiri dari 3 hingga 63 karakter.
region
String(Wajib)ID wilayah tempat Proyek berada. Untuk daftar ID wilayah, lihat Wilayah.
aliUid
String(Wajib)ID Akun Alibaba Cloud yang memiliki Proyek.
net
String(Wajib)Jenis jaringan yang digunakan untuk transmisi data log.
-
Internet (default): Jaringan publik.
-
Intranet: Jaringan internal.
accessKeyID
String(Wajib)ID AccessKey untuk akun yang memiliki proyek. Untuk keamanan lebih baik, gunakan AccessKey Pengguna RAM dengan kebijakan AliyunLogFullAccess. Ikhtisar Pengguna RAM.
accessKeySecret
String(Wajib)Rahasia AccessKey untuk ID AccessKey yang ditentukan.
clusterID
String(Wajib)ID kustom untuk kluster. ID hanya boleh berisi huruf kapital, huruf kecil, angka, dan tanda hubung (-).
PentingJangan memberikan ID kluster yang sama untuk kluster Kubernetes yang berbeda.
-
-
Jalankan skrip instalasi: Dari direktori
loongcollector-custom-k8s-package, jalankan perintah berikut untuk menginstal LoongCollector.bash k8s-custom-install.sh install -
Verifikasi instalasi: Jalankan perintah berikut untuk memeriksa status komponen:
# Periksa status pod kubectl get po -n kube-system | grep loongcollector-dsContoh output:
loongcollector-ds-gnmnh 1/1 Running 0 63sJika komponen gagal dimulai (statusnya bukan Running):
-
Periksa parameter di
values.yaml. -
Periksa image: Jalankan perintah berikut dan periksa bagian
Eventsuntuk memastikan image berhasil ditarik.kubectl describe pod loongcollector-ds -n kube-system
-
-
Setelah instalasi, SLS secara otomatis membuat resource berikut, yang dapat dilihat di Konsol Simple Log Service.
Jenis resource
Nama resource
Tujuan
Project
projectNameyang ditentukan di filevalues.yamlUnit manajemen sumber daya yang mengisolasi log dari layanan berbeda.
machine group
k8s-group-${cluster_id}Sekelompok node yang digunakan untuk pengumpulan log.
k8s-group-${cluster_id}-clusterMachine group untuk loongcollector-cluster. Digunakan untuk pengumpulan metrik.
k8s-group-${cluster_id}-singletonMachine group instans tunggal untuk pengumpulan instans tunggal.
PentingLoongCollector tidak membuat Logstore bernama config-operation-log. Jika sudah ada, LoongCollector berhenti menulis ke dalamnya.
Instal dalam mode sidecar
Gunakan mode sidecar untuk manajemen log detail halus, isolasi multi-tenant, atau pengumpulan log yang terikat siklus hidup. Kontainer LoongCollector khusus disuntikkan ke setiap pod aplikasi. Untuk menguji prosesnya, gunakan Lampiran: Contoh YAML.
1. Modifikasi 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/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 di pod - name: tz-config # <-- Nama harus sesuai dengan nama di volumeMounts hostPath: path: /usr/share/zoneinfo/Asia/Shanghai # Ubah zona waktu sesuai kebutuhan -
Konfigurasikan mount kontainer aplikasi
Di bagian
volumeMountskontainer aplikasi Anda, sepertiyour-business-app-container, tambahkan mount volume berikut:Pastikan kontainer aplikasi menulis log ke direktori
${shared_volume_path}agar LoongCollector dapat mengumpulkannya.volumeMounts: # Mount volume log bersama ke direktori output log aplikasi - name: ${shared_volume_name} mountPath: ${shared_volume_path} # Contoh: /var/log/app # Mount direktori komunikasi - name: tasksite mountPath: /tasksite # Direktori bersama untuk komunikasi dengan kontainer LoongCollector # Mount 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: Memulai inisialisasi" # 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: Layanan berhasil dimulai" touch /tasksite/cornerstone else echo "[$(date)] LoongCollector: Gagal memulai layanan" exit 1 fi # Tunggu kontainer aplikasi selesai (melalui sinyal file tombstone) echo "[$(date)] LoongCollector: Menunggu kontainer aplikasi selesai" until [[ -f /tasksite/tombstone ]]; do sleep 2 done # Beri waktu untuk mengunggah log yang tersisa echo "[$(date)] LoongCollector: Bisnis selesai, menunggu transmisi log" sleep 30 # Hentikan layanan echo "[$(date)] LoongCollector: Menghentikan layanan" /etc/init.d/loongcollectord stop echo "[$(date)] LoongCollector: Shutdown selesai" # 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 # Mount volume (dibagi dengan kontainer aplikasi) volumeMounts: # Mount 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 # Mount direktori komunikasi - name: tasksite mountPath: /tasksite # Mount zona waktu - name: tz-config mountPath: /etc/localtime readOnly: true
2. Sesuaikan logika siklus hidup kontainer aplikasi
Bergantung pada jenis workload, modifikasi kontainer aplikasi untuk mendukung keluar yang terkoordinasi dengan sidecar:
Tugas berumur pendek (Job/CronJob)
# 1. Tunggu LoongCollector siap
echo "[$(date)] Aplikasi: Menunggu LoongCollector siap..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] Aplikasi: LoongCollector siap, memulai logika aplikasi"
# 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)] Aplikasi: Tugas selesai dengan kode keluar: $retcode"
# 4. Beri tahu LoongCollector bahwa tugas aplikasi selesai
touch /tasksite/tombstone
echo "[$(date)] Aplikasi: Tombstone dibuat, keluar"
exit $retcode
Layanan berumur panjang (Deployment / StatefulSet)
# Definisikan fungsi penanganan sinyal
_term_handler() {
echo "[$(date)] [nginx-demo] Menerima SIGTERM, memulai shutdown mulus..."
# Kirim sinyal QUIT ke Nginx untuk berhenti mulus
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Mengirim SIGQUIT ke PID Nginx: $NGINX_PID"
# Tunggu Nginx berhenti secara mulus
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx berhenti dengan kode keluar: $EXIT_CODE"
fi
# Beri tahu LoongCollector bahwa kontainer aplikasi telah berhenti
echo "[$(date)] [nginx-demo] Menulis file tombstone"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# Daftarkan penanganan sinyal
trap _term_handler SIGTERM SIGINT SIGQUIT
# Tunggu LoongCollector siap
echo "[$(date)] [nginx-demo]: Menunggu LoongCollector siap..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector siap, memulai logika aplikasi"
# Mulai Nginx
echo "[$(date)] [nginx-demo] Memulai Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx dimulai dengan PID: $NGINX_PID"
# Tunggu proses Nginx
wait $NGINX_PID
EXIT_CODE=$?
# Juga beri tahu LoongCollector jika keluar bukan karena sinyal
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] Keluar tak terduga, menulis tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
3. Atur periode tenggang terminasi
Di spec.template.spec, atur periode tenggang terminasi 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. Untuk informasi selengkapnya, lihat Konfigurasi pengenal pengguna. |
|
|
Pengenal kustom yang digunakan untuk membuat machine group. Contoh: Penting
Pastikan pengenal ini unik dalam wilayah Proyek. |
|
|
Konfigurasi yang sesuai dengan wilayah dan jenis akses jaringan Proyek Layanan Log Anda. Untuk informasi tentang wilayah, lihat Wilayah layanan. Contoh: Jika Proyek Anda berada di wilayah Tiongkok (Hangzhou), gunakan |
|
|
Nama kustom untuk volume bersama. Penting
|
|
|
Path mount 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, suntikan berhasil.
6. Buat kelompok mesin pengenal kustom
-
Masuk ke Konsol Simple Log Service dan klik proyek target.
-
Di bilah navigasi kiri, pilih , lalu klik di sebelah kanan Machine Groups.
-
Di kotak dialog Create Machine Group, konfigurasikan parameter berikut dan klik OK.
-
Name: Nama machine group. Nama tidak dapat diubah setelah dibuat. Konvensi penamaan sebagai berikut:
-
Hanya boleh berisi huruf kecil, angka, tanda hubung (-), dan garis bawah (_).
-
Harus dimulai dan diakhiri dengan huruf kecil atau angka.
-
Harus terdiri dari 2 hingga 128 karakter.
-
-
Machine Group Identifier: Pilih Custom Identifier.
-
Custom Identifier: Masukkan nilai variabel lingkungan
ALIYUN_LOGTAIL_USER_DEFINED_IDyang Anda atur untuk kontainer LoongCollector di 1. Modifikasi konfigurasi YAML Pod layanan. Nilainya harus persis sama, atau asosiasi akan gagal.
-
-
Setelah machine group dibuat, periksa status heartbeat-nya dengan mengklik namanya dan melihat area status.
-
OK: LoongCollector berhasil terhubung ke Simple Log Service dan mendaftarkan machine group.
-
FAIL:
-
Konfigurasi memerlukan waktu sekitar 2 menit untuk diterapkan. Muat ulang halaman setelah menunggu sebentar.
-
Jika masih FAIL setelah 2 menit, Pemecahan masalah machine group Logtail.
-
-
Setiap pod menjalankan instans LoongCollector sendiri. Gunakan pengenal kustom unik per aplikasi atau lingkungan untuk manajemen detail halus.
FAQ
Pengumpulan cross-account atau cross-region
Pengumpulan log untuk kluster lain
Langkah selanjutnya
Setelah menginstal LoongCollector, tinjau Kumpulkan log kontainer dari kluster Kubernetes untuk konsep inti dan praktik terbaik, lalu buat konfigurasi pengumpulan:
Lampiran: Contoh YAML
Konfigurasi YAML lengkap untuk Job Kubernetes dan Deployment dengan kontainer sidecar LoongCollector.
Sebelum memulai, ganti tiga placeholder berikut:
-
Ganti
${your_aliyun_user_id}dengan UID akun Alibaba Cloud Anda. -
Ganti
${your_machine_group_user_defined_id}dengan ID kustom machine group yang Anda buat di Langkah 3. ID harus persis sama. -
Ganti
${your_region_config}dengan nama konfigurasi yang sesuai dengan wilayah dan jenis jaringan Proyek Layanan Log (SLS) Anda.Contoh: Untuk Proyek 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)] Bisnis: Menunggu LoongCollector siap..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] Bisnis: LoongCollector siap, memulai logika bisnis"
# Jalankan logika aplikasi.
echo "Hello, World!" >> /app/logs/business.log
# Simpan kode keluar.
retcode=$?
echo "[$(date)] Bisnis: Tugas selesai dengan kode keluar: $retcode"
# Beri tahu LoongCollector bahwa tugas selesai.
touch /tasksite/tombstone
echo "[$(date)] Bisnis: Tombstone dibuat, keluar"
exit $retcode
# Permintaan dan batas resource
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500"
memory: "512Mi"
# mount 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: Memulai inisialisasi"
# 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: Layanan berhasil dimulai"
touch /tasksite/cornerstone
else
echo "[$(date)] LoongCollector: Gagal memulai layanan"
exit 1
fi
# Tunggu kontainer aplikasi selesai.
echo "[$(date)] LoongCollector: Menunggu kontainer bisnis selesai"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: Bisnis selesai, menunggu transmisi log"
# Beri waktu cukup untuk mengirim log yang tersisa.
sleep 30
echo "[$(date)] LoongCollector: Menghentikan layanan"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown selesai"
# 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
# mount 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] Menerima SIGTERM, memulai shutdown mulus..."
# Kirim sinyal QUIT ke Nginx untuk berhenti mulus.
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Mengirim SIGQUIT ke PID Nginx: $NGINX_PID"
# Tunggu Nginx berhenti secara mulus.
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx berhenti dengan kode keluar: $EXIT_CODE"
fi
# Beri tahu LoongCollector bahwa kontainer aplikasi telah berhenti.
echo "[$(date)] [nginx-demo] Menulis file tombstone"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# Daftarkan penanganan sinyal.
trap _term_handler SIGTERM SIGINT SIGQUIT
# Tunggu LoongCollector siap.
echo "[$(date)] [nginx-demo]: Menunggu LoongCollector siap..."
until [[ -f /tasksite/cornerstone ]]; do
sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector siap, memulai logika bisnis"
# Mulai Nginx.
echo "[$(date)] [nginx-demo] Memulai Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx dimulai dengan 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] Keluar tak terduga, menulis tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
# Permintaan dan batas resource
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
# mount 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: Memulai inisialisasi"
# 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: Layanan berhasil dimulai"
touch /tasksite/cornerstone
else
echo "[$(date)] LoongCollector: Gagal memulai layanan"
exit 1
fi
# Tunggu kontainer aplikasi selesai.
echo "[$(date)] LoongCollector: Menunggu kontainer bisnis selesai"
until [[ -f /tasksite/tombstone ]]; do
sleep 2
done
echo "[$(date)] LoongCollector: Bisnis selesai, menunggu transmisi log"
# Beri waktu cukup untuk mengirim log yang tersisa.
sleep 30
echo "[$(date)] LoongCollector: Menghentikan layanan"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown selesai"
# 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
# mount 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