O arms-obi é um agente DaemonSet do Kubernetes que descobre e coleta dados de pprof do Go nos Pods de aplicação em cada nó e os envia ao Cloud Monitor para profiling contínuo por meio do ARMS Profiling.
Principais recursos
Descobre automaticamente Pods no nó atual que expõem uma interface pprof.
Coleta cinco tipos de perfil: CPU, heap, goroutine, mutex e block.
Disponibiliza um endpoint de verificação de integridade para as sondas de liveness e readiness do Kubernetes.
Coleta dados simultaneamente de mais de 50 Pods por nó.
Pré-requisitos
Cluster Kubernetes versão 1.26 ou posterior.
Os Pods da aplicação devem expor a interface HTTP
net/http/pprof.Os containers do Pod da aplicação devem ter uma variável de ambiente que especifique a porta do pprof. A variável padrão é
ILOGTAIL_PROFILE_PORT, alterável na configuração de valores (values).
Integrar sua aplicação
Seu service em Go deve expor a interface HTTP do pprof e definir uma variável de ambiente de porta no container correspondente. Ignore esta seção se ambos já estiverem configurados.
Integração de código
No pacote main do service Go, importe net/http/pprof e inicie um servidor HTTP separado:
import _ "net/http/pprof"
func main() {
// Start the pprof server on a separate port to avoid conflicts with the business port.
go func() {
http.ListenAndServe(":6060", nil)
}()
// ... business logic
}
Variáveis de ambiente do container
Na especificação do container do Pod da aplicação, defina a variável de ambiente da porta do pprof. O nome da variável tem como padrão ILOGTAIL_PROFILE_PORT e é configurável no arquivo values:
containers:
- name: myapp
env:
- name: ILOGTAIL_PROFILE_PORT # Must match the port_env_name configured in arms-obi
value: "6060"
O arms-obi lê essa variável de ambiente para determinar a porta de destino.
Implantação
Cluster ACK
Faça login no console do Container Service for Kubernetes (ACK). No painel de navegação à esquerda, selecione Cluster List e clique em no nome do cluster desejado.
No painel de navegação à esquerda, selecione Components, localize o componente
arms-obi, defina installMode como profiling e clique em em Install.Por padrão, o agente coleta dados dos Pods com a variável de ambiente
ILOGTAIL_PROFILE_PORTdefinida e usa o valor do rótuloappcomo nome da aplicação. Para personalizar, modifique a configuração do coletor na seção profiling durante a instalação. Para mais informações sobre os parâmetros, consulte Collector configuration.
Cluster externo
-
Execute o comando
wgeta seguir para baixe o pacote de instalação do arms-obi.wget 'https://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/app/charts-incubator/arms-obi-0.9.3.tgz' -
Extraia o pacote de instalação do arms-obi com o comando abaixo.
tar xvf arms-obi-0.9.3.tgz -
Edite o arquivo values.yaml no pacote de instalação. Modifique os parâmetros a seguir e salve o arquivo.
ImportanteCertifique-se de que sua conta principal do Alibaba cloud tenha as permissões AliyunARMSFullAccess e AliyunSTSAssumeRoleAccess.
workspace: default-cms-__ACK_UID__-__ACK_REGION_ID__ registry: registry-__ACK_REGION_ID__.ack.aliyuncs.com/acs/ cluster_id: __ACK_CLUSTER_ID__ accessKey: __ACCESSKEY__ accessKeySecret: __ACCESSKEY_SECRET__ uid: "__ACK_UID__" region_id: __ACK_REGION_ID__ installMode: profilingworkspace: Substitua __ACK_UID__ pelo UID da sua conta principal do Alibaba cloud e __ACK_REGION_ID__ pelo ID da região onde deseja reportar os dados.registry: Endereço do repositório de imagens do arms-obi. O arms-obi inclui três imagens. Se o cluster não tiver acesso à rede pública, sincronize-as para o repositório interno:registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:obi-app-update-0.9.3 registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:init-0.9.3 registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:pprof-agent-0.9.3cluster_id: ID personalizado para o cluster Kubernetes. Deve ser único.accessKeyeaccessKeySecret: AccessKey ID e AccessKey Secret da conta principal do Alibaba cloud. Para mais informações, consulte Create an AccessKey pair.uid: ID da conta principal do Alibaba cloud. Encontre essa informação passando o mouse sobre a foto de perfil no canto superior direito do console do Alibaba cloud.region_id: ID da região do Alibaba cloud. Para verificar as regiões suportadas, consulte Supported regions.installMode: Defina comoprofiling. -
Instale o arms-obi executando o comando abaixo fora do diretório do pacote de instalação.
helm3 upgrade --install arms-obi arms-obi --namespace obi-system --create-namespace
Configuração
Configuração do coletor
|
Campo |
Tipo |
Padrão |
Descrição |
|
profiles |
[ ]string |
Todos os 5 tipos |
Tipos de perfil permitidos. Valores válidos: cpu, heap, goroutine, mutex e block. |
|
interval |
int |
30 |
Intervalo de coleta em segundos. |
|
timeout |
int |
30 |
Tempo limite para uma única requisição HTTP em segundos. |
|
max_body_size |
int |
10240 |
Tamanho máximo de um único corpo de resposta em KB. Respostas maiores são descartadas. |
|
cpu_duration |
int |
10 |
Duração da amostragem do perfil de CPU em segundos. Este valor deve ser menor que |
|
port_env_name |
string |
ILOGTAIL_PROFILE_PORT |
Nome da variável de ambiente no container que especifica a porta do pprof. |
|
pprof_path |
string |
/debug/pprof |
Prefixo do caminho para o endpoint HTTP do pprof. |
As URLs de coleta de perfil seguem este padrão: http://<podIP>:<port><pprof_path>/<profile>
|
Tipo de perfil |
Caminho da URL |
Observações |
|
cpu |
/profile?seconds=<cpu_duration> |
Duração da coleta = cpu_duration segundos |
|
heap |
/heap |
Coleta instantânea |
|
goroutine |
/goroutine |
Coleta instantânea |
|
mutex |
/mutex |
Coleta instantânea |
|
block |
/block |
Coleta instantânea |
Configuração de filtro
Controla de quais Pods os dados serão coletados. Todas as condições combinam-se com AND; itens dentro de uma lista de permissões combinam-se com OR.
|
Campo |
Tipo |
Padrão |
Descrição |
|
namespace |
string |
"" |
Expressão regular para corresponder ao namespace do Pod. Se vazio, nenhum filtro é aplicado. |
|
pod_name |
string |
"" |
Expressão regular para corresponder ao nome do Pod. Se vazio, nenhum filtro é aplicado. |
|
label_whitelist |
[ ]LabelKV |
[ ] |
Rótulos de Pod permitidos. Um Pod é selecionado se possuir qualquer um destes rótulos. |
|
label_blacklist |
[ ]LabelKV |
[ ] |
Rótulos de Pod bloqueados. Um Pod é excluído se possuir qualquer um destes rótulos. |
|
env_whitelist |
[ ]LabelKV |
[ ] |
Variáveis de ambiente de container permitidas. Um Pod é selecionado se qualquer container definir uma dessas variáveis. |
|
env_blacklist |
[ ]LabelKV |
[ ] |
Variáveis de ambiente de container bloqueadas. Um Pod é excluído se qualquer container definir uma dessas variáveis. |
Formato LabelKV: {key: "app", value: "myservice"}. Se o valor estiver vazio, o agente verifica apenas a existência da chave.
O pipeline de filtros executa nesta ordem:
Filtragem de nó: Coleta apenas dos Pods no nó atual (automático).
Fase do Pod: Mantém apenas Pods na fase Running com endereço IP atribuído.
Filtragem por expressão regular:
namespace/pod_name.Lista de permissões de rótulos → Lista de bloqueios de rótulos.
Lista de permissões de variáveis de ambiente → Lista de bloqueios de variáveis de ambiente.
Resolução de porta: Lê o valor da porta da variável de ambiente do container especificada por
port_env_name.
Configuração do ARMS
|
Campo |
Tipo |
Padrão |
Descrição |
|
arms.license_key |
string |
app |
Chave do rótulo do Pod cujo valor é usado como nome da aplicação ARMS (appName). |
Atualizar a configuração
Faça login no console do Container Service for Kubernetes (ACK). No painel de navegação à esquerda, selecione Cluster List e clique em no nome do cluster desejado.
No painel de navegação à esquerda, selecione Components, localize o componente
arms-obi, clique em em Configure e modifique a configuração do coletor de profiling.
Visualize dados de profiling
Acesse o console do Cloud Monitor, selecione o workspace desejado e, no painel de navegação à esquerda, clique em em Application Monitoring.
Localize a aplicação com o nome definido durante a implantação. Clique em em Application Diagnostics para visualize os tipos de perfil. Também é possível baixe arquivos de perfil para análise local com o pprof.
Perguntas frequentes
Logs do agente mostram "arms sts not ready yet"
O agente falhou ao obter uma credencial STS do ARMS.
Verifique se a rede do cluster acessa a API de metadados do ARMS em
<region_id>-intranet-arms.aliyuncs.com.Use
kubectl logspara visualize mensagens de erro detalhadas.
Nenhum Pod foi descoberto
Verifique a configuração de filtro:
Confirme se a variável de ambiente especificada por
port_env_name(padrão: ILOGTAIL_PROFILE_PORT) está definida nos containers do Pod da aplicação.Valide se as expressões regulares para
namespace/pod_namee as configurações de lista de permissões e bloqueios de rótulos e variáveis de ambiente no seletor estão corretas.Consulte o campo
pod_countnos logs do agente para ver quantos Pods foram descobertos.
Falha na coleta
Causas comuns:
O Pod da aplicação não expõe a interface pprof. Confirme a importação de
_ "net/http/pprof"e o início do service HTTP.A porta do pprof não corresponde à porta configurada na variável de ambiente
port_env_name.O
pprof_pathnão corresponde ao prefixo de caminho do service.Uma política de rede bloqueia a conexão HTTP do Pod do agente para o Pod da aplicação.
Falha no upload
Causas comuns:
O endpoint privado da VPC está inacessível.
A credencial STS do ARMS expirou. O agente renova a credencial automaticamente. Verifique nos logs se há erros de renovação do STS.