error: Metrics API not available

目录

  • 解决方案1
      • 1. **确认 Metrics Server 是否安装**
      • 2. **安装 Metrics Server**
        • 方法 1:通过 `kubectl apply` 安装
        • 方法 2:通过 Helm 安装
      • 3. **检查 Metrics Server 的运行状态**
    • 镜像问题
    • 证书问题
      • 解决方法
        • 1. **允许 Insecure Skip Verify**
        • 2. **验证更新**
        • 3. **查看日志**
      • 长期解决方法
        • 1. **更新 Kubelet 的证书**
        • 2. **使用 FQDN 而不是 IP**
        • 3. **配置 Metrics Server 使用 CA**
      • 注意事项
  • 解决方案2
      • 1. 确认 Metrics Server 是否安装
      • 2. 安装 Metrics Server
        • 方法 1:通过 kubectl apply 安装
        • 方法 2:通过 Helm 安装
      • 3. 检查 Metrics Server 的运行状态
      • 4. 解决证书问题
        • 临时解决方法:允许 Insecure Skip Verify
      • 5. 长期解决方法
        • 更新 Kubelet 的证书
      • 其他可能的问题及解决方法
        • 检查 API Service
        • 检查 RBAC 配置
        • 检查网络配置
        • 如何在 Kubernetes 中正确配置 Metrics Server 的 RBAC 权限?
      • 1. **创建 RBAC 资源文件**
      • 2. **应用 RBAC 配置**
      • 3. **验证 RBAC 配置**
      • 4. **常见问题及解决方法**
        • (1)权限不足导致 Metrics Server 启动失败
        • (2)出现“Forbidden”错误
      • 5. **注意事项**
        • Kubernetes Metrics Server 安装后如何解决 TLS 证书验证失败的问题?
      • 1. **启用 TLS Bootstrap**
      • 2. **手动配置 TLS 证书**
      • 3. **跳过 TLS 验证(仅限测试环境)**
      • 4. **检查并更新 CA 证书**
      • 5. **重置或更新 Kubelet 配置**
      • 总结
        • 如何更新 Kubernetes Kubelet 的 TLS 证书以包含 IP SAN?
        • c. **验证配置**
      • 4. **其他注意事项**
      • 总结

解决方案1

error: Metrics API not available 是 Kubernetes 中执行 kubectl top podkubectl top node 时出现的常见错误。这通常表示 Kubernetes 集群中的 Metrics Server 未正确安装或配置。以下是解决问题的步骤:


1. 确认 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。

2. 安装 Metrics Server

如果 Metrics Server 未安装,可以使用以下命令安装:

方法 1:通过 kubectl apply 安装
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
方法 2:通过 Helm 安装

如果使用 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

3. 检查 Metrics Server 的运行状态

安装后,检查 Metrics Server 的状态:

kubectl get pods -n kube-system | grep metrics-server

确保 Pod 状态为 Running

如果 Pod 未运行或报错,请查看日志:

error: Metrics API not available_第1张图片

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 无法验证证书。


解决方法

1. 允许 Insecure Skip Verify

通过为 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 证书的验证。
2. 验证更新

检查 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
3. 查看日志

确认问题是否解决:

kubectl -n kube-system logs -l k8s-app=metrics-server

长期解决方法

如果需要生产级修复,可以尝试以下方式:

1. 更新 Kubelet 的证书

确保 kubelet 的 TLS 证书中包含 IP SAN。具体方法取决于 Kubernetes 的证书管理方式:

  • 自定义证书
    重新生成 kubelet 的证书,并在 SAN 中添加节点的 IP 地址。
  • Kubeadm 管理
    修改 /var/lib/kubelet/config.yaml 中的 --node-ip 参数,然后重新生成证书:
    kubeadm init phase certs renew all
    systemctl restart kubelet
    
2. 使用 FQDN 而不是 IP

确保节点使用包含 DNS 名称的 SAN,或者让 metrics-server 使用节点的 FQDN 而不是 IP 地址。

