Como faço para rastrear o ID da instância de um nó de processamento encerrado do Amazon EKS pelo seu NodeName?

7 minuto de leitura
0

Um incidente encerrou os nós de processamento no meu cluster do Amazon EKS e quero combinar os nomes dos nós encerrados com o ID da instância.

Breve descrição

No Amazon EKS, o nome de um nó é registrado e exibido usando seu PrivateDnsName. Esse nome segue um formato semelhante a ip-172-31-6-187.eu-west-1.compute.internal.

Você pode usar o nome de um nó para encontrar seu ID de instância. No entanto, o comando kubectl get nodes padrão não retorna o ID da instância na sua saída. Veja o seguinte exemplo de saída:

NAME                                           STATUS   ROLES    AGE   VERSION
ip-192-168-132-83.eu-west-1.compute.internal   Ready    <none>   37m   v1.22.12-eks-ba74326
ip-192-168-96-83.eu-west-1.compute.internal    Ready    <none>   37m   v1.22.12-eks-ba74326

Para recuperar o ID da instância dos nós de processamento ativos, adicione colunas extras como mostra o comando a seguir:

kubectl get nodes -o custom-columns=Name:.metadata.name,Instance:.spec.providerID

Você receberá um resultado semelhante ao descrito abaixo:

Name                                            Instance
ip-192-168-104-154.eu-west-1.compute.internal   aws:///eu-west-1a/i-0cb3f1ceeb038fb6c
ip-192-168-157-89.eu-west-1.compute.internal    aws:///eu-west-1b/i-02e80d4889b6ccffa

No entanto, esse comando não funciona para nós encerrados.

Você também pode usar TerminateInstances ou TerminateInstanceInAutoScalingGroup como o EventName no AWS CloudTrail para retornar o ID da instância. No entanto, esses comandos por si só não retornam o nome de um nó do Amazon EKS.

Portanto, primeiro você deve executar um comando separado para recuperar o NodeName de um nó (PrivateDnsName). Em seguida, use esse nome para rastrear o ID da instância do nó. Para encontrar o ID da instância de nós de processamento encerrados anteriormente, pesquise nos logs do ambiente de gerenciamento do Amazon EKS com o Amazon CloudWatch Logs Insights. Para fazer isso, você deve ativar o registro do ambiente de gerenciamento antes do encerramento do nó. Se não tiver o registro do plano de controle ativado, use o CloudTrail.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de que está usando a versão mais recente da AWS CLI.

Recupere o NodeName dos seus nós

Para os dois métodos a seguir, você deve saber o NodeName de um nó encerrado para recuperar seu ID de instância. Para recuperar uma lista de nós encerrados do Amazon EKS de um determinado intervalo de tempo, use o CloudWatch Log Insight Query Editor:

1.    Abra o console do CloudWatch.

2.    No painel de navegação, escolha Logs e Logs Insights.

Observação: na página Logs Insights, o editor de consultas contém uma consulta padrão que retorna os 20 eventos de registro mais recentes.

3.    Exclua a consulta padrão. Em seguida, insira o seguinte comando:

fields @timestamp, objectRef.name as NodeName
| filter @logStream like /^kube-apiserver-audit/
| filter objectRef.resource = "nodes"
| filter responseStatus.code = 200 or responseStatus.code = 201
| sort @timestamp desc
| filter verb like /delete/

4.    Na lista suspensa Selecionar grupo(s) de logs, escolha os grupos de logs de cluster do Amazon EKS que você deseja consultar.

Observação: seu grupo de logs é semelhante a /aws/eks/cluster_name/cluster. Neste exemplo, substitua cluster_name pelo seu próprio nome de cluster do Amazon EKS.

5.    Use o seletor de intervalo de tempo para selecionar um período de tempo que você deseja consultar.

6.    Escolha Run (Executar) para ver os resultados.

Você receberá um resultado semelhante ao descrito abaixo:

# @timestamp                    NodeName                                     
1 2023-01-23T08:03:03.062+00:00 ip-192-168-132-83.eu-west-1.compute.internal 
2 2023-01-23T19:03:41.848+00:00 ip-192-168-0-141.eu-west-1.compute.internal

Usar o CloudWatch Logs Insights para pesquisar logs de ambiente de gerenciamento do Amazon EKS

Use o CloudWatch Logs Insights para pesquisar nos dados de log do ambiente de gerenciamento do Amazon EKS em busca de eventos que registraram o NodeName de um nó. Para visualizar esses registros no Amazon CloudWatch Logs, você deve ativar o registro em log do ambiente de gerenciamento do Amazon EKS antes do encerramento do nó, e ele deve permanecer ativado.

