Amazon EKS의 지표 서버를 사용하여 컨테이너, 포드 또는 노드에서 지표를 수집할 수 없는 이유는 무엇인가요?

7분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터의 Metrics Server를 사용하여 컨테이너, 포들 또는 노드에서 지표를 수집할 수 없습니다.

간단한 설명

Amazon EKS에서 Metrics Server는 기본적으로 설치되지 않습니다. 최근에 클러스터를 만들었는데 Metrics Server를 사용하여 지표를 수집할 수 없는 경우, 클러스터에 Metrics Server 애플리케이션을 배포했는지 확인하세요.

그래도 Metrics Server로 지표를 수집할 수 없는 경우 다음 섹션의 단계를 완료하세요.

  • 클러스터의 노드 및 포드에서 지표를 검색할 수 있는지 확인합니다.
  • APIService를 사용할 수 있고 요청을 처리할 수 있는지 확인합니다.
  • GitHub에서 일반적인 문제를 확인합니다.
  • 지표가 으(로) 표시되는 경우 수평적 포드 오토스케일러(HPA) 및 애플리케이션 리소스 요청을 확인합니다.<unknown>.

참고: Metrics Server는 애플리케이션 및 클러스터 성능의 장기 모니터링을 위한 모범 사례가 아닙니다. 장기 모니터링에 대해서는 Kubernetes 웹사이트에서 포드 및 컨테이너의 리소스 관리를 참조합니다. Kubernetes 커뮤니티는 Metrics Server를 유지 관리하고 GitHub 페이지에서 이슈를 보고합니다.

해결 방법

Metrics Server와 관련된 가장 일반적인 몇 가지 문제를 해결하려면 다음 단계를 참조하세요.

클러스터의 노드와 포드에서 지표를 검색할 수 있는지 확인합니다.

API 서버와 Metrics Server 간에 오류가 있는지 확인합니다. 클러스터의 노드와 포드에서 지표를 가져오려면 다음 명령을 실행합니다.

$ kubectl top nodes
$ kubectl top pods

두 명령 모두에서 오류가 발생하지 않으면 APIService가 사용 가능하고 요청을 처리할 수 있는지 확인 섹션을 참조하세요.

오류가 수신되면 수신된 오류에 따라 다음 섹션 중 하나의 단계를 완료합니다.

  • 서버에서 오류 발생(금지됨)
  • 서버에서 오류 발생(ServiceUnavailable)
  • 헤더를 기다리는 동안 Client.Timeout이 초과됨
  • 연결 거부

서버에서 오류 발생(금지됨)

이 오류 메시지는 RBAC 인증에 문제가 있음을 나타냅니다. 이 오류를 해결하려면 다음 사항을 확인하세요.

  • ServiceAccount가 배포에 올바르게 연결되었는지 확인합니다.
  • ClusterRole/RoleClusterRoleBinding/RoleBindings이 Metrics Server에 대해 올바른 RBAC 권한을 사용합니다.

자세한 내용을 보려면 Kubernetes 웹사이트에서 RBAC 권한 사용을 참조합니다.

aws-auth ConfigMap에 정의된 역할을 통해 클러스터에 액세스하는 경우, 사용자 이름 필드와 매핑을 설정했는지 확인합니다.

  1. aws-auth ConfigMap을 설명하려면 다음 명령을 실행합니다.

    $ kubectl describe -n kube-system configmap aws-auth
  2. 클러스터에 액세스하는 역할에 대해 username 필드가 설정되어 있는지 확인합니다. 다음 예제를 참조하세요.

    Name:         aws-auth
    Namespace:    kube-system
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    mapRoles:
    ----
    ...
    -
      groups:
      - system:masters
      rolearn: arn:aws:iam::123456789123:role/kubernetes-devops
      username: devops:{{SessionName}}  # Ensure this has been specified.

서버에서 오류 발생(ServiceUnavailable)

클러스터에서 Metrics Server 서비스 애플리케이션의 구성에 문제가 있는지 확인하려면 다음 명령을 실행합니다.

$ kubectl describe apiservices v1beta1.metrics.k8s.io

출력은 다음 예제와 유사하게 표시됩니다.

Name:         v1beta1.metrics.k8s.io
Namespace:
Labels:       app=metrics-server
...
Status:
  Conditions:
    Last Transition Time:  2020-01-09T13:57:23Z
    Message:               all checks passed
    Reason:                Passed
    Status:                True
    Type:                  Available
Events:                    <none>

Metrics Server 서비스를 사용할 수 있고 검사를 통과하면 StatusTrue로 설정됩니다.

