最直接方式是调用 clientset.CoreV1().Nodes().List(context, metav1.ListOptions{}),需传入有效 context 和 ListOptions;IP/主机名在 Status.Addresses 中遍历匹配 Type;Ready 状态须查 Status.Conditions 中 Type 为 v1.NodeReady 且未过期的条件;权限需 ClusterRole+ClusterRoleBinding 授予 cluster-scoped nodes/list。

用 clientset.CoreV1().Nodes().List() 获取所有节点列表
最直接的方式是调用 Kubernetes Go 客户端的 Nodes().List() 方法,它返回一个 *v1.NodeList 对象。注意必须传入有效的 context.Context 和 metav1.ListOptions{}(即使为空)。
常见错误是忽略 context 超时控制,导致请求卡死;或漏传 ListOptions 参数(Go 编译会报错:missing argument)。
- 确保已通过
rest.InClusterConfig()或clientcmd.BuildConfigFromFlags()初始化配置 -
ListOptions可用于分页:metav1.ListOptions{Limit: 500},避免集群节点多时内存暴涨 - 若在 Pod 内运行,确认 ServiceAccount 已绑定含
nodes/list权限的 Role
解析 v1.Node.Status.Addresses 提取 IP 和主机名
节点的 IP、主机名等信息不放在 Spec,而是在 Status.Addresses 字段中,类型为 []v1.NodeAddress。这个切片包含多个地址条目,Type 字段决定其含义(如 "InternalIP"、"Hostname"、"ExternalIP")。
不能假设切片顺序固定,也不能直接取 [0] —— 某些节点可能没有 ExternalIP,或 Hostname 在最后。
- 遍历
node.Status.Addresses,用if addr.Type == v1.NodeInternalIP匹配 -
v1.NodeHostName是常量,不是字符串字面量,别写成"HostName" - 部分云厂商节点(如 EKS)可能只提供
InternalDNS,需 fallback 到InternalIP
处理 node.Status.Conditions 判断节点是否 Ready
节点健康状态要看 Status.Conditions 中类型为 "Ready" 的条件,而不是看 Status.Phase(该字段已弃用且多数情况下为空)。
容易踩的坑是直接比较 condition.Status == "True",但实际值是 v1.ConditionTrue(即字符串 "True"),虽然碰巧能对,但应使用 condition.Status == v1.ConditionTrue 保证语义正确。
- 遍历
node.Status.Conditions,找cond.Type == v1.NodeReady - 注意条件可能过期:检查
cond.LastHeartbeatTime.After(time.Now().Add(-5 * time.Minute)) - 某些节点可能有多个
Ready条件(如带 taint 的节点),以最新更新时间为准
权限不足时收到 Forbidden 错误怎么办
典型错误信息是:nodes is forbidden: User "system:serviceaccount:default:my-sa" cannot list resource "nodes" in API group "" at the cluster scope。这不是代码问题,而是 RBAC 配置缺失。
必须显式授予 cluster-scoped 权限,因为 nodes 是集群级资源,Namespace 绑定的 Role 不生效。
- 创建 ClusterRole,包含
rules: [{verbs: ["list"], apiGroups: [""], resources: ["nodes"]}] - 用
ClusterRoleBinding将该 Role 绑定到 ServiceAccount,不要用RoleBinding - 验证权限:运行
kubectl auth can-i list nodes --as=system:serviceaccount:default:my-sa
字段嵌套深、权限跨 scope、状态判断逻辑分散——这些地方最容易漏测,上线前建议用真实集群节点跑一次全路径。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











