Amazon EKS のメトリクスサーバーを使用してコンテナ、ポッド、またはノードからメトリクスを収集できないのはなぜですか?

所要時間4分
0

Amazon Elastic Kubernetes サービス (Amazon EKS) クラスター内のメトリクスサーバーを使用して、コンテナ、ポッド、またはノードからメトリクスを収集できません。

簡単な説明

Amazon EKS では、メトリクスサーバーはデフォルトではインストールされていません。クラスターを最近作成し、メトリクスサーバーを使用してメトリクスを収集できない場合は、メトリクスサーバーアプリケーションをクラスターにデプロイしていることを確認します。

それでもメトリクスサーバーでメトリクスを収集できない場合は、以下のセクションの手順を実行してください。

  • クラスターのノードとポッドからメトリクスを取得できるかどうかを確認します。
  • APIService が利用可能で、リクエストを処理できるかどうかを確認します。
  • GitHub で一般的な問題がないか確認します。
  • メトリクスが <unknown> と表示される場合は、Horizontal Pod Autoscaler (HPA) およびアプリケーションリソースリクエストを確認します。

注: メトリクスサーバーは、アプリケーションとクラスターのパフォーマンスを長期的に監視するための最適な手段ではありません。長期的なモニタリングについては、Kubernetes ウェブサイトの「ポッドとコンテナのリソース管理」を参照してください。Kubernetes コミュニティはメトリクスサーバーを管理し、GitHub ページで問題を報告しています。

解決策

次の手順を参照して、メトリクスサーバーに関する最も一般的な問題のトラブルシューティングを行います。

クラスターのノードとポッドからメトリクスを取得できるかどうかを確認する

API サーバーとメトリクスサーバー間にエラーがないか確認します。クラスターのノードとポッドからメトリクスをプルするには、以下のコマンドを実行します。

$ kubectl top nodes
$ kubectl top pods

どちらのコマンドからもエラーが表示されない場合は、「APIService が利用可能で、リクエストを処理できるかどうかを確認する」セクションを参照してください。

エラーが表示された場合は、そのエラーの内容に従い、以下のいずれかのセクションの手順を実行します。

  • サーバーからのエラー (Forbidden)
  • サーバーからのエラー (ServiceUnavailable)
  • ヘッダーの待機中に、Client.Timeout が超過しました
  • 接続拒否

サーバーからのエラー (Forbidden)

このエラーメッセージは、RBAC 認証に問題があることを示しています。このエラーを解決するには、以下を確認します。

  • ServiceAccount がデプロイに正しくアタッチされている。
  • ClusterRole/Role および ClusterRoleBinding/RoleBindings がメトリクスサーバーの正しい RBAC 権限を使用している。

詳細については、Kubernetes ウェブサイトの「](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)RBAC 認可を使用する[」を参照してください。

aws-auth ConfigMap で定義されたロールを介してクラスターにアクセスする場合は、[username] フィールドとマッピングを設定していることを確認します。

  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)

クラスター内のメトリクスサーバーサービスアプリケーションの設定に問題がないか確認するには、以下のコマンドを実行します。

$ 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>

メトリクスサーバーサービスが利用可能で、チェックに合格すると、ステータスTrue に設定されます。

ステータスTrue に設定しても問題が解決しない場合は、「APIService が利用可能で、リクエストを処理できるかどうかを確認する」セクションを参照してください。

ステータスFalse に設定されている場合は、出力で理由コードと、人間が判読できる条件についてのメッセージを探します。失敗する 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

理由FailedDiscoveryCheck でない場合は、「その他の APIServer 条件障害の理由」セクションを参照してください。

理由コードが FailedDiscoveryCheck の場合、メトリクスサーバーサービスは利用可能で、ポッドは実行中です。Kubernetes APIServer は、メトリクスサーバーのエンドポイントに接続しようとするとエラーを返します。

APIServer 条件メッセージに「ヘッダーの待機中に Client.Timeout が超過しました」と表示されている場合は、「ヘッダーの待機中に Client.Timeout が超過しました」エラーのセクションを参照してください。

APIServer 条件メッセージに接続拒否が含まれている場合は、「「接続拒否」エラーの解決」セクションを参照してください。

「ヘッダーの待機中に Client.Timeout が超過しました」というエラーを解決する

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 の最小トラフィック要件を満たしていることを確認します。

「接続拒否」エラーの解決

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 デプロイのポートイメージ、およびコマンドの値が正しいことを確認します。

$ 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
...

注: コマンドイメージの値は、メトリクスサーバーのデプロイ方法とイメージの保存場所によって異なる場合があります。コマンド--secure-port パラメータが含まれている場合、ポッドによって公開されるポート (前の例では 443/TCP) がこのパラメータと一致する必要があります。コマンド--secure-port パラメータが含まれていない場合、ポートのデフォルトは 443 です。

その他の APIServer 条件障害の理由

APIService の次のコードのいずれかを受け取った場合は、関連するエラーメッセージに基づくアクションを実行します。 ServiceNotFoundServiceAccessErrorServicePortErrorEndpointsNotFoundEndpointsAccessError、または 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 サービスのエンドポイントが少なくとも 1 つあることを確認します。

    NAME             ENDPOINTS         AGE
    metrics-server   10.0.35.231:443   76m
  3. デプロイが存在し、ラベルが metrics-server サービスのラベルと一致することを確認するために、以下のコマンドを実行します。

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

    この出力で、デプロイに少なくとも 1 つのレプリカがあることを確認します。

    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

たとえば、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"

メトリクスサーバーのエラーログには、メトリクスサーバーデプロイコマンドの設定上の問題がある、またはメトリクスサーバーコンテナのバグがあることが示されます。エラーメッセージがはっきりしない場合や、バグの疑いがある場合は、「GitHub で一般的な問題がないか確認する 」セクションの手順を実行してください。

GitHub で一般的な問題がないか確認する

それでもコンテナ、ポッド、またはノードからメトリクスを収集できない場合は、GitHub にメトリクスサーバーに関する一般的な問題がないか確認します

HPA とアプリケーションリソースのリクエストに不明なメトリクスがないか確認する

  1. HPA の設定を確認するには、次のコマンドを実行します。

    $ kubectl get hpa -n namespace 2048-deployment

    注: namespace2048-deployment をアプリケーションの HPA 設定値に置き換えてください。<unknown> が出力の [Target] 列の下に表示される場合があります。以下の例を参照してください。

    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

    メッセージ列に [x] の見つからないリクエストが表示され、DeploymentReplicaSet は仕様に合ったでリソースリクエストを宣言していない可能性があります。ポッド内のすべてのコンテナにリクエストが宣言されていることを確認します。リクエストを省略すると、HPA のメトリクスが <unknown> のレスポンスを返します。

詳細については、Kubernetes ウェブサイトの「Resource management for pods and containers」を参照してください。

AWS公式
AWS公式更新しました 8ヶ月前
コメントはありません

関連するコンテンツ