¿Cómo puedo rastrear el ID de instancia de un nodo de trabajo de Amazon EKS terminado a partir de su nombre de nodo?

7 minutos de lectura
0

Un incidente interrumpió los nodos de trabajo de mi clúster de Amazon EKS y quiero que los nombres de los nodos terminados se correspondancon su ID de instancia.

Descripción breve

En Amazon EKS, el nombre de un nodo se registra y se muestra con un PrivateDnsName (nombre de DNS privado). Este nombre sigue un formato similar a ip-172-31-6-187.eu-west-1.compute.internal.

Se puede usar el nombre de un nodo para encontrar su ID de instancia. Sin embargo, el comando predeterminado kubectl get nodes no devuelve el ID de instancia en su salida. Observe la siguiente salida de ejemplo:

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 el ID de instancia de los nodos de trabajo activos, agregue columnas adicionales como se muestra en el siguiente comando:

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

Obtendrá un resultado similar al siguiente:

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

Sin embargo, este comando no funciona para los nodos que están terminados.

También puede usar TerminateInstances o TerminateInstanceInAutoScalingGroup como EventName (Nombre de evento) en AWS CloudTrail para devolver el ID de la instancia. Sin embargo, estos comandos por sí solos no devuelven el nombre de un nodo de Amazon EKS.

Por lo tanto, primero se debe ejecutar un comando independiente para recuperar el NodeName (Nombre de nodo) del nodo (privateDNSName). A continuación, debe usarse ese nombre para rastrear el ID de instancia del nodo. Para encontrar el ID de instancia de los nodos de trabajo finalizados anteriormente, busque en los registros del plano de control de Amazon EKS con la información de registros de Amazon CloudWatch. Para ello, debe activar el registro del plano de control antes de la terminación del nodo. Si no tiene activado el registro del plano de control, utilice CloudTrail.

Resolución

Nota: Si se producen errores cuando ejecuta los comandos de la interfaz de la línea de comandos de AWS (AWS CLI), asegúrese de estar utilizando la versión más reciente de AWS CLI.

Recuperación del NodeName de los nodos

Para los dos métodos siguientes, debe conocer el NodeName de un nodo terminado para recuperar su ID de instancia. Para recuperar una lista de los nodos de Amazon EKS terminados de un intervalo de tiempo determinado, utilice el editor de consultas de la información de registros de CloudWatch:

1.    Abra la consola de CloudWatch.

2.    En el panel de navegación, elija Logs (Registros) y, a continuación, Logs Insights (Información de registros).

Nota: En la página Logs Insights, el editor de consultas contiene una consulta predeterminada que devuelve los 20 eventos de registro más recientes.

3.    Elimine la consulta predeterminada. A continuación, ingrese el siguiente 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.    En la lista desplegable Select log group(s) (Seleccione grupos de registro), elija los grupos de registros de clústeres de Amazon EKS que desee consultar.

Nota: El grupo de registro tiene un aspecto similar a /aws/eks/cluster_name/cluster. En este ejemplo, sustituya cluster_name por su nombre de clúster de Amazon EKS.

5.    Utilice el selector time interval (intervalo de tiempo) para seleccionar el período de tiempo que desee consultar.

6.    Seleccione Run query (Ejecutar consulta) para ver los resultados.

Obtendrá un resultado similar al siguiente:

# @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

Utilice la información de registros de CloudWatch para hacer búsquedas en los registros del plano de control de Amazon EKS

Utilice la información de registros de CloudWatch para hacer búsquedas en los datos de registro del plano de control de Amazon EKS de los eventos que registraron el nombre del nodo. Para ver estos registros en los registros de Amazon CloudWatch, debe activar el registro del plano de control de Amazon EKS antes de la terminación del nodo, que debe permanecer activado.

Por ejemplo, supongamos que desea recuperar el ID de instancia de un nodo con el nombre ip-192-168-132-83.eu-west-1.compute.internal. La fecha de finalización de este nodo fue hace cuatro días. Puede usar una de las dos consultas para recuperar el ID de instancia del NodeName.

Primero, siga estos pasos para ejecutar una consulta de la información de registros de CloudWatch:

1.    Abra la consola de CloudWatch.

2.    En el panel de navegación, elija Logs (Registros) y, a continuación, Logs Insights (Información de registros).

Nota: En la página Logs Insights, el editor de consultas contiene una consulta predeterminada que devuelve los 20 eventos de registro más recientes.

3.    Elimine la consulta predeterminada. A continuación, ingrese una de las siguientes consultas para recuperar el ID de instancia del 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.    En la lista desplegable Select log group(s) (Seleccione grupos de registro), elija los grupos de registros de clústeres de Amazon EKS que desee consultar.

Nota: El grupo de registro tiene un aspecto similar a /aws/eks/cluster_name/cluster. En este ejemplo, sustituya cluster_name por su nombre de clúster de Amazon EKS.

5.    Utilice el selector time interval (intervalo de tiempo) para seleccionar el período de tiempo que desee consultar.

6.    Seleccione Run query (Ejecutar consulta) para ver los resultados.

Recibirá un resultado basado en la consulta que ejecutó.

La consulta 1 obtendrá un resultado similar al siguiente:

# @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

La consulta 2 obtendrá un resultado similar al siguiente:

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

Utilice las llamadas a la API como eventos en CloudTrail

Puedes recuperar el ID de instancia de un nodo a partir de su NodeName con una combinación de llamadas a la API en CloudTrail. Utilice RunInstances (ejecutar instancias) y TerminateInstances (finalizar instancias) como EventName (nombre del evento). Estas llamadas a la API hacen lo siguiente:

TerminateInstances: recupera todos los ID de instancia del momento del incidente que las finalizó. Contiene solo el ID de la instancia.

RunInstances: contiene tanto el ID de la instancia como el NodeName.

En primer lugar, utilice el siguiente comando para ver todos los nodos de trabajo terminados durante el período de tiempo del incidente que desee auditar. Sustituya los valores start-time (hora de inicio) de end-time (hora de fin) para establecer el marco temporal correspondiente:

% 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}'

Obtendrá un resultado similar al siguiente:

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

Utilice el siguiente comando para recuperar el resultado de la llamada a RunInstances API (ejecución de instancias API) durante el período de tiempo del incidente que desee auditar. Sustituya los valores start-time (hora de inicio) de end-time (hora de fin) para establecer el marco temporal correspondiente:

% 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}'

Nota: Para obtener la información más completa, establezca la start-time en el momento en que se crearon los nodos de trabajo.

Obtendrá un resultado similar al siguiente:

{
  "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"
}

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año