You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

prometheus-adapter开启hostNetwork后kubectl top nodes异常求解决方案

根因说明

开启hostNetwork: true后,Pod默认使用节点的DNS解析配置,而节点默认不会把集群CoreDNS配置为上游DNS,因此无法解析prometheus-k8s.monitoring.svc.cluster.local这类集群内部Service域名。
修改节点全局DNS影响范围大,不推荐,以下是优先级从高到低的更优解决方案:

方案1:回退hostNetwork配置,修复原始APIService异常(最优)

你最初添加hostNetwork: true是为了解决APIService的FailedDiscoveryCheck错误,本质是kube-apiserver无法通过集群网络访问prometheus-adapter服务,直接修复该问题即可彻底避免DNS解析异常:

  • 操作步骤:
    1. 删除prometheus-adapter Deployment中的hostNetwork: true配置
    2. 检查v1beta1.metrics.k8s.io APIService配置,确认spec.service.port与prometheus-adapter Service暴露的端口一致:
    apiVersion: apiregistration.k8s.io/v1
    kind: APIService
    metadata:
      name: v1beta1.metrics.k8s.io
    spec:
      service:
        name: prometheus-adapter
        namespace: monitoring
        port: 6443 # 未配置时默认用443端口,和adapter的6443端口不匹配会导致访问失败
      group: metrics.k8s.io
      version: v1beta1
      groupPriorityMinimum: 100
      versionPriority: 100
    
    1. 放通集群网络策略,允许kube-apiserver节点IP访问prometheus-adapter的6443端口
    2. 重启prometheus-adapter Pod,验证APIService状态和kubectl top nodes命令

方案2:保留hostNetwork,显式配置Pod DNS策略(次优)

如果集群网络架构限制必须保留hostNetwork: true,只需为prometheus-adapter Pod单独指定DNS策略即可,无需修改节点全局配置:

  • 操作步骤:
    在prometheus-adapter Deployment的spec.template.spec下添加dnsPolicy: ClusterFirstWithHostNet配置,示例:
    spec:
      template:
        spec:
          hostNetwork: true
          dnsPolicy: ClusterFirstWithHostNet # 新增该配置,hostNetwork模式下也会使用集群CoreDNS解析
          containers:
          - name: prometheus-adapter
            args:
            - --cert-dir=/var/run/serving-cert
            - --config=/etc/adapter/config.yaml
            - --logtostderr=true
            - --metrics-relist-interval=1m
            - --prometheus-url=http://prometheus-k8s.monitoring.svc.cluster.local:9090/prometheus
            - --secure-port=6443
    
    修改后重启Pod即可正常解析集群内部Service域名。

方案3:临时规避方案,用ClusterIP替代域名

如果需要快速验证修复效果,可以直接用Prometheus服务的ClusterIP代替域名,无需修改DNS相关配置:

  • 操作步骤:
    1. 执行命令获取Prometheus服务的ClusterIP:kubectl get svc -n monitoring prometheus-k8s
    2. 将prometheus-adapter启动参数--prometheus-url中的域名替换为实际ClusterIP,比如:
      --prometheus-url=http://10.96.xx.xx:9090/prometheus
    3. 重启Pod即可生效,缺点是Prometheus服务重建导致ClusterIP变化后需要同步修改配置。

内容的提问来源于stack exchange,提问作者Xsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 16:30:03