Por exemplo, suponha que você queira recuperar o ID da instância de um nó com o nome ip-192-168-132-83.eu-west-1.compute.internal. A data de término desse nó foi há quatro dias. Você pode usar qualquer uma das duas consultas para recuperar o ID da instância de NodeName.

Primeiro, siga estas etapas para executar uma consulta do CloudWatch Logs Insights:

1.    Abra o console do CloudWatch.

2.    No painel de navegação, escolha Logs e Logs Insights.

Observação: na página Logs Insights, o editor de consultas contém uma consulta padrão que retorna os 20 eventos de registro mais recentes.

3.    Exclua a consulta padrão. Em seguida, insira uma das seguintes consultas para recuperar o ID da instância do NodeName:

Consulta 1

fields @timestamp, objectRef.name as NodeName, responseObject.spec.providerID as providerID
| filter @message like 'ip-192-168-132-83.eu-west-1.compute.internal' and @message like 'i-'
| sort responseObject.spec.providerID desc
| limit 10

Consulta 2

fields @timestamp, objectRef.name as NodeName, user.extra.sessionName.0 as ID
| filter @message like 'ip-192-168-132-83.eu-west-1.compute.internal' and @message like 'i-'
| sort user.extra.sessionName.0 desc
| limit 5

4.    Na lista suspensa Selecionar grupo(s) de logs, escolha os grupos de logs de cluster do Amazon EKS que você deseja consultar.

Observação: seu grupo de logs é semelhante a /aws/eks/cluster_name/cluster. Neste exemplo, substitua cluster_name pelo seu próprio nome de cluster do Amazon EKS.

5.    Use o seletor de intervalo de tempo para selecionar um período de tempo que você deseja consultar.

6.    Escolha Run (Executar) para ver os resultados.

Você recebe uma saída com base na consulta que executou.

Consulta 1 retorna uma saída semelhante à seguinte:

# @timestamp                    NodeName                                     providerID
1 2023-01-23T08:03:03.062+00:00 ip-192-168-132-83.eu-west-1.compute.internal aws:///eu-west-1a/i-06c893718d4123396

Consulta 2 retorna uma saída semelhante à seguinte:

# @timestamp                    NodeName                                     ID
1 2023-01-22T15:00:32.637+00:00 ip-192-168-11-247.eu-west-1.compute.internal i-06c893718d4123396

Usar chamadas de API como eventos no CloudTrail

Você pode recuperar o ID da instância de um nó do seu NodeName com uma combinação de chamadas de API no CloudTrail. Use RunInstances e TerminateInstances como o EventName. Essas chamadas de API fazem o seguinte:

TerminateInstances: isso recupera todos os IDs de instância do momento do incidente que os encerrou. Isso contém somente o ID da instância.

RunInstances: contém o ID da instância e o NodeName.

Primeiro, use o comando a seguir para ver todos os nós de trabalho encerrados do período do incidente que você deseja auditar. Substitua os valores de hora de início e hora de término para definir seu período de tempo relevante:

% aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=EventName,AttributeValue=TerminateInstances AttributeKey=ResourceType,AttributeValue=AWS::EC2::Instance \
  --start-time "January 27, 2023, 00:00:00" \
  --end-time "January 27, 2023, 23:59:00" | jq '.Events [] | .CloudTrailEvent | fromjson | .responseElements | .instancesSet | .items | .[]? | {InstanceID: .instanceId, NodeName: .privateDnsName}'

Você receberá um resultado semelhante ao descrito abaixo:

{
  "InstanceID": "i-0926c5d4216fd934d",
  "NodeName": null
}
{
  "InstanceID": "i-00da28f580e28ff4f",
  "NodeName": null
}

Use o comando a seguir para recuperar o resultado da chamada da API RunInstances durante o período do incidente que você deseja auditar. Substitua os valores de hora de início e hora de término para definir seu período de tempo relevante:

% aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=EventName,AttributeValue=RunInstances AttributeKey=ResourceType,AttributeValue=AWS::EC2::Instance \
  --start-time "January 27, 2023, 00:00:00" \
  --end-time "January 27, 2023, 23:59:00" | jq '.Events [] | .CloudTrailEvent | fromjson | .responseElements | .instancesSet | .items | .[]? | {InstanceID: .instanceId, NodeName: .privateDnsName}'

Observação: para obter as informações mais completas, defina a hora de início para quando os nós de processamento foram criados.

Você receberá um resultado semelhante ao descrito abaixo:

{
  "InstanceID": "i-0926c5d4216fd934d",
  "NodeName": "ip-192-168-96-83.eu-west-1.compute.internal"
}
{
  "InstanceID": "i-00da28f580e28ff4f",
  "NodeName": "ip-192-168-132-83.eu-west-1.compute.internal"
}

AWS OFICIAL
AWS OFICIALAtualizada há um ano