LoongCollector est l'agent de collecte de journaux SLS de nouvelle génération et le successeur de Logtail. Installez-le dans un cluster Kubernetes en mode DaemonSet ou sidecar.
Prérequis
Avant d'installer LoongCollector, vérifiez la connectivité réseau entre les nœuds de votre cluster et l'endpoint SLS.
-
Obtenez l'endpoint :
Connectez-vous à la console Simple Log Service. Dans la liste des projets, cliquez sur le projet de destination.
Cliquez sur l'icône
située à côté du nom du projet pour ouvrir la page de présentation du projet.Dans la section des endpoints, repérez les endpoints publics et privés correspondant à la région du projet.
-
Exécutez un test de connectivité : Connectez-vous à un nœud du cluster et exécutez la commande
curlsuivante. Remplacez${PROJECT_NAME}et${SLS_ENDPOINT}par vos valeurs réelles.curl https://${PROJECT_NAME}.${SLS_ENDPOINT} -
Vérifiez les résultats :
-
Si la commande renvoie
{"Error":{"Code":"OLSInvalidMethod",...}}, la connexion réseau entre votre nœud et Simple Log Service est établie.RemarqueCette erreur est attendue : le test vérifie uniquement la connectivité réseau. SLS renvoie une erreur car la requête ne contient pas les paramètres d'API requis.
Si la commande expire ou renvoie des erreurs telles que
Connection refused, vérifiez la configuration réseau du nœud, les règles du groupe de sécurité et la résolution DNS.
-
Choisir une méthode d'installation
Sélectionnez une méthode en fonction du type de votre cluster.
|
Méthode d'installation |
Cas d'utilisation |
|
Collecte de journaux provenant des clusters gérés et dédiés ACK au sein du même compte Alibaba Cloud et de la même région. |
|
|
|
|
Collecte de journaux pour des applications spécifiques répondant aux exigences suivantes :
|
Installer sur un cluster ACK (mode DaemonSet)
Si vous effectuez une mise à niveau depuis logtail-ds, désinstallez-le avant d'installer LoongCollector.
Installez LoongCollector en un clic depuis la console ACK. Par défaut, il collecte les journaux des conteneurs vers un projet situé dans le même compte et la même région. Pour une collecte inter-comptes ou inter-régions, consultez la section Installation sur un cluster auto-géré (mode DaemonSet).
Cluster ACK existant
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Components and Add-ons .
Sous l'onglet Logs and Monitoring, recherchez LoongCollector, puis cliquez sur Install.
-
Après l'installation, SLS crée automatiquement les ressources suivantes dans la région du cluster. Vous pouvez les consulter dans la console Simple Log Service.
Type
Paramètre
Description
Projet
k8s-log-${cluster_id}Unité de gestion des ressources qui isole les journaux des différents services.
groupe de machines
k8s-group-${cluster_id}Groupe de machines pour la collecte de journaux loongcollector-ds.
k8s-group-${cluster_id}-clusterGroupe de machines pour la collecte de métriques loongcollector-cluster.
k8s-group-${cluster_id}-singletonGroupe de machines pour la collecte mono-instance.
ImportantLoongCollector ne crée pas de LogStore nommé config-operation-log. S'il existe déjà, LoongCollector n'y écrit pas.
Nouveau cluster ACK
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
-
Cliquez sur Create Cluster. Sur la page Component Configurations, cochez la case Enable Log Service, puis sélectionnez Create New Project ou Use Existing Project.
Cette rubrique couvre uniquement les configurations liées à SLS. Les autres paramètres du cluster sont documentés dans Créer un cluster ACK géré .
-
Si vous sélectionnez Create Project, SLS crée automatiquement les ressources suivantes. Vous pouvez les consulter dans la console Simple Log Service.
Type
Paramètre
Description
Projet
k8s-log-${cluster_id}Unité de gestion des ressources qui isole les journaux des différents services.
groupe de machines
k8s-group-${cluster_id}Groupe de machines pour la collecte de journaux loongcollector-ds.
k8s-group-${cluster_id}-clusterGroupe de machines pour la collecte de métriques loongcollector-cluster.
k8s-group-${cluster_id}-singletonGroupe de machines pour la collecte mono-instance.
ImportantLoongCollector ne crée pas de LogStore nommé config-operation-log. S'il existe déjà, LoongCollector n'y écrit pas.
Installer sur un cluster auto-géré (mode DaemonSet)
Cas d'utilisation
Clusters Kubernetes dans des centres de données auto-gérés
Clusters Kubernetes déployés chez d'autres fournisseurs cloud
Collecte de journaux de conteneurs depuis des clusters ACK Alibaba Cloud situés dans différents comptes ou régions
Assurez-vous que votre cluster auto-géré exécute Kubernetes 1.6 ou une version ultérieure.
Procédure
-
Téléchargez et extrayez le package d'installation : Sur une machine où kubectl est configuré, exécutez la commande correspondant à la région de votre cluster.
# Regions in Chinese mainland 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 # Regions outside Chinese mainland 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 -
Modifiez values.yaml : Dans le répertoire
loongcollector-custom-k8s-package, modifiez le fichier./loongcollector/values.yaml.Description
values.yaml
# ===================== Required Parameters ===================== # The name of the Project for log collection in this cluster. Example: k8s-log-custom-sd89ehdq projectName: "" # The region of the Project. Example for Shanghai: cn-shanghai region: "" # The ID of the Alibaba Cloud account that owns the Project. Enclose the ID in quotation marks. Example: "123456789" aliUid: "" # The network type to use. Options: Internet or Intranet. Default: Internet net: Internet # The AccessKey ID and AccessKey secret of the Alibaba Cloud account or RAM user. accessKeyID: "" accessKeySecret: "" # A custom cluster ID. The ID can contain uppercase letters, lowercase letters, digits, and hyphens (-). clusterID: "" # ... Other optional parameters are omitted ...projectName
String(Obligatoire)Nom du projet vers lequel LoongCollector télécharge les journaux. Les conventions de nommage sont les suivantes :
-
Le nom du projet ne peut contenir que des lettres minuscules, des chiffres et des traits d'union (-).
-
Il doit commencer par une lettre minuscule et se terminer par une lettre minuscule ou un chiffre.
-
La longueur du nom doit être comprise entre 3 et 63 caractères.
region
String(Obligatoire)ID de la région où se trouve le projet. Pour obtenir la liste des ID de région, consultez la section Régions.
aliUid
String(Obligatoire)ID du compte Alibaba Cloud propriétaire du projet.
net
String(Obligatoire)Type de réseau utilisé pour la transmission des données de journal.
-
Internet (par défaut) : Réseau public.
-
Intranet : Réseau interne.
accessKeyID
String(Obligatoire)AccessKey ID du compte propriétaire du projet. Pour une meilleure sécurité, utilisez l'AccessKey d'un utilisateur RAM disposant de la stratégie AliyunLogFullAccess. Présentation des utilisateurs RAM.
accessKeySecret
String(Obligatoire)AccessKey Secret correspondant à l'AccessKey ID spécifié.
clusterID
String(Obligatoire)ID personnalisé pour le cluster. L'ID ne peut contenir que des lettres majuscules, des lettres minuscules, des chiffres et des traits d'union (-).
ImportantN'attribuez pas le même ID de cluster à différents clusters Kubernetes.
-
-
Exécutez le script d'installation : Depuis le répertoire
loongcollector-custom-k8s-package, exécutez la commande suivante pour installer LoongCollector.bash k8s-custom-install.sh install -
Vérifiez l'installation : Exécutez la commande suivante pour vérifier l'état des composants :
# Check the pod status kubectl get po -n kube-system | grep loongcollector-dsExemple de sortie :
loongcollector-ds-gnmnh 1/1 Running 0 63sSi un composant ne démarre pas (son état n'est pas Running) :
Vérifiez les paramètres dans
values.yaml.-
Vérifiez l'image : Exécutez la commande suivante et examinez la section
Eventspour confirmer que l'image a été extraite.kubectl describe pod loongcollector-ds -n kube-system
-
Après l'installation, SLS crée automatiquement les ressources suivantes, consultables dans la console Simple Log Service.
Type de ressource
Nom de la ressource
Objectif
Projet
Le
projectNamespécifié dans le fichiervalues.yamlUnité de gestion des ressources qui isole les journaux des différents services.
groupe de machines
k8s-group-${cluster_id}Groupe de nœuds utilisé pour la collecte de journaux.
k8s-group-${cluster_id}-clusterGroupe de machines pour loongcollector-cluster. Utilisé pour la collecte de métriques.
k8s-group-${cluster_id}-singletonGroupe de machines mono-instance pour la collecte mono-instance.
ImportantLoongCollector ne crée pas de LogStore nommé config-operation-log. S'il existe déjà, LoongCollector cesse d'y écrire.
Installer en mode sidecar
Utilisez le mode sidecar pour une gestion granulaire des journaux, l'isolation multi-locataire ou la collecte de journaux couplée au cycle de vie. Un conteneur LoongCollector dédié est injecté dans chaque pod d'application. Pour tester le processus, utilisez l'exemple Annexe : Exemple YAML.
1. Modifier la configuration YAML du pod
-
Définissez les volumes partagés
Dans
spec.template.spec.volumes, ajoutez trois volumes partagés au même niveau quecontainers:volumes: # Shared log directory (written by the application container, read by the sidecar) - name: ${shared_volume_name} # <-- The name must match the name in volumeMounts emptyDir: {} # Signal directory for inter-container communication (for graceful start/stop) - name: tasksite emptyDir: medium: Memory # Use memory as the medium for better performance sizeLimit: "50Mi" # Shared host time zone configuration: Synchronizes the time zone for all containers in the pod - name: tz-config # <-- The name must match the name in volumeMounts hostPath: path: /usr/share/zoneinfo/Asia/Shanghai # Modify the time zone as needed -
Configurez les montages du conteneur d'application
Dans la section
volumeMountsde votre conteneur d'application, tel queyour-business-app-container, ajoutez les montages de volume suivants :Assurez-vous que le conteneur d'application écrit les journaux dans le répertoire
${shared_volume_path}afin que LoongCollector puisse les collecter.volumeMounts: # Mount the shared log volume to the application log output directory - name: ${shared_volume_name} mountPath: ${shared_volume_path} # Example: /var/log/app # Mount the communication directory - name: tasksite mountPath: /tasksite # Shared directory for communication with the LoongCollector container # Mount the timezone file - name: tz-config mountPath: /etc/localtime readOnly: true -
Injectez le conteneur sidecar LoongCollector
Dans le tableau
spec.template.spec.containers, ajoutez la définition de conteneur sidecar suivante :- 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" # Start the LoongCollector service /etc/init.d/loongcollectord start # Wait for the configuration to download and the service to be ready sleep 15 # Verify the service status 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 # Wait for the application container to complete (via the tombstone file signal) echo "[$(date)] LoongCollector: Waiting for application container to complete" until [[ -f /tasksite/tombstone ]]; do sleep 2 done # Allow time to upload remaining logs echo "[$(date)] LoongCollector: Business completed, waiting for log transmission" sleep 30 # Stop the service echo "[$(date)] LoongCollector: Stopping service" /etc/init.d/loongcollectord stop echo "[$(date)] LoongCollector: Shutdown complete" # health check livenessProbe: exec: command: ["/etc/init.d/loongcollectord", "status"] initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 # resource configuration resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "2000m" memory: "2048Mi" # environment variable configuration 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" # Enable full drain mode to ensure all logs are sent before the pod terminates - name: enable_full_drain_mode value: "true" # Append pod environment information as log tags - name: ALIYUN_LOG_ENV_TAGS value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_" # Automatically inject pod and node metadata as log tags - 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 # Volume mounts (shared with the application container) volumeMounts: # Read-only mount for the application log directory - name: ${shared_volume_name} # <-- Shared log directory name mountPath: ${dir_containing_your_files} # <-- Path to the shared directory in the sidecar readOnly: true # Mount the communication directory - name: tasksite mountPath: /tasksite # Mount the timezone - name: tz-config mountPath: /etc/localtime readOnly: true
2. Adapter la logique du cycle de vie du conteneur d'application
Selon le type de charge de travail, modifiez le conteneur d'application pour prendre en charge une sortie coordonnée avec le sidecar :
Tâches éphémères (Job/CronJob)
# 1. Wait for LoongCollector to be ready
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. Execute core application logic (ensure logs are written to the shared directory)
echo "Hello, World!" >> /app/logs/business.log
# 3. Save the exit code
retcode=$?
echo "[$(date)] Application: Task completed with exit code: $retcode"
# 4. Notify LoongCollector that the application task is complete
touch /tasksite/tombstone
echo "[$(date)] Application: Tombstone created, exiting"
exit $retcode
Services de longue durée (Deployment / StatefulSet)
# Define the signal handler function
_term_handler() {
echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
# Send a QUIT signal to Nginx for a graceful stop
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
# Wait for Nginx to stop gracefully
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
fi
# Notify LoongCollector that the application container has stopped
echo "[$(date)] [nginx-demo] Writing tombstone file"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# Register the signal handler
trap _term_handler SIGTERM SIGINT SIGQUIT
# Wait for LoongCollector to be ready
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"
# Start Nginx
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# Wait for the Nginx process
wait $NGINX_PID
EXIT_CODE=$?
# Also notify LoongCollector if the exit was not caused by a signal
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
3. Définir la période de grâce de terminaison
Dans spec.template.spec, définissez une période de grâce de terminaison suffisamment longue pour permettre à LoongCollector de téléverser tous les journaux restants.
spec:
# ... Your other existing spec configurations ...
template:
spec:
terminationGracePeriodSeconds: 600 # 10-minute graceful stop period
4. Variables
|
Paramètre |
Description |
|
|
L'ID de votre compte Alibaba Cloud. Configurer les identifiants utilisateur. |
|
|
Un identifiant personnalisé utilisé pour créer un groupe de machines. Exemple : Important
Assurez-vous que cet identifiant est unique dans la région du projet. |
|
|
La configuration correspondant à la région de votre projet SLS et au type d'accès réseau. Régions de service. Exemple : Si votre projet se trouve dans la région Chine (Hangzhou), utilisez |
|
|
Un nom personnalisé pour le volume partagé. Important
Le |
|
|
Le chemin de montage dans le conteneur LoongCollector où se trouvent les journaux texte. |
5. Appliquer la configuration et vérifier
-
Exécutez la commande suivante pour déployer les modifications :
kubectl apply -f <YOUR-YAML> -
Vérifiez l'état du pod pour confirmer que le conteneur LoongCollector a été injecté avec succès :
kubectl describe pod <YOUR-POD-NAME>Si vous voyez deux conteneurs (le conteneur d'application et
loongcollector) et que leur état est Running, l'injection a réussi.
6. Créer un groupe de machines avec identifiant personnalisé
Connectez-vous à la console Simple Log Service et cliquez sur le projet cible.
Dans le volet de navigation de gauche, sélectionnez , puis cliquez sur à droite de Machine Groups.
-
Dans la boîte de dialogue Create Machine Group, configurez les paramètres suivants et cliquez sur OK.
-
Name : Nom du groupe de machines. Il ne peut pas être modifié après la création. Les conventions de nommage sont les suivantes :
Ne peut contenir que des lettres minuscules, des chiffres, des traits d'union (-) et des underscores (_).
Doit commencer et se terminer par une lettre minuscule ou un chiffre.
La longueur doit être comprise entre 2 et 128 caractères.
Machine Group Identifier : Sélectionnez Custom Identifier.
Custom Identifier : Saisissez la valeur de la variable d'environnement
ALIYUN_LOGTAIL_USER_DEFINED_IDque vous avez définie pour le conteneur LoongCollector dans 1. Modifier la configuration YAML du pod de service. La valeur doit correspondre exactement, sinon l'association échouera.
-
-
Une fois le groupe de machines créé, vérifiez son état de pulsation en cliquant sur son nom et en consultant la zone d'état.
OK : LoongCollector s'est connecté avec succès à Simple Log Service et a enregistré le groupe de machines.
-
FAIL :
L'application de la configuration prend environ 2 minutes. Actualisez la page après une courte attente.
Si l'état reste FAIL après 2 minutes, consultez la rubrique Résoudre les problèmes liés aux groupes de machines Logtail.
Chaque pod exécute sa propre instance de LoongCollector. Utilisez un identifiant personnalisé unique par application ou environnement pour une gestion granulaire.
FAQ
Collecte inter-comptes ou inter-régions
Collecte de journaux pour d'autres clusters
Étapes suivantes
Après avoir installé LoongCollector, consultez la rubrique Collecter les journaux de conteneur d'un cluster Kubernetes pour découvrir les concepts de base et les bonnes pratiques, puis créez une configuration de collecte :
Annexe : exemples YAML
Vous trouverez ci-dessous les configurations YAML complètes pour un Job Kubernetes et un Deployment intégrant un conteneur sidecar LoongCollector.
Avant de commencer, remplacez les trois espaces réservés suivants :
Remplacez
${your_aliyun_user_id}par l'UID de votre compte Alibaba Cloud.Remplacez
${your_machine_group_user_defined_id}par l'ID personnalisé du groupe de machines créé à l'étape 3. L'identifiant doit correspondre exactement.-
Remplacez
${your_region_config}par le nom de configuration correspondant à la région et au type de réseau de votre projet Log Service (SLS).Par exemple, pour un projet situé dans la région Chine (Hangzhou), utilisez
cn-hangzhoupour un accès via le réseau interne oucn-hangzhou-internetpour un accès via le réseau public.
Tâches éphémères (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:
# Application container
- name: demo-job
image: debian:bookworm-slim
command: ["/bin/bash", "-c"]
args:
- |
# Wait for LoongCollector to be ready.
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"
# Run the application logic.
echo "Hello, World!" >> /app/logs/business.log
# Save the exit code.
retcode=$?
echo "[$(date)] Business: Task completed with exit code: $retcode"
# Notify LoongCollector that the task is finished.
touch /tasksite/tombstone
echo "[$(date)] Business: Tombstone created, exiting"
exit $retcode
# Resource requests and limits
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500"
memory: "512Mi"
# volume mounts
volumeMounts:
- name: app-logs
mountPath: /app/logs
- name: tasksite
mountPath: /tasksite
# LoongCollector sidecar container
- 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"
# Start the LoongCollector service.
/etc/init.d/loongcollectord start
# Wait for the configuration to download and the service to be ready.
sleep 15
# Verify the service status.
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
# Wait for the application container to finish.
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"
# Allow sufficient time to send remaining logs.
sleep 30
echo "[$(date)] LoongCollector: Stopping service"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown complete"
# health check
livenessProbe:
exec:
command: ["/etc/init.d/loongcollectord", "status"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# Resource requests and limits
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
# environment variables
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_"
# Inject pod metadata.
- 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
# volume mounts
volumeMounts:
- name: app-logs
mountPath: /app/logs
readOnly: true
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# Volume definitions
volumes:
- name: app-logs
emptyDir: {}
- name: tasksite
emptyDir:
medium: Memory
sizeLimit: "10Mi"
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
Services de longue durée (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-minute graceful shutdown period
containers:
# Application container - Web application
- name: nginx-demo
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
# Startup command and signal handling
command: ["/bin/sh", "-c"]
args:
- |
# Define the signal handler.
_term_handler() {
echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
# Send the QUIT signal to Nginx for a graceful stop.
if [ -n "$NGINX_PID" ]; then
kill -QUIT "$NGINX_PID" 2>/dev/null || true
echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
# Wait for Nginx to stop gracefully.
wait "$NGINX_PID"
EXIT_CODE=$?
echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
fi
# Notify LoongCollector that the application container has stopped.
echo "[$(date)] [nginx-demo] Writing tombstone file"
touch /tasksite/tombstone
exit $EXIT_CODE
}
# Register the signal handler.
trap _term_handler SIGTERM SIGINT SIGQUIT
# Wait for LoongCollector to be ready.
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"
# Start Nginx.
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# Wait for the Nginx process to exit.
wait $NGINX_PID
EXIT_CODE=$?
# If the process exits without a signal, notify LoongCollector.
if [ ! -f /tasksite/tombstone ]; then
echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
touch /tasksite/tombstone
fi
exit $EXIT_CODE
# Resource requests and limits
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
# volume mounts
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# LoongCollector sidecar container
- 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"
# Start the LoongCollector service.
/etc/init.d/loongcollectord start
# Wait for the configuration to download and the service to be ready.
sleep 15
# Verify the service status.
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
# Wait for the application container to finish.
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"
# Allow sufficient time to send remaining logs.
sleep 30
echo "[$(date)] LoongCollector: Stopping service"
/etc/init.d/loongcollectord stop
echo "[$(date)] LoongCollector: Shutdown complete"
# health check
livenessProbe:
exec:
command: ["/etc/init.d/loongcollectord", "status"]
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# Resource requests and limits
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "2000m"
memory: "2048Mi"
# environment variables
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"
# Enable full drain mode to send all logs when the pod stops.
- name: enable_full_drain_mode
value: "true"
# Append pod environment information as log tags.
- name: "ALIYUN_LOG_ENV_TAGS"
value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
# Get pod and node information.
- 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
# volume mounts
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
readOnly: true
- name: tasksite
mountPath: /tasksite
- name: tz-config
mountPath: /etc/localtime
readOnly: true
# Volume definitions
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