今日开发进度暂无,不过还是接着看service模块,使用go客户端,调用K8s集群接口,获取service相关信息。
先看一下示例代码,大家可以自行根据需求修改:
package mainimport ("context""fmt""time"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/client-go/kubernetes")func main() {// 创建Kubernetes客户端,使用InClusterConfig获取集群内部configconfig, err := rest.InClusterConfig()if err != nil {panic(err.Error())}clientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err.Error())}// 获取Namespace列表,使用ListOptions设置超时时间避免长时间等待ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()namespaces, err := clientset.CoreV1().Namespaces().List(ctx,metav1.ListOptions{})if err != nil {panic(err.Error())}// 遍历每个Namespacefor _, namespace := range namespaces.Items {// 为每个Service创建context,单独设置超时时间ctx, cancel := context.WithTimeout(context.Background(),3*time.Second)defer cancel()// 获取Namespace下的Service列表services, err := clientset.CoreV1().Services(namespace.Name).List(ctx,metav1.ListOptions{})if err != nil {panic(err.Error())}// 遍历每个Service,获取详细信息for _, service := range services.Items {// 为获取Deployments创建context,设置超时时间ctx, cancel := context.WithTimeout(context.Background(),3*time.Second)defer cancel()// 获取Service对应的Deploymentsdeployments, err :=clientset.AppsV1().Deployments(namespace.Name).List(ctx,metav1.ListOptions{LabelSelector: service.Spec.Selector})if err != nil {panic(err.Error())}// 输出Service详细信息,增加相关注释fmt.Printf("Name: %s\n", service.Name) // Service名称fmt.Printf("Namespace: %s\n", namespace.Name) // 所在Namespacefmt.Printf("Label: %s\n", service.Labels) // Service标签fmt.Printf("Selector: %s\n", service.Spec.Selector) // Service选择器fmt.Printf("IP: %s\n", service.Spec.ClusterIP) // 集群IPfmt.Printf("Port: %v\n", service.Spec.Ports) // 端口信息fmt.Printf("Deployments: %s\n", deployments.Items) // 关联的Deploymentsfmt.Println() // 空行}}}
运行时LabelSelector: service.Spec.Selector这里会报错:
因为在Kubernetes中,Service的Spec.Selector字段表示的是Service选择的Pod标签选择器,其类型是map[string]string,例如:
selector:app: myapprelease: stable
而在获取Deployments时,ListOptions的LabelSelector接收的应该是字符串形式的选择器,例如:
"app=myapp,release=stable"
所以,正确的代码应该是:
deployments, err := clientset.AppsV1().Deployments(namespace.Name).List(ctx,metav1.ListOptions{LabelSelector: labels.Set(service.Spec.Selector).String()})if err != nil {panic(err.Error())}
运行结果如下:

那么下一步就是将这些信息展示在前端,需要开放一个接口,那么其他的增删改查接口也是如此。
这时候就需要引入gin框架了:
package mainimport ("context""github.com/gin-gonic/gin"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/apimachinery/pkg/labels""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/clientcmd""k8s.io/client-go/util/homedir""path/filepath")
初始化gin路由
router := gin.Default()
定义获取Services接口
router.GET("/services", func(c*gin.Context)
然后封装Service信息
最后运行gin服务,我们看看结果:
访问就有结果了。
http://127.0.0.1:8080/services

那么这里相当于将所有需要的层都放在main函数中,这样就不利于后期的维护和扩展,所以可以参考上一篇文章说的通用目录结构分层,就可以慢慢开发了。
好了,今天的分享就到这了,祝学习顺利!
文章转载自希里安,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