StatusTrue로 설정했는데 문제가 지속되는 경우 APIService가 사용 가능하고 요청을 처리할 수 있는지 확인 섹션을 참조하세요.

StatusFalse로 설정된 경우 출력에서 Conditions에 대한 관련 Reason 코드 및 사람이 읽을 수 있는 Message를 찾습니다. 다음 실패한 APIService의 예를 참조하세요.

...
Status:
  Conditions:
    Last Transition Time:  2020-01-09T14:40:28Z
    Message:               no response from https://10.0.35.231:443: Get https://10.0.35.231:443: dial tcp 10.0.35.231:443: connect: connection refused
    Reason:                FailedDiscoveryCheck
    Status:                False
    Type:                  Available

ReasonFailedDiscoveryCheck가 아닌 경우 기타 APIServer 조건 실패 이유 섹션을 참조하세요.

이유 코드가 FailedDiscoveryCheck이면, Metrics Server 서비스를 사용할 수 있고 포드가 실행 중이라는 뜻이다. Kubernetes APIServer는 Metrics Server 엔드포인트에 도달하려고 할 때 오류를 반환합니다.

APIServer 조건 메시지에 헤더 대기 중 클라이언트 시간 초과가 포함된 경우, "Client.Timeout exceeded while awaiting headers” 오류 해결 섹션을 참조하세요.

APIServer 상태 메시지에 connection refused가 포함된 경우 "connection refused" 오류 해결 섹션을 참조하세요.

헤더를 기다리는 동안 "Client.Timeout exceeded while awaiting headers" 오류 해결

APIService에 대한 이 오류 메시지는 보안 그룹 또는 네트워크 액세스 제어 목록(ACL)이 올바르게 구성되지 않았음을 나타냅니다. 이로 인해 metrics-server 포드에 액세스할 수 없습니다. 다음 예제를 참조하세요.

no response from https://10.0.35.231:443: Get https://10.0.35.231:443: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

이 오류를 해결하려면 보안 그룹이 Amazon EKS에 대한 최소 트래픽 요구 사항을 준수하는지 확인하세요.

"connection refused" 오류 해결

APIServer 메시지의 이 오류는 컨테이너가 잘못된 포트에서 수신 대기 중임을 나타냅니다. 다음 예제를 참조하세요.

no response from https://10.0.35.231:443: Get https://10.0.35.231:443: dial tcp 10.0.35.231:443: connect: connection refused

이 오류를 해결하려면 다음 명령을 실행하여 metrics-server 배포에서 ports, imagecommand의 값이 올바른지 확인합니다.

$ kubectl describe deployment metrics-server -n kube-system

출력은 다음 예제와 유사하게 표시됩니다.

Name:                   metrics-server
Namespace:              kube-system
CreationTimestamp:      Wed, 08 Jan 2020 11:48:45 +0200
Labels:                 app=metrics-server
...
  Containers:
   metrics-server:
    Image:      gcr.io/google_containers/metrics-server-amd64:v0.3.6
    Port:       443/TCP
    Command:
    - /metrics-server
    - --logtostderr
    - --secure-port=443
...

참고: CommandImage 값은 Metrics Server가 배포된 방법과 이미지가 저장된 위치에 따라 달라질 수 있습니다. Command--보안 포트 매개 변수가 포함된 경우 Port (앞의 예제에서는 443/TCP)가 이 파라미터와 일치해야 합니다. Command---secure-port 파라미터가 포함되어 있지 않으면, 포트의 기본값은 443이다.

기타 APIServer 조건 실패 이유

APIService에 대해 다음 코드 중 하나가 수신되면 관련 오류 메시지에 따라 조치를 취합니다. ServiceNotFound, ServiceAccessError, ServicePortError, EndpointsNotFound, EndpointsAccessError 또는 MissingEndpoints.

  1. 오류가 발생한 서비스에 대한 정보를 얻으려면 다음 명령을 실행합니다.

    $ kubectl get service -n kube-system

    출력에서 Kubernetes 서비스의 이름과 네임스페이스가 APIService.Spec.Service에 정의된 것과 동일한지 확인합니다. 그런 다음 포트가 443/TCP로 설정되어 있는지 확인합니다. 다음 예제를 참조하세요.

    NAME                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    metrics-server                   ClusterIP   172.20.172.133   <none>        443/TCP    65m
  2. 엔드포인트를 나열하려면 다음 명령을 실행합니다.

    $ kubectl get endpoints metrics-server -n kube-system

    출력에서 metrics-server 서비스에 대한 엔드포인트가 하나 이상 있는지 확인합니다.

    NAME             ENDPOINTS         AGE
    metrics-server   10.0.35.231:443   76m
  3. 배포가 있고 레이블이 metrics-server 서비스의 레이블과 일치하는지 확인하려면 다음 명령을 실행합니다.

    $ kubectl describe deploy metrics-server -n kube-system

    출력에서 배포에 복제본이 하나 이상 있는지 확인합니다.

    Name:                   metrics-server
    Namespace:              kube-system
    CreationTimestamp:      Wed, 08 Jan 2020 11:48:45 +0200
    Labels:                 app=metrics-server
                            release=metrics-server
    ...
    Selector:               app=metrics-server,release=metrics-server
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    ...
    Pod Template:
      Labels:           app=metrics-server
                        release=metrics-server
      Service Account:  metrics-server
      Containers:
       metrics-server:
        Image:      gcr.io/google_containers/metrics-server-amd64:v0.3.6
    ...

