直接调用 clientset.corev1().nodes().list(ctx, opts) 可列出所有 node,需正确配置 rest.config、rbac 权限(clusterrolebinding 绑定 nodes list 权限)、serviceaccount 凭据,并通过 status.conditions 判断 ready 状态、status.addresses 获取 internalip;大规模集群需手动分页,避免内存暴涨。

用 client-go 列出所有 Node 对象
直接调用 corev1.NodeList 的 List 方法就能拿到集群中所有节点,前提是配置好 rest.Config 并初始化了 NodeClient。这不是 HTTP 请求封装,而是 client-go 提供的标准资源操作接口。
常见错误是没设置正确的 RBAC 权限或 kubeconfig 路径不对,导致报错 Unauthorized 或 connection refused。本地开发时默认读 $HOME/.kube/config,容器内必须挂载 ServiceAccount 的 token 和 ca.crt。
- 确保 ServiceAccount 有
nodes资源的list权限(ClusterRoleBinding 绑定到node-reader类似角色) - 使用
clientset.CoreV1().Nodes().List(ctx, opts),opts可传空metav1.ListOptions{} - 返回的
*corev1.NodeList中,每个Node的Status.Conditions和Status.Addresses是判断节点是否 Ready、获取 IP 的关键字段
如何过滤 NotReady 状态的节点
Node 的健康状态不看 Phase,而要看 Status.Conditions 里类型为 Ready 的条件是否为 True。Kubernetes 不保证 Conditions 数组顺序,不能靠索引取值。
示例逻辑:遍历 node.Status.Conditions,找到 Type == "Ready" 且 Status == "True" 的项。如果没找到,或找到但 Status 是 "False" 或 "Unknown",就认为节点不可用。
- 别用
node.Status.Phase == "Running"—— Node 没有 Phase 字段,这个字段只存在于 Pod - Ready 条件可能有延迟,刚重启的节点可能在几秒内显示为 Unknown,建议加一点容忍时间再判定
- 如果只需要 IP,优先取
node.Status.Addresses中Type == "InternalIP"的地址,而不是从 hostname 解析
在 Pod 内使用 ServiceAccount 访问 API Server
容器中不能依赖本地 kubeconfig,必须用自动挂载的 ServiceAccount 凭据。client-go 会自动识别 /var/run/secrets/kubernetes.io/serviceaccount/ 下的 token、ca.crt 和命名空间文件。
典型错误是忘记设置 automountServiceAccountToken: true(默认为 true,但有人显式设为 false),或者 RBAC 规则没覆盖当前命名空间(虽然 Node 是集群作用域资源,但 ClusterRoleBinding 必须正确绑定)。
- 用
rest.InClusterConfig()替代clientcmd.BuildConfigFromFlags,它会自动读取挂载路径 - 检查
cat /var/run/secrets/kubernetes.io/serviceaccount/token是否可读,否则 client-go 初始化直接 panic - API Server 地址固定为
https://kubernetes.default.svc,不需要硬编码或环境变量传入
性能与分页注意事项
节点数超过百台时,List() 默认不带分页,一次返回全部对象,可能导致内存暴涨或 etcd 响应超时。Kubernetes API 支持 limit 和 continue 参数做服务端分页。
client-go 的 List() 不自动分页,你得手动循环调用,每次传入上一轮返回的 list.Continue 字段。忽略它等于放弃对大规模集群的支持能力。
- 首次请求加
metav1.ListOptions{Limit: 500},后续用Continue: list.Continue - 注意
list.Continue为空字符串时表示数据已拉完 - 不要在循环里新建 clientset 实例,复用同一个 clientset 更安全高效
Node 列表本身很简单,但真正上线时容易卡在权限、证书路径、分页和状态解析这四个点上。尤其是跨集群或混合云场景,Status.Addresses 的结构可能不一致,得自己做 fallback 处理。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