3. 配置 Metrics Server 使用 CA

将集群的根 CA 配置给 metrics-server,以便它能够验证 kubelet 的证书。


注意事项

  • 跳过 TLS 验证(--kubelet-insecure-tls)存在安全风险,尤其是在生产环境中,应尽量避免。
  • 如果更新了 kubelet 的证书或参数,可能需要重启 kubelet 服务:
    systemctl restart kubelet
    

解决方案2

根据您提供的错误信息 GetNodeMetric Fail: the server could not find the requested resource (get nodes.metrics.k8s.io qfusion-1),这通常表明 Kubernetes 集群中的 Metrics Server 未正确安装或配置,导致无法获取节点的指标信息。以下是解决该问题的详细步骤:

1. 确认 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。

2. 安装 Metrics Server

如果 Metrics Server 未安装,可以使用以下命令安装:

方法 1:通过 kubectl apply 安装
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
方法 2:通过 Helm 安装

如果使用 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

3. 检查 Metrics Server 的运行状态

安装后,检查 Metrics Server 的状态:

kubectl get pods -n kube-system | grep metrics-server

确保 Pod 状态为 Running。如果 Pod 未运行或报错,请查看日志:

kubectl logs -n kube-system -l k8s-app=metrics-server

4. 解决证书问题

如果 Metrics Server 已安装但仍然报错,可能是由于证书问题导致的。Metrics Server 在尝试从节点的 kubelet 服务获取资源指标时,可能会因 TLS 证书验证失败而无法连接。

临时解决方法:允许 Insecure Skip Verify

可以通过为 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

5. 长期解决方法

如果需要生产级修复,可以尝试以下方式:

更新 Kubelet 的证书

确保 kubelet 的 TLS 证书中包含 IP SAN(Subject Alternative Name)。具体方法取决于 Kubernetes 的证书管理方式:

  • 自定义证书:重新生成 kubelet 的证书,并在 SAN 中添加节点的 IP 地址。
  • Kubeadm 管理:修改 /var/lib/kubelet/config.yaml 中的 --node-ip 参数,然后重新生成证书:

其他可能的问题及解决方法

检查 API Service

确保 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
检查 RBAC 配置

确保 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 权限?

在 Kubernetes 中正确配置 Metrics Server 的 RBAC(基于角色的访问控制)权限是确保其正常运行的关键步骤。以下是详细的配置方法:

1. 创建 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 

2. 应用 RBAC 配置

将上述 RBAC 资源文件应用到 Kubernetes 集群中:

kubectl apply -f metrics-rbac.yaml 

3. 验证 RBAC 配置

通过以下命令验证 Metrics Server 是否具有足够的权限访问 Kubernetes API:

kubectl auth can-i --as=system:serviceaccount:kube-system:metrics-server get pods --all-namespaces

如果返回 yes,则说明 RBAC 配置正确。

4. 常见问题及解决方法

(1)权限不足导致 Metrics Server 启动失败

如果部署 Metrics Server 后出现权限不足的问题,可以检查并更新 RBAC 配置。例如,可以通过 GitHub 查看最低权限要求,并根据需要调整 RBAC 角色和绑定。

(2)出现“Forbidden”错误

如果在使用 kubectl top 命令时收到“Error from server (Forbidden)”的错误,这通常意味着 RBAC 配置不完整或未正确应用。此时,应重新检查并更新 RBAC 资源文件。

5. 注意事项

  • 确保 RBAC 配置中的 ServiceAccount 名称与 Metrics Server 所属的 ServiceAccount 一致。
  • 如果使用自定义的 YAML 文件部署,请确保文件内容完整且正确。
  • 在某些云环境(如 AWS EKS 或阿里云)中,可能需要额外配置角色或角色绑定以授予 Metrics Server 访问权限。
Kubernetes Metrics Server 安装后如何解决 TLS 证书验证失败的问题?

Kubernetes Metrics Server 安装后如果遇到 TLS 证书验证失败的问题,可以参考以下几种解决方案:

