error: Metrics API not available
是 Kubernetes 中执行 kubectl top pod
或 kubectl top node
时出现的常见错误。这通常表示 Kubernetes 集群中的 Metrics Server 未正确安装或配置。以下是解决问题的步骤:
执行以下命令检查 Metrics Server 是否已安装:
kubectl get deployment -n kube-system metrics-server
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 10d
如果 Metrics Server 未安装,可以使用以下命令安装:
kubectl apply
安装kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
如果使用 Helm:
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
helm install metrics-server metrics-server/metrics-server -n kube-system
安装后,检查 Metrics Server 的状态:
kubectl get pods -n kube-system | grep metrics-server
确保 Pod 状态为 Running
。
如果 Pod 未运行或报错,请查看日志:
kubectl top pod --sort-by=memory --no-headers | awk '{printf "%-50s %-10s %.2fG\n", $1, $2, $3/1024/1024}'
docker pull registry.k8s.io/metrics-server/metrics-server:v0.7.2
docker save -o metrics-server.tar registry.k8s.io/metrics-server/metrics-server:v0.7.2
docker load -i metrics-server.tar
MASTER_IPS=$(kubectl get node -l qfusion/master=true -owide --no-headers | awk '{print $6}')
for IP in $MASTER_IPS; do
docker tag registry.k8s.io/metrics-server/metrics-server:v0.7.2 $IP:30081/irds/metrics-server:v0.7.2
docker push $IP:30081/irds/metrics-server:v0.7.2
done
这个错误表明 metrics-server
在尝试从节点 qfusion2
的 kubelet 服务(位于 https://172.16.130.212:10250/metrics/resource
)获取资源指标时,因 TLS 证书验证失败导致无法连接。这是因为 kubelet 提供的证书中缺少 IP SAN(Subject Alternative Name),使得 metrics-server
无法验证证书。
通过为 metrics-server
添加参数,忽略证书验证(不建议在生产环境使用,适合测试或快速排查问题)。
执行以下命令为 metrics-server
的 Deployment 添加参数:
kubectl -n kube-system patch deployment metrics-server \
--type='json' \
-p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value":"--kubelet-insecure-tls"}]'
解释:
--kubelet-insecure-tls
: 忽略对 kubelet 证书的验证。检查 metrics-server
是否已添加参数:
kubectl -n kube-system describe deployment metrics-server | grep -- "--kubelet-insecure-tls"
检查 metrics-server
是否重新启动并工作正常:
kubectl -n kube-system get pods | grep metrics-server
确认问题是否解决:
kubectl -n kube-system logs -l k8s-app=metrics-server
如果需要生产级修复,可以尝试以下方式:
确保 kubelet 的 TLS 证书中包含 IP SAN。具体方法取决于 Kubernetes 的证书管理方式:
/var/lib/kubelet/config.yaml
中的 --node-ip
参数,然后重新生成证书:kubeadm init phase certs renew all
systemctl restart kubelet
确保节点使用包含 DNS 名称的 SAN,或者让 metrics-server
使用节点的 FQDN 而不是 IP 地址。
将集群的根 CA 配置给 metrics-server
,以便它能够验证 kubelet 的证书。
--kubelet-insecure-tls
)存在安全风险,尤其是在生产环境中,应尽量避免。systemctl restart kubelet
根据您提供的错误信息 GetNodeMetric Fail: the server could not find the requested resource (get nodes.metrics.k8s.io qfusion-1)
,这通常表明 Kubernetes 集群中的 Metrics Server 未正确安装或配置,导致无法获取节点的指标信息。以下是解决该问题的详细步骤:
首先,检查 Metrics Server 是否已安装:
kubectl get deployment -n kube-system metrics-server
如果返回类似以下结果,则 Metrics Server 已安装:
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 10d
如果没有安装,需要手动安装 Metrics Server。
如果 Metrics Server 未安装,可以使用以下命令安装:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
如果使用 Helm:
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
helm install metrics-server metrics-server/metrics-server -n kube-system
安装后,检查 Metrics Server 的状态:
kubectl get pods -n kube-system | grep metrics-server
确保 Pod 状态为 Running。如果 Pod 未运行或报错,请查看日志:
kubectl logs -n kube-system -l k8s-app=metrics-server
如果 Metrics Server 已安装但仍然报错,可能是由于证书问题导致的。Metrics Server 在尝试从节点的 kubelet 服务获取资源指标时,可能会因 TLS 证书验证失败而无法连接。
可以通过为 metrics-server 添加参数,忽略证书验证(不建议在生产环境使用,适合测试或快速排查问题):
kubectl -n kube-system patch deployment metrics-server \
--type='json' \
-p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value":"--kubelet-insecure-tls"}]'
解释:
--kubelet-insecure-tls
: 忽略对 kubelet 证书的验证。验证更新:
检查 metrics-server 是否已添加参数:
kubectl -n kube-system describe deployment metrics-server | grep -- "--kubelet-insecure-tls"
检查 metrics-server 是否重新启动并工作正常:
kubectl -n kube-system get pods | grep metrics-server
如果需要生产级修复,可以尝试以下方式:
确保 kubelet 的 TLS 证书中包含 IP SAN(Subject Alternative Name)。具体方法取决于 Kubernetes 的证书管理方式:
/var/lib/kubelet/config.yaml
中的 --node-ip
参数,然后重新生成证书:确保 Metrics Server 的 API Service 已正确注册:
kubectl get apiservice v1beta1.metrics.k8s.io
如果未注册,可以尝试重新应用 Metrics Server 的配置文件:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
确保 Metrics Server 具有正确的 RBAC 权限:
kubectl auth can-i get pods.metrics.k8s.io --as=system:serviceaccount:kube-system:metrics-server
如果返回 yes
,则权限配置正确。
确保集群中的网络策略允许访问 Kubelet 的 /metrics/resource
端点。
通过以上步骤,可以有效排查和解决 GetNodeMetric Fail: the server could not find the requested resource (get nodes.metrics.k8s.io qfusion-1)
错误,确保 Kubernetes 集群中的 Metrics Server 正常运行并提供节点的指标信息。
在 Kubernetes 中正确配置 Metrics Server 的 RBAC(基于角色的访问控制)权限是确保其正常运行的关键步骤。以下是详细的配置方法:
需要创建一个包含 Metrics Server 所需权限的 RBAC 资源文件(例如 metrics-rbac.yaml
)。以下是一个示例配置文件内容:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system-aggregated-metrics-reader
rules:
- apiGroups: ["metrics.k8s.io "]
resources: [".metrics"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: metrics-server:system-aggregated-metrics-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
roleRef:
kind: ClusterRole
name: system-aggregated-metrics-reader
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: metrics-server:system-aggregated-metrics-reader:edit
rules:
- apiGroups: ["metrics.k8s.io "]
resources: ["metrics"]
verbs: ["get", "list", "watch", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: metrics-server:system-aggregated-metrics-reader:edit
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
roleRef:
kind: Role
name: metrics-server:system-aggregated-metrics-reader:edit
apiGroup: rbac.authorization.k8s.io
将上述 RBAC 资源文件应用到 Kubernetes 集群中:
kubectl apply -f metrics-rbac.yaml
通过以下命令验证 Metrics Server 是否具有足够的权限访问 Kubernetes API:
kubectl auth can-i --as=system:serviceaccount:kube-system:metrics-server get pods --all-namespaces
如果返回 yes
,则说明 RBAC 配置正确。
如果部署 Metrics Server 后出现权限不足的问题,可以检查并更新 RBAC 配置。例如,可以通过 GitHub 查看最低权限要求,并根据需要调整 RBAC 角色和绑定。
如果在使用 kubectl top
命令时收到“Error from server (Forbidden)”的错误,这通常意味着 RBAC 配置不完整或未正确应用。此时,应重新检查并更新 RBAC 资源文件。
ServiceAccount
名称与 Metrics Server 所属的 ServiceAccount
一致。Kubernetes Metrics Server 安装后如果遇到 TLS 证书验证失败的问题,可以参考以下几种解决方案:
在 Metrics Server 的部署配置中启用 TLS Bootstrap
功能,这是解决证书验证失败问题的一种常见方法。具体操作如下:
components.yaml
),在文件中添加以下参数: kubeadm: true
kubectl apply -f components.yaml
如果上述方法无效,可以尝试手动配置 TLS 证书:
openssl
工具生成新的客户端证书和私钥,并确保其正确性。kubeconfig
文件,确保配置中的 API Server 地址和证书信息正确。在某些情况下,如果需要快速测试而不关心安全性,可以跳过 TLS 验证。这可以通过在 Metrics Server 的容器启动参数中添加 --let-insecure-skip-tls-verify
来实现:
kubectl apply -f metrics-server.yaml -- DryRun --let-insecure-skip-tls-verify
但需要注意,这种方法仅适用于测试环境,不建议在生产环境中使用。
如果 Metrics Server 的 CA 证书过期或未正确配置,可以尝试以下步骤:
kubectl get csr
命令查看证书状态。kubectl certificate approve
命令批准证书。.kube/
目录下的所有文件,并重新配置 Kubernetes 配置文件。如果问题与 Kubelet 配置相关,可以尝试以下步骤:
.kube/
目录下的所有文件。.kube/
目录,并将 /etc/kubernetes/admin.conf
文件复制到新目录中。admin.conf
文件中的配置,确保其指向正确的 API Server 地址和证书信息。 sudo service kubelet restart
上述方法涵盖了从启用 TLS Bootstrap 到手动配置证书、跳过验证以及更新 CA 证书等多种解决方案。
要更新 Kubernetes Kubelet 的 TLS 证书以包含 IP SAN(Subject Alternative Name),可以参考以下步骤:
192.168.91.105
,可以使用以下命令生成 CSR 文件: openssl req -newkey rsa:2048 -nodes -keyout /path/to/kubelet.key -out /path/to/kubelet.csr -subj "/CN=your-cluster-name/OU=IT Department/O=Your Organization/C=US" -addext "subjectAltName = IP:192.168.91.105"
这里 /path/to/kubelet.key
是生成的私钥文件路径,/path/to/kubelet.csr
是生成的 CSR 文件路径。
/var/lib/kubelet/config.yaml
文件,添加或更新 --node-id
参数,并将 CSR 文件路径指定为 --client-certificate
和 --client-key
的值。例如: apiVersion: v1
kind: Node
metadata:
name: -node-name>
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
value: "true"
tolerations:
- key: " CriticalAddonsOnly"
operator: "Exists"
effect: "NoSchedule"
kubelet:
authentication:
tokenReviewAPIGroup: authentication.k8s.io
authorization:
mode: Webhook
webhook:
cacheTTL: 0s
client证书:
client-certificate: /path/to/kubelet.crt
client-key: /path/to/kubelet.key
nodeLeaderElection:
leaderElect: true
pod自来机:
pod自来机: true
registration:
kubeletRegistration:
enabled: true
#### Metrics Server 的 API Service 注册失败时的解决方案是什么?
Metrics Server 的 API Service 注册失败时,可以参考以下解决方案:
1. **检查 Metrics Server 是否正常运行**
- 确认 Metrics Server 的 Pod 是否存在且运行正常。如果 Pod 存在但未正常运行,可以尝试重新部署 Metrics Server。例如,下载并安装最新版本的 Metrics Server(如 0.6.2 版本),修改配置文件中的参数(如禁用证书验证和更改镜像地址为阿里云镜像),然后使用 `kubectl apply -f components.yaml ` 部署 Metrics Server。
2. **API Server 访问问题**
- 如果 Metrics Server 报错提示“metrics.k8s.io/v1beta1 is currently not available”,可能是因为 Metrics Server 无法访问 kube-apiserver。解决方法包括:
- 启用 API 聚合功能:在 kube-apiserver 的启动参数中添加 `--runtime-config=api/all=true` 和 `--requestheader-allowed-names=aggregator`。
- 安装 cfssl 工具生成 API 聚合所需的 CA 证书,并将证书复制到指定目录。同时,修改所有 Master 节点的 kube-apiserver 参数配置,重启 kube-apiserver 和 Metrics Server。
3. **API Server 认证问题**
- 如果出现“Metrics Server is currently not available”错误,可能是因为证书签名的权威未知或缺少必要的配置。可以在 kube-apiserver 的配置文件中添加 `--requestheader-allowed-names=front-proxy-client` 参数,并重启 kube-apiserver。
4. **网络问题**
- 如果 Metrics Server 因网络问题无法访问 API Server,例如出现“dial tcp 109.60.1:443: i/o timeout”错误,可能是由于网络配置问题导致的。例如,Cilium 网络可能导致 Metrics Server 连接失败。此时,可以检查网络配置并修复相关问题。
5. **其他常见问题**
- 如果 Metrics Server 的 metrics API 不可用,可能是因为 Metrics Server 没有正确注册到 kube-apiserver。可以通过检查 kube-apiserver 的 API Services 注册状态来确认。如果发现 metrics.k8s.io/v1beta1 缺少,可以尝试重新部署 Metrics Server 或检查相关配置文件是否正确。
总结:解决 Metrics Server API Service 注册失败的问题,需要从 Pod 状态、API Server 访问权限、网络配置等多个方面进行排查和修复。
#### Kubernetes 集群中网络策略如何配置以允许访问 Kubelet 的 `/metrics/resource` 端点?
在 Kubernetes 集群中,要允许访问 Kubelet 的 `/metrics/resource` 端点,需要配置网络策略以确保相关组件(如 metrics-server)能够与 Kubelet 正确通信。以下是详细步骤和配置建议:
### 1. **理解 Kubelet 的 `/metrics/resource` 端点**
根据证据,Kubelet 提供了 `/metrics/resource` 和 `/metrics` API 端点,用于收集和暴露每个节点的资源使用情况(如 CPU 和内存)。这些端点是 metrics-server 的数据来源,后者通过调用这些端点来聚合资源指标并提供给监控系统。
### 2. **metrics-server 的角色**
Metrics-server 是 Kubernetes 生态中的一个关键组件,用于收集来自每个 Kubelet 的资源指标,并将其暴露给集群的监控系统。它通过调用 Kubelet 的 `/metrics/resource` 端点获取数据。
### 3. **网络策略的配置**
为了确保 metrics-server 能够访问 Kubelet 的 `/metrics/resource` 端点,需要在 Kubernetes 中配置适当的网络策略。以下是具体步骤:
#### a. **确定目标**
- 目标是允许 metrics-server 或其他监控组件能够访问所有节点上的 Kubelet 的 `/metrics/resource` 端点。
#### b. **配置网络策略**
1. **创建或修改 NetworkPolicy 对象**:
在 Kubernetes 中,可以使用 NetworkPolicy 对象来定义允许或拒绝特定流量的规则。例如,可以创建一个 NetworkPolicy,允许来自 metrics-server 的流量访问所有节点上的 Kubelet。
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-metrics-server
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
ports:
- protocol: TCP
port: 10250
上述配置允许所有 Pod(包括 metrics-server)访问所有节点上的 Kubelet 的默认端口(10250),这是 Kubelet 的 metrics 端点所在端口。
kubectl get networkpolicies
命令检查网络策略是否生效。kubectl describe node
查看节点的网络策略配置,确保 metrics-server 的流量被允许。通过上述步骤,可以配置 Kubernetes 集群中的网络策略,以允许访问 Kubelet 的 /metrics/resource
端点。