k8s版本(使用二进制安装):v1.15.7
[root@k8s-master1 metrics-server]# kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.7", GitCommit:"6c143d35bb11d74970e7bc0b6c45b6bfdffc0bd4", GitTreeState:"clean", BuildDate:"2019-12-11T12:42:56Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.7", GitCommit:"6c143d35bb11d74970e7bc0b6c45b6bfdffc0bd4", GitTreeState:"clean", BuildDate:"2019-12-11T12:34:17Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
使用命令kubectl top node报错:
[root@k8s-master1 metrics-server]# kubectl top node
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
查看 Kubernetes 集群中 v1beta1.metrics.k8s.io 这个 APIService 的详细信息,可以看到Message中访问metrics-server的service网络不通,原因是因为metrics-server的service的type为ClusterIP,该版本k8s使用二进制安装,master节点并未安装kubelet和kube-proxy导致
[root@k8s-master1 metrics-server]# kubectl describe apiservice v1beta1.metrics.k8s.io
Name: v1beta1.metrics.k8s.io
Namespace:
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apiregistration.k8s.io/v1beta1","kind":"APIService","metadata":{"annotations":{},"name":"v1beta1.metrics.k8s.io"},"spec":{"...
API Version: apiregistration.k8s.io/v1
Kind: APIService
Metadata:
Creation Timestamp: 2025-01-15T06:03:52Z
Resource Version: 495300447
Self Link: /apis/apiregistration.k8s.io/v1/apiservices/v1beta1.metrics.k8s.io
UID: 70ed9328-3ae9-4907-a476-4197d079294a
Spec:
Group: metrics.k8s.io
Group Priority Minimum: 100
Insecure Skip TLS Verify: true
Service:
Name: metrics-server
Namespace: kube-system
Port: 443
Version: v1beta1
Version Priority: 100
Status:
Conditions:
Last Transition Time: 2025-01-15T06:03:52Z
Message: failing or missing response from https://172.30.86.4:443/apis/metrics.k8s.io/v1beta1: Get https://172.30.86.4:443/apis/metrics.k8s.io/v1beta1: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) ##该行报错访问service不通
Reason: FailedDiscoveryCheck
Status: False
Type: Available
Events: <none>
解决方法:metrics-server配置文件中使用本机网络(deployment.spec.template.spec.hostNetwork: true),配置如下:
[root@k8s-master1 metrics-server]# cat metrics-server-deployment.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
hostNetwork: true ##添加此行,使用本机网络
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
image: registry:5000/metrics-server-amd64:v0.3.6
imagePullPolicy: Always
args:
#- --cert-dir=/tmp
#- --secure-port=4443
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --v=6
volumeMounts:
- name: tmp-dir
mountPath: /tmp