在 kubernetes 集群中安装了指标服务器,但出现“kubectl top nodes”的“ServiceUnavailable”错误

在 kubernetes 集群中安装了指标服务器,但出现“kubectl top nodes”的“ServiceUnavailable”错误

我有一个 3 主 kubernetes 集群,kubernetes 版本为 v1.25.0

NAME              STATUS   ROLES           AGE    VERSION
master21.server   Ready    control-plane   77d    v1.25.0
master22.server   Ready    control-plane   22h    v1.25.0
master23.server   Ready    control-plane   265d   v1.25.0
worker31.server   Ready    worker          265d   v1.25.0
worker32.server   Ready    worker          265d   v1.25.0

我已经使用以下步骤安装了指标集群

从以下位置下载 components.yamlhttps://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

进行了以下更改

- --kubelet-insecure-tls=true
- --kubelet-preferred-address-types=InternalIP

然后使用 yaml 应用;

kubectl apply -f components.yaml

我可以看到 Pod 已成功部署,没有任何重启或错误,但是当我执行kubectl 顶部节点出现以下错误

Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)

尝试了 Google 中与此错误相关的大多数方法,但都无济于事,有人可以解释一下吗?

更新

过了一段时间,我检查了指标 pod 日志,发现所有其他节点都出现了以下错误(192.168.1.22 是主服务器之一)

 failed to verify certificate: x509: cannot validate certificate for 192.168.1.22 because it doesn't contain any IP SANs"  

经过一番搜索,我修改了指标组件 yaml,如下所示,并再次部署

 - --kubelet-preferred-address-types=Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP

现在我收到以下错误,对我来说,用于忽略 TLS 验证的参数(“- --kubelet-insecure-tls”)似乎没有正常工作(“- --kubelet-insecure-tls = true”或“- --kubelet-insecure-tls”),如果有人遇到了同样的问题并已修复,非常感谢您的输入。

0218 08:16:22.070470       1 scraper.go:147] "Failed to scrape node, timeout to access kubelet" err="Get \"https://master23.server:10250/metrics/resource\": context deadline exceeded" node="master23.server" timeout="10s"

答案1

我通过执行以下操作解决了此问题;

  1. 使用以下方法删除了所有当前度量服务器组件
kubectl delete -f  components.yaml

下载了 component.yaml

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  1. 在 -args 部分添加了“- --kubelet-insecure-tls”,并修改了“- --kubelet-preferred-address-types=",如下所示,将 metric-resolution 更改为 30s,

  2. 将 --secure-port,containerPort 更改为自定义端口 4443(从 10250 更改为 4433,因为 10250 已被 kubernetes api 占用),然后在所有工作节点和主节点的防火墙中允许 4443 端口

      - args:
        - --kubelet-insecure-tls=true
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=30s
 
containerPort:4443

4)在相关位置添加hostNetwork: true,如下所示。

  hostNetwork: true
  nodeSelector:
    kubernetes.io/os: linux
  1. 应用 component.yaml
kubectl apply -f components.yaml
  1. 检查 apiservice 状态
kubectl get apiservice v1beta1.metrics.k8s.io

相关内容