1. 启用 TLS Bootstrap

在 Metrics Server 的部署配置中启用 TLS Bootstrap 功能,这是解决证书验证失败问题的一种常见方法。具体操作如下:

  • 编辑 Metrics Server 的配置文件(通常是 components.yaml ),在文件中添加以下参数:
  kubeadm: true
  • 应用更新:
  kubectl apply -f components.yaml 
  • 等待 Metrics Server 重新启动并完成证书签发过程。

2. 手动配置 TLS 证书

如果上述方法无效,可以尝试手动配置 TLS 证书:

  • 获取 Metrics Server 的 CA 根证书、API Server 的证书和私钥。
  • 使用 openssl 工具生成新的客户端证书和私钥,并确保其正确性。
  • 将生成的证书和私钥复制到相应的目录,并赋予读写权限。
  • 更新 kubeconfig 文件,确保配置中的 API Server 地址和证书信息正确。

3. 跳过 TLS 验证(仅限测试环境)

在某些情况下,如果需要快速测试而不关心安全性,可以跳过 TLS 验证。这可以通过在 Metrics Server 的容器启动参数中添加 --let-insecure-skip-tls-verify 来实现:

kubectl apply -f metrics-server.yaml  -- DryRun --let-insecure-skip-tls-verify

但需要注意,这种方法仅适用于测试环境,不建议在生产环境中使用。

4. 检查并更新 CA 证书

如果 Metrics Server 的 CA 证书过期或未正确配置,可以尝试以下步骤:

  • 使用 kubectl get csr 命令查看证书状态。
  • 使用 kubectl certificate approve 命令批准证书。
  • 如果问题依旧存在,可以尝试删除 .kube/ 目录下的所有文件,并重新配置 Kubernetes 配置文件。

5. 重置或更新 Kubelet 配置

如果问题与 Kubelet 配置相关,可以尝试以下步骤:

  • 删除 .kube/ 目录下的所有文件。
  • 创建新的 .kube/ 目录,并将 /etc/kubernetes/admin.conf 文件复制到新目录中。
  • 修改 admin.conf 文件中的配置,确保其指向正确的 API Server 地址和证书信息。
  • 更新 Kubelet 配置并重启服务:
  sudo service kubelet restart
  • 最后,重新验证配置是否生效。

总结

上述方法涵盖了从启用 TLS Bootstrap 到手动配置证书、跳过验证以及更新 CA 证书等多种解决方案。

如何更新 Kubernetes Kubelet 的 TLS 证书以包含 IP SAN?

要更新 Kubernetes Kubelet 的 TLS 证书以包含 IP SAN(Subject Alternative Name),可以参考以下步骤:

  1. 生成新的证书请求(CSR)
    首先需要生成一个新的私钥和 CSR 文件,确保在 CSR 文件中包含需要添加的 IP SAN。例如,如果需要添加的 IP 地址是 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 文件路径。

  1. 更新 Kubernetes 配置文件
    修改 /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 端点所在端口。

  1. 确保 metrics-server 的部署正确
    metrics-server 需要能够访问所有节点上的 Kubelet。因此,需要确保 metrics-server 部署在集群中,并且其服务(Service)配置正确,以便它可以访问所有节点上的 Kubelet。
c. 验证配置
  • 使用 kubectl get networkpolicies 命令检查网络策略是否生效。
  • 使用 kubectl describe node 查看节点的网络策略配置,确保 metrics-server 的流量被允许。

4. 其他注意事项

  • Kubelet 的证书和安全性:确保所有节点上的 Kubelet 都已正确安装证书,并且 metrics-server 能够通过安全的方式访问这些端点。
  • 监控组件的权限:确保监控组件(如 Prometheus)也具有访问 metrics-server 的权限,以便它可以正确抓取资源指标。

总结

通过上述步骤,可以配置 Kubernetes 集群中的网络策略,以允许访问 Kubelet 的 /metrics/resource 端点。

你可能感兴趣的:(K8s,云原生)