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

如何在K8s集群中以编程方式读取kubelet代理信息?

编程方式获取Kubelet代理信息

当然可以通过编程方式获取Kubelet的相关信息,以下是两种常用方案:

1. 直接调用Kubelet的原生API接口

Kubelet本身会暴露一组HTTP/HTTPS接口(默认监听10250端口),你可以通过这些接口获取代理状态、节点资源使用情况、Pod状态等信息。常见的接口包括:

  • /stats/summary:获取节点和Pod的资源使用统计
  • /metrics:获取Kubelet的监控指标
  • /pods:获取节点上由Kubelet管理的Pod列表
  • /healthz:检查Kubelet健康状态

Go代码示例

你可以用标准库的net/http包发起请求,同时需要处理Kubelet的认证(通常是证书认证或Service Account Token认证):

package main

import (
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	nodeName := "your-node-name"
	kubeletPort := "10250"
	apiPath := "/stats/summary"

	// 加载CA证书(从kubeconfig路径或集群默认位置读取)
	caCert, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt")
	if err != nil {
		panic(err)
	}
	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)

	// 加载Service Account Token(集群内Pod中可直接读取)
	token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token")
	if err != nil {
		panic(err)
	}

	// 配置HTTPS客户端
	client := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				RootCAs: caCertPool,
			},
		},
	}

	// 构造请求
	req, err := http.NewRequest("GET", fmt.Sprintf("https://%s:%s%s", nodeName, kubeletPort, apiPath), nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", string(token)))

	// 发起请求并处理响应
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(body))
}

2. 使用Kubelet专用客户端库

如果你不想自己封装HTTP请求,可以使用Kubernetes官方提供的Kubelet客户端库,比如k8s.io/kubernetes/pkg/kubelet/client。不过这个库属于Kubernetes内部包,可能存在版本兼容性问题,使用时需要注意和集群版本匹配。

示例代码片段

import (
	"k8s.io/kubernetes/pkg/kubelet/client"
)

func main() {
	// 构造Kubelet客户端配置
	config := client.KubeletClientConfig{
		Port:         10250,
		EnableHttps:  true,
		TLSServerName: "",
		CAFile:       "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt",
		BearerToken:  string(token),
	}

	kubeletClient, err := client.NewKubeletClient(&config)
	if err != nil {
		panic(err)
	}

	// 调用接口获取Pod列表
	pods, err := kubeletClient.GetPods()
	if err != nil {
		panic(err)
	}
	// 处理返回的Pod数据
}

注意事项

  • 确保你的程序有访问Kubelet端口的权限(集群内Pod通常需要配置NetworkPolicy允许访问10250端口)
  • 不同Kubernetes版本的Kubelet接口可能略有差异,建议参考对应版本的官方文档
  • 如果是在集群外访问,需要通过节点的公网IP/域名,并且可能需要处理防火墙和认证配置

内容的提问来源于stack exchange,提问作者Fermat's Little Student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:52:28