用 kubectl cluster-info 或 kubectl get nodes 可快速验证集群连接状态;若报错 The connection to the server localhost:8080 was refused,说明 KUBECONFIG 未配置或路径错误,Go 客户端默认读 $HOME/.kube/config,非默认路径需显式传入。

用 kubectl 命令快速确认集群连接状态
在写 Go 代码前,先确保本地能通集群——这是最容易卡住的第一步。运行 kubectl cluster-info 或 kubectl get nodes,如果报错 The connection to the server localhost:8080 was refused,说明 KUBECONFIG 没配好或 kubeconfig 文件路径不对。
Go 客户端默认读取 $HOME/.kube/config,但如果你用的是非默认路径(比如 CI 环境里临时生成的 config),必须显式传入:
restConfig, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")- 空字符串
""表示不从命令行参数读--master,只依赖配置文件 - 如果 config 文件含多个 context,需额外调用
clientcmd.NewDefaultClientConfigLoadingRules().Load()再指定Context - 权限不足时会报
Unauthorized,不是网络问题,检查 serviceaccount token 或用户证书是否过期
用 client-go 获取节点列表和状态
核心是构造 corev1.NodeList 并调用 List() 方法。注意:返回对象是深拷贝,修改 NodeList.Items 不会影响集群状态。
clientset, _ := kubernetes.NewForConfig(restConfig)
nodes, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})-
ListOptions{Limit: 10}可限制返回数量,避免大集群下 OOM - 字段筛选用
FieldSelector: "status.phase=Ready",但不支持复合条件(如and) - 如果只关心某几个字段(比如 nodeName 和 conditions),建议用
Watch()+ResourceVersion增量同步,而非频繁List()
获取命名空间下所有 Pod 并判断就绪状态
Pod 的就绪与否不能只看 Status.Phase == "Running",得查 Status.Conditions 里的 Ready 类型条件,以及 Status.ContainerStatuses 中各容器的 Ready 字段。
立即学习“go语言免费学习笔记(深入)”;
pods, _ := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
for _, pod := range pods.Items {
isReady := false
for _, cond := range pod.Status.Conditions {
if cond.Type == corev1.PodReady && cond.Status == corev1.ConditionTrue {
isReady = true
break
}
}
// 更准的方式:遍历 ContainerStatuses
allContainersReady := true
for _, cs := range pod.Status.ContainerStatuses {
if !cs.Ready {
allContainersReady = false
break
}
}
}-
pod.Status.Phase == "Pending"时ContainerStatuses可能为空,直接遍历会 panic - 使用
clientset.CoreV1().Pods(namespace).Get(...)查单个 Pod 时,ResourceVersion必须匹配当前缓存,否则可能返回 stale 数据 - 高频率轮询 Pod 状态容易触发 API server 限流(默认 20 QPS),加
time.Sleep(5 * time.Second)是常见折中
处理 403 Forbidden 和 RBAC 权限问题
Go 程序跑在集群外时,错误信息里出现 user cannot list resource "nodes" in API group "" at the cluster scope,说明 ServiceAccount 或用户没绑对应 ClusterRole。
最小权限原则下,不要直接给 cluster-admin。例如只读节点信息,应创建如下 ClusterRoleBinding:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: node-reader rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list"]
- 如果程序部署在集群内(如 Job 或 Pod),用
serviceAccountName绑定角色即可;集群外则必须用 kubeconfig 中的用户凭据 -
kubectl auth can-i --list可快速验证当前凭据权限,比改代码再试更快 - 自建集群若启用了 ABAC 或 Node 授权插件,还需检查
Node对象是否被允许访问nodes/status子资源
真正麻烦的不是连不上,而是连上了却拿不到想要的字段——比如 Node.Status.Addresses 为空,这通常是因为云厂商没填 providerID 或 CNI 插件没上报 IP,得去查对应 cloud-controller-manager 日志。


















