NodeName으로 종료된 Amazon EKS 워커 노드의 인스턴스 ID를 추적하려면 어떻게 해야 하나요?

5분 분량
0

실수로 Amazon EKS 클러스터의 워커 노드가 종료되었습니다. 종료된 노드의 이름을 인스턴스 ID와 일치시키고 싶습니다.

간략한 설명

Amazon EKS에서는 PrivateDnsName을 사용하여 노드 이름이 기록되고 표시됩니다. 이 이름은 ip-172-31-6-187.eu-west-1.compute.internal과 유사한 형식을 따릅니다.

노드 이름을 사용하여 인스턴스 ID를 찾을 수 있습니다. 하지만 기본 kubectl get nodes 명령은 출력에 인스턴스 ID를 반환하지 않습니다. 다음 예시 출력을 참조하세요.

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

활성 워커 노드의 인스턴스 ID를 검색하려면 다음 명령에 표시된 대로 열을 추가합니다.

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

그러면 다음과 유사한 출력이 표시됩니다.

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

그러나 이 명령은 종료된 노드에서는 작동하지 않습니다.

또한 TerminateInstances 또는 TerminateInstanceInAutoScalingGroup을 AWS CloudTrail의 EventName으로 사용하여 인스턴스 ID를 반환할 수 있습니다. 하지만 이러한 명령 자체로는 Amazon EKS 노드의 이름을 반환하지 않습니다.

따라서 먼저 별도의 명령을 실행하여 노드의 NodeName(PrivateDnsName)을 검색해야 합니다. 그런 다음 해당 이름을 사용하여 노드의 인스턴스 ID를 추적합니다. 이전에 종료된 워커 노드의 인스턴스 ID를 찾으려면 Amazon CloudWatch 로그 인사이트를 사용하여 Amazon EKS 컨트롤 플레인 로그를 통해 검색합니다. 이렇게 하려면 노드 종료 전에 컨트롤 플레인 로깅을 활성화해야 합니다. 컨트롤 플레인 로깅을 활성화하지 않은 경우 CloudTrail을 사용합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

노드의 NodeName 검색

다음 두 가지 방법 모두 종료된 노드의 NodeName을 알아야 인스턴스 ID를 검색할 수 있습니다. 지정된 시간 범위에서 종료된 Amazon EKS 노드 목록을 검색하려면 CloudWatch 로그 인사이트 쿼리 편집기를 사용합니다.

1.    CloudWatch 콘솔을 엽니다.

2.    탐색 창에서 로그를 선택한 다음 로그 인사이트를 선택합니다.

참고: 로그 인사이트 페이지의 쿼리 편집기에는 가장 최근의 로그 이벤트 20개를 반환하는 기본 쿼리가 포함되어 있습니다.

3.    기본 쿼리를 삭제합니다. 그런 후 다음 명령을 입력합니다.

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.    로그 그룹 선택 드롭다운 목록에서 쿼리하려는 Amazon EKS 클러스터 로그 그룹을 선택합니다.

참고: 로그 그룹은 /aws/eks/cluster_name/cluster와 유사하게 표시됩니다. 이 예에서는 cluster_name을 자체 Amazon EKS 클러스터 이름으로 바꿉니다.

5.    시간 간격 선택기를 사용하여 쿼리하려는 기간을 선택합니다.

6.    실행을 선택하여 결과를 봅니다.

그러면 다음과 유사한 출력이 표시됩니다.

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

CloudWatch 로그 인사이트를 사용하여 Amazon EKS 컨트롤 플레인 로그 검색

CloudWatch 로그 인사이트를 사용하면 Amazon EKS 컨트롤 플레인 로그 데이터에서 노드의 NodeName을 기록한 이벤트를 검색할 수 있습니다. Amazon CloudWatch Logs에서 이러한 로그를 보려면 노드 종료 전에 Amazon EKS 컨트롤 플레인 로깅을 활성화하고 활성화된 상태로 유지해야 합니다.

예를 들어 이름이 ip-192-168-132-83.eu-west-1.compute.internal인 노드의 인스턴스 ID를 검색하려고 한다고 가정해 보겠습니다. 이 노드의 종료 날짜는 4일 전이었습니다. 두 쿼리 중 하나를 사용하여 NodeName으로 인스턴스 ID를 검색할 수 있습니다.

먼저 다음 단계에 따라 CloudWatch Logs 인사이트 쿼리를 실행합니다.

1.    CloudWatch 콘솔을 엽니다.

2.    탐색 창에서 로그를 선택한 다음 로그 인사이트를 선택합니다.

참고: 로그 인사이트 페이지의 쿼리 편집기에는 가장 최근의 로그 이벤트 20개를 반환하는 기본 쿼리가 포함되어 있습니다.

3.    기본 쿼리를 삭제합니다. 그런 후 다음 쿼리 중 하나를 입력하여 NodeName으로 인스턴스 ID를 검색합니다.

쿼리 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

쿼리 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.    로그 그룹 선택 드롭다운 목록에서 쿼리하려는 Amazon EKS 클러스터 로그 그룹을 선택합니다.

참고: 로그 그룹은 /aws/eks/cluster_name/cluster와 유사하게 표시됩니다. 이 예에서는 cluster_name을 자체 Amazon EKS 클러스터 이름으로 바꿉니다.

5.    시간 간격 선택기를 사용하여 쿼리하려는 기간을 선택합니다.

6.    실행을 선택하여 결과를 봅니다.

실행한 쿼리를 기반으로 출력이 표시됩니다.

쿼리 1은 다음과 유사한 출력을 반환합니다.

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

쿼리 2는 다음과 유사한 출력을 반환합니다.

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

API 호출을 CloudTrail에서 이벤트로 사용

CloudTrail의 API 호출 조합을 사용하여 NodeName으로 노드의 인스턴스 ID를 검색할 수 있습니다. RunInstancesTerminateInstances를 모두 EventName으로 사용합니다. 이러한 API 호출은 다음과 같은 작업을 수행합니다.

TerminateInstances: 인스턴스가 종료된 인시던트 시점의 모든 인스턴스 ID를 검색합니다. 여기에는 인스턴스 ID만 포함됩니다.

RunInstances: 여기에는 인스턴스 ID와 NodeName이 모두 포함됩니다.

먼저 다음 명령을 사용하여 감사하려는 인시던트의 기간의 종료된 모든 워커 노드를 확인합니다. start-timeend-time 값을 대체하여 관련 기간을 설정합니다.

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

그러면 다음과 유사한 출력이 표시됩니다.

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

다음 명령을 사용하여 감사하려는 인시던트가 발생한 기간 동안 RunInstances API 호출 결과를 검색할 수 있습니다. start-timeend-time 값을 대체하여 관련 기간을 설정합니다.

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

참고: 가장 완전한 정보를 얻으려면 start-time을 워커 노드 생성 시점으로 설정하세요.

그러면 다음과 유사한 출력이 표시됩니다.

{
  "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 공식
AWS 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