O LoongCollector é o agente de coleta de logs de última geração do Alibaba Cloud Simple Log Service (SLS), que substitui o Logtail com capacidades aprimoradas. Instale-o em um cluster Kubernetes no modo DaemonSet ou Sidecar.
Pré-requisitos
Antes de instalar o LoongCollector, verifique a conectividade de rede entre os nós do cluster e o endpoint do Simple Log Service. Os nós precisam alcançar esse endpoint para que a coleta de logs reporte dados.
-
Obtenha o endpoint do service:
Faça logon no console do Simple Log Service. Na lista de projetos, clique em no projeto desejado.
Clique em no ícone
ao lado do nome do projeto para abrir a página de visão geral do projeto.Na seção Basic Information, localize os endpoints públicos e internos da região do projeto.
-
Execute um teste de conectividade: Faça logon no nó do cluster onde você instalará o LoongCollector e execute o seguinte comando
curl. Substitua${ProjectName}e${SLS_ENDPOINT}pelos valores reais.curl https://${ProjectName}.${SLS_ENDPOINT} -
Verifique o resultado do teste:
-
Se o comando retornar
{"Error":{"Code":"OLSInvalidMethod",...}}, o nó tem conectividade de rede com o Simple Log Service.NotaEste teste verifica apenas a conectividade na camada de rede. A resposta de erro é esperada porque a solicitação não possui os parâmetros de API necessários.
Caso o comando atinja o tempo limite ou retorne outros erros de camada de rede, como
Connection refused, verifique a configuração de rede do nó, as regras do grupo de segurança ou a resolução de DNS.
-
Métodos de instalação
Escolha um método de instalação com base no tipo de cluster e nos seus requisitos.
|
Método de instalação |
Casos de uso |
|
Coleta de logs de clusters gerenciados e dedicados do ACK na mesma conta e região do Alibaba Cloud. |
|
|
|
|
Coleta de logs de aplicações específicas que exigem:
|
Instalação em um cluster ACK (modo DaemonSet)
Instale o LoongCollector com um único clique em no console do Container Service for Kubernetes (ACK). Por padrão, o LoongCollector coleta logs de contêineres e os envia para um Project na mesma conta e região do Alibaba Cloud. Para coletar logs entre contas ou regiões, consulte Instalação em um cluster autogerenciado (modo DaemonSet).
Instalar em um cluster gerenciado ACK existente
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em no nome do seu cluster. No painel de navegação à esquerda, clique em Components and Add-ons .
Na aba Logs and Monitoring, localize loongcollector e clique em Install.
-
Após a instalação, o Simple Log Service (SLS) cria automaticamente os seguintes recursos na região do cluster ACK. Visualize-os no console do Simple Log Service (SLS).
Tipo de recurso
Nome do recurso
Finalidade
Project
k8s-log-${cluster_id}Isola logs de diferentes serviços.
Machine group
k8s-group-${cluster_id}Grupo de máquinas para loongcollector-ds, usado para coleta de logs.
k8s-group-${cluster_id}-clusterGrupo de máquinas para loongcollector-cluster, usado para coleta de métricas.
k8s-group-${cluster_id}-singletonGrupo de máquinas para configurações específicas de coleta de instância única.
ImportanteO componente LoongCollector não cria um LogStore chamado
config-operation-log. Se esse LogStore já existir, o LoongCollector não gravará logs nele.
Instalar durante a criação de um cluster gerenciado ACK
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
-
Clique em Create Cluster. Na página Component Configurations, marque a caixa de seleção Enable Log Service. Em seguida, selecione Create a new Project ou Use an existing Project.
Este tópico descreve apenas as configurações do Simple Log Service (SLS). Para obter mais informações sobre outros itens de configuração, consulte Criar um cluster gerenciado ACK .
-
Ao selecionar Create Project, o Simple Log Service (SLS) cria automaticamente os seguintes recursos. Visualize-os no console do Simple Log Service (SLS).
Tipo de recurso
Nome do recurso
Finalidade
Project
k8s-log-${cluster_id}Isola logs de diferentes serviços.
Machine group
k8s-group-${cluster_id}Grupo de máquinas para loongcollector-ds, usado para coleta de logs.
k8s-group-${cluster_id}-clusterGrupo de máquinas para loongcollector-cluster, usado para coleta de métricas.
k8s-group-${cluster_id}-singletonGrupo de máquinas para configurações específicas de coleta de instância única.
ImportanteO componente LoongCollector não cria um LogStore chamado
config-operation-log. Se esse LogStore já existir, o LoongCollector não gravará logs nele.
Instalação em um cluster autogerenciado (modo DaemonSet)
Casos de uso
Clusters Kubernetes em data centers autogerenciados
Clusters Kubernetes implantados em outros provedores de cloud
Coleta de logs de contêineres de clusters ACK em diferentes contas ou regiões do Alibaba Cloud
Certifique-se de que seu cluster autogerenciado execute o Kubernetes 1.6 ou posterior.
Procedimento
-
Baixe e extraia o pacote de instalação: Em uma máquina com kubectl instalado e configurado, execute o comando apropriado para a região do seu cluster para baixar o LoongCollector e suas dependências.
# China regions 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 the 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 -
Modifique o arquivo de configuração values.yaml: Acesse o diretório
loongcollector-custom-k8s-packagee modifique o arquivo de configuração./loongcollector/values.yaml.Parâmetros
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 to use. Options: Internet (public network) or Intranet (internal network). 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: "" # ... Optional parameters are omitted ...projectName
String(Obrigatório)Nome do Project para o qual o LoongCollector envia logs. O nome deve seguir estas regras:
-
Deve conter apenas letras minúsculas, dígitos e hifens (-).
-
Deve começar com uma letra minúscula e terminar com uma letra minúscula ou um dígito.
-
Deve ter entre 3 e 63 caracteres.
region
String(Obrigatório)ID da região do Project. Para obter uma lista de IDs de região, consulte Regiões.
aliUid
String(Obrigatório)ID da conta do Alibaba Cloud proprietária do Project.
net
String(Obrigatório)O tipo de rede para transmissão de dados de log.
-
Internet (padrão): Rede pública.
-
Intranet: Rede interna.
accessKeyID
String(Obrigatório)AccessKey ID usado para acessar o Project. Recomendamos usar o par de AccessKeys de um usuário RAM. Conceda a política de sistema AliyunLogFullAccess ao usuário RAM. Para obter mais informações sobre o RAM, consulte Visão geral.
accessKeySecret
String(Obrigatório)AccessKey secret correspondente ao AccessKey ID.
clusterID
String(Obrigatório)ID personalizado para o cluster. O ID deve conter apenas letras maiúsculas, letras minúsculas, dígitos e hifens (-).
ImportanteNão atribua o mesmo ID de cluster a diferentes clusters Kubernetes.
-
-
Execute o script de instalação: No diretório
loongcollector-custom-k8s-package, execute o seguinte comando para instalar o LoongCollector e suas dependências.bash k8s-custom-install.sh install -
Verifique a instalação: Após concluir a instalação, execute o seguinte comando para verificar o status dos pods:
# Check the pod status kubectl get po -n kube-system | grep loongcollector-dsSaída de exemplo:
loongcollector-ds-gnmnh 1/1 Running 0 63sSe um pod falhar ao iniciar (seu status não for Running):
Verifique a configuração: Confirme se os parâmetros em
values.yamlestão corretos.-
Verifique a imagem: Execute o seguinte comando e confira a seção
Eventsda saída para confirmar se a imagem do contêiner foi baixada com êxito.kubectl describe pod loongcollector-ds -n kube-system
-
Após a instalação do LoongCollector, o Simple Log Service cria automaticamente os seguintes recursos. Visualize-os no console do Simple Log Service.
Tipo de recurso
Nome do recurso
Descrição
Project
O valor
projectNameespecificado no arquivovalues.yaml.Unidade de gerenciamento de recursos que isola logs de diferentes serviços.
Machine group
k8s-group-${cluster_id}Grupo de máquinas contendo todos os nós que coletam logs.
k8s-group-${cluster_id}-clusterGrupo de máquinas para loongcollector-cluster. Usado principalmente para coleta de métricas.
k8s-group-${cluster_id}-singletonGrupo de máquinas de instância única para configurações de coleta específicas.
ImportanteO LoongCollector não cria um LogStore chamado config-operation-log. Se esse LogStore já existir, o LoongCollector não gravará logs nele.
Instalação no modo Sidecar
O modo Sidecar funciona injetando um contêiner dedicado do LoongCollector (Logtail) no Pod da sua aplicação para coletar logs exclusivamente desse Pod. Esse padrão é ideal quando você precisa de gerenciamento granular de logs, isolamento multilocatário ou uma vinculação estreita entre a coleta de logs e o ciclo de vida da aplicação. Se você ainda não implantou uma aplicação ou deseja testar o processo, use o Apêndice: Exemplos de YAML para verificar rapidamente o fluxo de trabalho.
1. Modifique a configuração YAML do pod
-
Defina volumes compartilhados
Em
spec.template.spec.volumes, adicione três volumes compartilhados no mesmo nível decontainers: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 -
Configure as montagens do contêiner da aplicação
Na seção
volumeMountsdo contêiner da sua aplicação, comoyour-business-app-container, adicione as seguintes montagens de volume:Certifique-se de que o contêiner da aplicação grave logs no diretório
${shared_volume_path}para que o LoongCollector possa coletá-los.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 -
Injete o contêiner sidecar do LoongCollector
No array
spec.template.spec.containers, anexe a seguinte definição de contêiner sidecar:- 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. Adapte a lógica do ciclo de vida do contêiner da aplicação
Dependendo do tipo de carga de trabalho, modifique o contêiner da aplicação para suportar uma saída coordenada com o sidecar:
Tarefas de curta duração (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
Serviços de longa duração (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. Defina o período de carência de encerramento
Em spec.template.spec, defina um período de carência de encerramento longo o suficiente para permitir que o LoongCollector envie todos os logs restantes.
spec:
# ... Your other existing spec configurations ...
template:
spec:
terminationGracePeriodSeconds: 600 # 10-minute graceful stop period
4. Variáveis
|
Parâmetro |
Descrição |
|
|
ID da sua conta do Alibaba Cloud. Configurar identificadores de usuário. |
|
|
Identificador personalizado usado para criar um grupo de máquinas. Exemplo: Importante
Certifique-se de que este identificador seja exclusivo na região do Project. |
|
|
Configuração correspondente à região e ao tipo de acesso à rede do seu Project do SLS. Regiões de service. Exemplo: Se o seu Project estiver na região China (Hangzhou), use |
|
|
Nome personalizado para o volume compartilhado. Importante
O |
|
|
Caminho de montagem no contêiner do LoongCollector onde os logs de texto estão localizados. |
5. Aplique a configuração e verifique
-
Execute o seguinte comando para implantar as alterações:
kubectl apply -f <YOUR-YAML> -
Verifique o status do pod para confirmar se o contêiner do LoongCollector foi injetado com êxito:
kubectl describe pod <YOUR-POD-NAME>Se você vir dois contêineres (o contêiner da aplicação e
loongcollector) e o status deles for Running, a injeção foi bem-sucedida.
6. Crie um grupo de máquinas baseado em identificador personalizado
Faça logon no console do Simple Log Service e clique em no projeto desejado.
Na barra de navegação à esquerda, selecione e clique em à direita de Machine Groups.
-
Na caixa de diálogo Create Machine Group, configure os seguintes parâmetros e clique em OK.
-
Name: Nome do grupo de máquinas. Não é possível alterar esse nome após a criação. O nome deve atender aos seguintes requisitos:
Pode conter apenas letras minúsculas, dígitos, hifens (-) e sublinhados (_).
Deve começar e terminar com uma letra minúscula ou um dígito.
Deve ter entre 2 e 128 caracteres.
Machine Group Identifier: Selecione Custom Identifier.
Custom Identifier: Insira o valor da variável de ambiente
ALIYUN_LOGTAIL_USER_DEFINED_IDdefinida para o contêiner do LoongCollector no arquivo YAML em 1. Modificar a configuração YAML do pod de service. Deve ser uma correspondência exata. Caso contrário, a associação falhará.
-
-
Para verificar o heartbeat de um grupo de máquinas, clique em no nome do grupo de máquinas recém-criado e localize a área de status do grupo de máquinas.
OK: Indica que o LoongCollector se conectou com êxito ao Simple Log Service e o grupo de máquinas está registrado.
-
FAIL:
A alteração de configuração pode levar até 2 minutos para ser aplicada. Atualize a página para verificar novamente.
Se o status ainda for FAIL após 2 minutos, consulte Solucionar problemas de grupos de máquinas do Logtail.
Cada Pod tem uma instância dedicada do LoongCollector. Recomendamos usar identificadores personalizados diferentes para aplicações ou ambientes distintos para garantir um gerenciamento granular.
FAQ
Como modifico a configuração do LoongCollector de um cluster gerenciado ACK para coletar logs entre contas ou regiões?
Como coleto logs de contêineres de clusters ACK Edge, ACK One, ACS e ACK Serverless?
Como modifico o parâmetro projectName do componente LoongCollector?
Próximas etapas
Após instalar o LoongCollector, consulte Diretrizes para coleta de logs de contêineres de um cluster Kubernetes para entender os princípios fundamentais, processos e melhores práticas para coleta de logs de contêineres. Em seguida, crie uma configuração de coleta usando um dos seguintes métodos:
Apêndice: Exemplos de YAML
Este exemplo mostra uma configuração completa de Deployment do Kubernetes que contém um contêiner de aplicação (Nginx) e um contêiner sidecar do LoongCollector. Use-a para coletar logs de contêineres no modo Sidecar.
Antes de usar a configuração, faça as seguintes substituições:
Substitua
${your_aliyun_user_id}pelo UID da sua conta do Alibaba Cloud.Substitua
${your_machine_group_user_defined_id}pelo ID personalizado do grupo de máquinas criado na Etapa 3. O ID deve ser uma correspondência exata.-
Substitua
${your_region_config}pelo nome da configuração que corresponde à região e ao tipo de rede do seu Project do Log Service (SLS).Exemplo: Se o seu Project estiver na região China (Hangzhou), use
cn-hangzhoupara acesso pela rede interna oucn-hangzhou-internetpara acesso pela rede pública.
Tarefas de curta duração (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
Serviços de longa duração (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