그래도 Metrics Server로 지표를 수집할 수 없는 경우 APIService를 사용할 수 있고 요청을 처리할 수 있는지 확인 섹션을 참조하세요.

APIService를 사용할 수 있고 요청을 처리할 수 있는지 확인

Metrics Server 포드에서 로그를 추출하려면 다음 명령을 실행합니다.

$ kubectl logs -n <namespace> -l app=metrics-server

예를 들어, metrics-server의 오류 로그는 E로 시작합니다.

E0610 23:13:28.247604       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz"
E0610 23:13:43.260069       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz"
E0610 23:16:13.346070       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-cj67b: no metrics known for pod "default/php-apache-b5f58cc5f-cj67b"
E0610 23:16:13.346087       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-sqc6l: no metrics known for pod "default/php-apache-b5f58cc5f-sqc6l"
E0610 23:16:13.346091       1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-4cpwk: no metrics known for pod "default/php-apache-b5f58cc5f-4cpwk"

Metrics Server 오류 로그는 Metrics Server 배포 명령의 구성 문제 또는 Metrics Server 컨테이너의 버그를 나타냅니다. 오류 메시지가 명확하지 않거나 버그로 의심되는 경우 GitHub에서 일반적인 문제 확인 섹션의 단계를 완료하세요.

GitHub에서 일반적인 문제 확인하기

여전히 컨테이너, 포드 또는 노드에서 지표를 수집할 수 없는 경우, GitHub에서 Metrics Server의 일반적인 문제를 확인하세요.

알 수 없는 지표에 대한 HPA 및 애플리케이션 리소스 요청 확인

  1. HPA 구성을 확인하려면 다음 명령을 실행하세요.

    $ kubectl get hpa -n namespace 2048-deployment

    참고: namespace2048-deployment를 애플리케이션의 HPA 구성 값으로 바꿉니다. 다음이 표시될 수 있습니다. **<unknown>출력의 Targets 열 아래에 **이 표시됩니다. 다음 예제를 참조하세요.

    NAME              REFERENCE                    TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    2048-deployment   Deployment/2048-deployment   <unknown>/80%   1         2         2          10s
  2. 몇 분 정도 기다린 다음 1단계의 명령을 반복합니다.

    여전히 <unknown> 오류가 계속 발생하면 다음 명령을 실행합니다.

    $ kubectl describe hpa -n <namespace> 2048-deployment

    그런 다음 출력의 Events 섹션에서 자세한 정보를 확인합니다.

    Name:                                                  2048-deployment
    Namespace:                                             2048-game
    ...
    Metrics:                                               ( current / target )
      resource cpu on pods  (as a percentage of request):  <unknown> / 80%
    Min replicas:                                          1
    Max replicas:                                          2
    Deployment pods:                                       2 current / 2 desired
    Conditions:
      Type           Status  Reason                   Message
      ----           ------  ------                   -------
      AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
      ScalingActive  False   FailedGetResourceMetric  the HPA was unable to compute the replica count: missing request for cpu
    Events:
      Type     Reason                   Age                     From                       Message
      ----     ------                   ----                    ----                       -------
      Warning  FailedGetResourceMetric  3m29s (x4333 over 19h)  horizontal-pod-autoscaler  missing request for cpu

    Message 열에 [x]에 대한 누락된 요청이 표시되면 Deployments 또는 ReplicaSet이 해당 사양에서 리소스 요청을 선언하지 않았을 가능성이 높습니다. 포드의 모든 컨테이너에 요청이 선언되어 있는지 확인합니다. 요청을 누락하면 HPA의 지표가 을 반환할 수 있습니다.<unknown> 응답을 반환할 수 있습니다.

자세한 내용은 Kubernetes 웹사이트에서 포드 및 컨테이너의 리소스 관리를 참조합니다.

AWS 공식
AWS 공식업데이트됨 9달 전