내용으로 건너뛰기

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

7분 분량
0

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

해결 방법

Amazon EKS는 지표 서버를 자동으로 설치하지 않습니다. 최근에 클러스터를 만들었는데 지표 서버를 사용하여 지표를 수집할 수 없는 경우, 클러스터에 지표 서버 애플리케이션을 배포했는지 확인하십시오.

그래도 지표 서버로 지표를 수집할 수 없는 경우 다음 섹션의 단계를 완료하십시오.

참고: 지표 서버는 애플리케이션 및 클러스터 성능의 장기 모니터링에 사용하지 않는 것이 좋습니다. 장기 모니터링에 대해서는 Kubernetes 웹 사이트의 Resource management for pods and containers를 참조하십시오. Kubernetes 커뮤니티는 지표 서버를 유지 관리하고 GitHub 페이지에서 문제를 보고합니다. 자세한 내용은 지표 서버 GitHub 페이지의 Issues를 참조하십시오.

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

클러스터의 노드와 포드에서 지표를 검색할 수 있는지 확인하려면 다음 명령을 실행합니다.

kubectl top nodes
kubectl top pods

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

위 명령에서 오류가 발생하면 발생한 오류에 따라 다음 섹션 중 하나의 단계를 완료합니다.

"Error from server (Forbidden)" 오류 메시지

RBAC(역할 기반 액세스 제어) 권한 부여에 문제가 있는 경우 "Error from server (Forbidden)" 오류 메시지가 표시됩니다.

이 오류를 해결하려면 다음 작업을 수행하십시오.

  • ServiceAccount가 배포에 제대로 연결되는지 확인합니다.
  • ClusterRole/RoleClusterRoleBinding/RoleBindings가 지표 서버에 대해 올바른 RBAC 권한을 사용하는지 확인합니다. 자세한 내용은 Kubernetes 웹 사이트의 Using RBAC authorization을 참조하십시오.

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

다음 단계를 완료하십시오.

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

    kubectl describe -n kube-system configmap aws-auth
  2. 이전 명령의 출력을 검토하여 클러스터에 액세스하는 역할에 username 필드가 설정되었는지 확인합니다.
    출력 예시:

    Name:         aws-auth
    Namespace:    kube-system
    Labels:       
    Annotations:  <none>
    
    Data
    ===
    mapRoles:
    ----
    ...
    - groups:
      - system:masters
      rolearn: arn:aws:iam::123456789123:role/kubernetes-devops
      username: devops:`SessionName`

    출력에 username이 명시되었는지 확인하십시오.

"Error from server (ServiceUnavailable)" 오류 메시지

지표 서버가 제대로 구성되지 않은 경우 "Error from server (ServiceUnavailable)" 오류 메시지가 표시됩니다.

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

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>

지표 서버 서비스를 사용할 수 있고 검사를 통과하면 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 조건 실패 이유 섹션을 참조하십시오. APIServer 조건 메시지에 헤더 대기 중 클라이언트 시간 초과가 포함된 경우, "Client.Timeout exceeded while awaiting headers” 오류 해결 섹션을 참조하십시오. APIServer 상태 메시지에 Connection refused가 포함된 경우 "Connection refused" 오류 해결 섹션을 참조하십시오.

"Client.Timeout exceeded while awaiting headers" 오류 해결

보안 그룹 또는 네트워크 액세스 제어 목록(네트워크 ACL)을 올바르게 구성하지 않은 경우 APIService에서 "Client.Timeout exceeded will awaiting headers" 오류 메시지가 표시됩니다. 그러면 metrics-server 포드에 액세스할 수 없습니다.

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

"Connection refused" 오류 해결

컨테이너가 잘못된 포트에서 수신 대기하는 경우 "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 값은 지표 서버를 배포하는 방법과 이미지를 저장하는 위치에 따라 달라집니다. Command--secure-port 파라미터가 포함된 경우 포드가 노출하는 포트가 이 파라미터와 일치해야 합니다. 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
    ...
    

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

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

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

kubectl logs -n namespace -l app=metrics-server

참고: namespace를 네임스페이스로 바꾸십시오.
오류 로그 예시:

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"

참고: 지표 서버 오류 로그는 지표 서버 배포 명령에 구성 문제가 있거나 지표 서버 컨테이너에 버그가 있는지 여부를 보여줍니다. 오류 메시지가 명확하지 않거나 버그로 의심되는 경우 GitHub에서 일반적인 문제 확인 섹션의 단계를 완료하십시오.

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

여전히 컨테이너, 포드 또는 노드에서 지표를 수집할 수 없는 경우, GitHub에서 지표 서버의 일반적인 문제를 확인하십시오. 자세한 내용은 지표 서버 GitHub 페이지의 Issues를 참조하십시오.

HorizontalPodAutoscaler(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

    참고: namespace를 네임스페이스로 바꾸십시오.
    그런 다음 출력의 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 웹 사이트에서 Resource management for pods and containers, DeploymentsReplicaSet를 참조하십시오.

AWS 공식업데이트됨 6달 전