Amazon EKS のメトリクスサーバーを使用してコンテナ、ポッド、またはノードからメトリクスを収集できないのはなぜですか?
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] フィールドとマッピングを設定していることを確認します。
-
aws-auth ConfigMap を記述するには、次のコマンドを実行します。
$ kubectl describe -n kube-system configmap aws-auth
-
クラスターにアクセスするロールに [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 の次のコードのいずれかを受け取った場合は、関連するエラーメッセージに基づくアクションを実行します。 ServiceNotFound、ServiceAccessError、ServicePortError、EndpointsNotFound、EndpointsAccessError、または MissingEndpoints。
-
エラーがあるサービスの情報を取得するには、以下のコマンドを実行します。
$ 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
-
エンドポイントを一覧表示するには、以下のコマンドを実行します。
$ kubectl get endpoints metrics-server -n kube-system
この出力で、metrics-server サービスのエンドポイントが少なくとも 1 つあることを確認します。
NAME ENDPOINTS AGE metrics-server 10.0.35.231:443 76m
-
デプロイが存在し、ラベルが 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 とアプリケーションリソースのリクエストに不明なメトリクスがないか確認する
-
HPA の設定を確認するには、次のコマンドを実行します。
$ kubectl get hpa -n namespace 2048-deployment
注: namespace と 2048-deployment をアプリケーションの HPA 設定値に置き換えてください。<unknown> が出力の [Target] 列の下に表示される場合があります。以下の例を参照してください。
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE 2048-deployment Deployment/2048-deployment <unknown>/80% 1 2 2 10s
-
数分待ってから、ステップ 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] の見つからないリクエストが表示され、Deployment や ReplicaSet は仕様に合ったでリソースリクエストを宣言していない可能性があります。ポッド内のすべてのコンテナにリクエストが宣言されていることを確認します。リクエストを省略すると、HPA のメトリクスが <unknown> のレスポンスを返します。
詳細については、Kubernetes ウェブサイトの「Resource management for pods and containers」を参照してください。
関連するコンテンツ
- 質問済み 2ヶ月前lg...
- 質問済み 1年前lg...
- 質問済み 5ヶ月前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 2ヶ月前
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前
- AWS公式更新しました 1年前