O LoongCollector é o agente de coleta de logs de última geração do SLS e sucessor do Logtail. Instale-o em um cluster Kubernetes usando o 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 SLS.
-
Obtenha o endpoint:
Faça login no console do Simple Log Service. Na lista de projetos, clique em o projeto de destino.
Clique em
ao lado do nome do projeto para abrir a página de visão geral do projeto.Na seção de endpoints, localize os endpoints públicos e privados da região do projeto.
-
Execute um teste de conectividade: Faça login em um nó do cluster e execute o comando
curla seguir. Substitua${PROJECT_NAME}e${SLS_ENDPOINT}pelos valores reais.curl https://${PROJECT_NAME}.${SLS_ENDPOINT} -
Verifique os resultados:
-
Se o comando retornar
{"Error":{"Code":"OLSInvalidMethod",...}}, a conexão de rede entre o nó e o Simple Log Service estará estabelecida.NotaEsse erro é esperado: o teste verifica apenas a conectividade de rede. O SLS retorna um erro porque a solicitação não possui os parâmetros de API obrigatórios.
Se o comando atingir o tempo limite ou retornar erros como
Connection refused, verifique a configuração de rede do nó, as regras do grupo de segurança e a resolução de DNS.
-
Escolher um método de instalação
Selecione um método com base no tipo do cluster.
|
Método de instalação |
Casos de uso |
|
Coleta de logs de clusters ACK gerenciados e dedicados na mesma conta e região da Alibaba Cloud. |
|
|
|
|
Coleta de logs de aplicações específicas com os seguintes requisitos:
|
Instalar em um cluster ACK (modo DaemonSet)
Se estiver atualizando do logtail-ds, desinstale-o antes de instalar o LoongCollector.
Instale o LoongCollector com um clique em console do ACK. Por padrão, ele coleta logs de contêineres em um projeto na mesma conta e região. Para coleta entre contas ou entre regiões, consulte Instalar em um cluster autogerenciado (modo DaemonSet).
Cluster ACK existente
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em nome do 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 SLS cria automaticamente os seguintes recursos na região do cluster. Você pode visualizá-los no console do Simple Log Service.
Tipo
Parâmetro
Descrição
Projeto
k8s-log-${cluster_id}Unidade de gerenciamento de recursos que isola logs de diferentes serviços.
Grupo de máquinas
k8s-group-${cluster_id}Grupo de máquinas para coleta de logs do loongcollector-ds.
k8s-group-${cluster_id}-clusterGrupo de máquinas para coleta de métricas do loongcollector-cluster.
k8s-group-${cluster_id}-singletonGrupo de máquinas para coleta de instância única.
ImportanteO LoongCollector não cria um LogStore chamado config-operation-log. Se esse LogStore já existir, o LoongCollector não gravará dados nele.
Novo cluster ACK
Faça login 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 e selecione Create New Project ou Use Existing Project.
Este tópico aborda apenas as configurações relacionadas ao SLS. Outras configurações do cluster estão documentadas em Criar um cluster ACK gerenciado .
-
Se você selecionar Create Project, o SLS criará automaticamente os seguintes recursos. Visualize-os no console do Simple Log Service.
Tipo
Parâmetro
Descrição
Projeto
k8s-log-${cluster_id}Unidade de gerenciamento de recursos que isola logs de diferentes serviços.
Grupo de máquinas
k8s-group-${cluster_id}Grupo de máquinas para coleta de logs do loongcollector-ds.
k8s-group-${cluster_id}-clusterGrupo de máquinas para coleta de métricas do loongcollector-cluster.
k8s-group-${cluster_id}-singletonGrupo de máquinas para coleta de instância única.
ImportanteO LoongCollector não cria um LogStore chamado config-operation-log. Se esse LogStore já existir, o LoongCollector não gravará dados nele.
Instalar em um cluster autogerenciado (modo DaemonSet)
Casos de uso
Clusters Kubernetes em data centers autogerenciados
Clusters Kubernetes implantados em outros provedores de nuvem
Coleta de logs de contêineres de clusters ACK da Alibaba Cloud em diferentes contas ou regiões
Certifique-se de que o cluster autogerenciado execute o Kubernetes 1.6 ou posterior.
Procedimento
-
Baixe e extraia o pacote de instalação: em uma máquina com kubectl configurado, execute o comando correspondente à região do 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 -
Edite values.yaml: no diretório
loongcollector-custom-k8s-package, edite./loongcollector/values.yaml.Descrição
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(Obrigatório)Nome do projeto para o qual o LoongCollector envia logs. As convenções de nomenclatura são:
-
O nome do projeto pode 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 dígito.
-
O nome deve ter entre 3 e 63 caracteres.
region
String(Obrigatório)ID da região onde o projeto está localizado. Para obter uma lista de IDs de região, consulte Regiões.
aliUid
String(Obrigatório)ID da conta da Alibaba Cloud proprietária do projeto.
net
String(Obrigatório)Tipo de rede usado para transmissão de dados de log.
-
Internet (padrão): rede pública.
-
Intranet: rede interna.
accessKeyID
String(Obrigatório)AccessKey ID da conta proprietária do projeto. Para maior segurança, use o AccessKey de um usuário RAM com a política AliyunLogFullAccess. Visão geral do usuário RAM.
accessKeySecret
String(Obrigatório)AccessKey secret correspondente ao AccessKey ID especificado.
clusterID
String(Obrigatório)ID personalizado para o cluster. O ID pode 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.bash k8s-custom-install.sh install -
Verifique a instalação: execute o seguinte comando para verificar o status dos componentes:
# 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 componente falhar ao iniciar (status diferente de Running):
Verifique os parâmetros em
values.yaml.-
Verifique a imagem: execute o seguinte comando e confira a seção
Eventspara confirmar se a imagem foi baixada.kubectl describe pod loongcollector-ds -n kube-system
-
Após a instalação, o SLS cria automaticamente os seguintes recursos. Visualize-os no console do Simple Log Service.
Tipo de recurso
Nome do recurso
Finalidade
Projeto
O
projectNameespecificado no arquivovalues.yamlUnidade de gerenciamento de recursos que isola logs de diferentes serviços.
Grupo de máquinas
k8s-group-${cluster_id}Grupo de nós 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 de instância única para coleta de instância única.
ImportanteO LoongCollector não cria um Logstore chamado config-operation-log. Se esse Logstore já existir, o LoongCollector interromperá a gravação nele.
Instalar no modo sidecar
Use o modo sidecar para gerenciamento granular de logs, isolamento multilocatário ou coleta de logs acoplada ao ciclo de vida. Um contêiner dedicado do LoongCollector é injetado em cada pod da aplicação. Para testar o processo, utilize o Apêndice: Exemplo de YAML.
1. Modificar 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 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. Adaptar a lógica de 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. Definir o período de tolerância de encerramento
Em spec.template.spec, defina um período de tolerâ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 da 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 projeto. |
|
|
Configuração correspondente à região e ao tipo de acesso à rede do seu projeto SLS. Regiões de serviço. Exemplo: se o projeto 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. Aplicar configuração e verificar
-
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 sucesso:
kubectl describe pod <YOUR-POD-NAME>Se houver dois contêineres (o contêiner da aplicação e
loongcollector) e o status deles for Running, a injeção foi bem-sucedida.
6. Criar um grupo de máquinas com identificador personalizado
Faça login no console do Simple Log Service e clique em projeto de destino.
No painel 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 pode ser modificado após a criação. As convenções de nomenclatura são:
Pode conter apenas letras minúsculas, dígitos, hifens (-) e sublinhados (_).
Deve começar e terminar com uma letra minúscula ou 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 em 1. Modificar a configuração YAML do Pod de serviço. O valor deve ser uma correspondência exata, caso contrário, a associação falhará.
-
-
Após a criação do grupo de máquinas, verifique o status de heartbeat clicando em nome do grupo e visualizando a área de status.
OK: o LoongCollector conectou-se com sucesso ao Simple Log Service e registrou o grupo de máquinas.
-
FAIL:
A configuração leva cerca de 2 minutos para ser aplicada. Atualize a página após uma breve espera.
Se ainda estiver FAIL após 2 minutos, consulte Solucionar problemas de grupos de máquinas do Logtail.
Cada pod executa sua própria instância do LoongCollector. Use um identificador personalizado exclusivo por aplicação ou ambiente para gerenciamento granular.
FAQ
Coleta entre contas ou entre regiões
Coleta de logs para outros clusters
Próximas etapas
Após instalar o LoongCollector, revise Coletar logs de contêineres de um cluster Kubernetes para conceitos principais e melhores práticas e, em seguida, crie uma configuração de coleta:
Apêndice: Exemplos de YAML
Configurações YAML completas para um Job do Kubernetes e um Deployment com um contêiner sidecar do LoongCollector.
Antes de começar, substitua os três espaços reservados a seguir:
Substitua
${your_aliyun_user_id}pelo UID da sua conta da 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 projeto Log Service (SLS).Por exemplo, para um projeto na região China (Hangzhou), use
cn-hangzhoupara acesso à rede interna oucn-hangzhou-internetpara acesso à 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