client-go获取k8s集群内部连接,实现deployment的增删改查


本文摘自网络,作者,侵删。

一开始写了一个client-java版本的,但是java放在k8s集群上跑需要装jvm而且java的包比较大,client-go版本更适合主机端,下面是整个实现

说明:k8s官方维护的客户端库只有go和python版本,所以为了稳定性建议使用这两个版本,考虑到k8s是go实现的,我这里也就选择go版本。至于客户端连接k8s集群,在具体的生产环境中不建议外部连接访问。原因一是生产环境中的k8s配置文件重要,一般如果对接其他公司的业务,虽然有鉴权,人家也不愿意把配置文件拷贝给你,因为有了集群的配置文件,外部的这个项目的权限就很大,相当于给集群开了一个隐患口子,要知道k8s集群中有可能是该公司的整个业务。原因二集群内部访问不需要那么复杂的鉴权,反而更省事点,只需要写个小应用部署到k8s集群中即可。应用已经在集群内部了,就没有鉴权的概念了,其他三方服务只需要调用小应用的api即可操作k8s。

1. 构建goWeb小应用导入依赖:

  a. 不管是走go的代理还是其他办法,这里默认能搭建goWeb项目,并且能够使用go mod tidy拉取包。

  b. 按照官方文档导入依赖这里我用的是0.17.0版本,此处有坑,不仅仅这个版本有这个坑,其他版本很有可能也有,完全正常的导入但是会存在jar包之间版本不一致问题,这个问题会导致go build无法构建,是官方自身的兼容问题,报错信息为:

  # k8s.io/client-go/rest
  ../../../../goworkspace/pkg/mod/k8s.io/client-go@v11.0.0+incompatible/rest/request.go:598:31: not enough arguments in call to watch.NewStreamWatcher
  have (*versioned.Decoder)
  want (watch.Decoder, watch.Reporter)

  c. 可以尝试手动替换k8s.io/apimachinery@v0.17.0为k8s.io/apimachinery@release-1.14来解决。在终端执行# go mod download -json k8s.io/apimachinery@release-1.14最终gomod的关于k8s的所有依赖文件如下所示:

 1 require (    
 2   k8s.io/api v0.17.0 // indirect 3   k8s.io/apimachinery v0.17.0 4   k8s.io/client-go v11.0.0+incompatible 5   k8s.io/utils v0.0.0-20191114184206-e782cd3c129f // indirect 6   sigs.k8s.io/yaml v1.1.0 // indirect 7 ) 8  9 replace (10     k8s.io/api => k8s.io/api v0.0.0-20191004102349-159aefb8556b11     k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.0.0-20191004105649-b14e3c49469a12     k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20191004074956-c5d2f014d68913     sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.3.014 )

这里参考博客为:https://segmentfault.com/a/1190000021077653?utm_source=tag-newest

最终go build就没问题了。

2. 配置集群内部访问的客户端

  a. 内部访问k8s客户端使用defaultClient即可,但是这里第二个坑,client-go里面默认的客户端寻找的是~/.kube下的config文件,并且需要集群的ip和port,也就是说需要人为的去配置环境变量以便满足ip和port的写入需要,需要提前把config放到~/.kube下。恰巧客户的环境也没配置环境变量,也没把config拷到响应的目录下,只能找其他办法。由于之前写过一个java的客户端调用,里面的defaultClient是可以访问到的。所以看下java中的寻找路径,发现了一个上下文路径的东西。最终改造client-go客户端信息如下:

 1 package utils 2  3 import ( 4     "k8s.io/client-go/kubernetes" 5     "k8s.io/client-go/tools/clientcmd" 6     "log" 7     "os" 8     "path/filepath" 9 )10 11 // 获取集群内部k8s客户端12 func K8sClient() *kubernetes.Clientset {13     // 使用当前上下文环境14     kubeconfig := filepath.Join(15         os.Getenv("KUBECONFIG"),16     )17     config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)18     if err != nil {19         log.Fatal(err)20     }21     // 根据指定的 config 创建一个新的 clientSet22     clientSet, err := kubernetes.NewForConfig(config)23     if err != nil {24         panic(err.Error())25     }26     return clientSet27 }

其中os.Getenv就是拿k8s的默认配置文件,只要该应用部署在k8s集群环境中,这个客户端就可以正确返回和使用。

3. pod列表,deployment列表,deployment扩缩容等实现

 1     // 拿客户端     2     clientSet := utils.K8sClient() 3     //获取PODS列表,不传namespace默认查全部 4     pods, err := clientSet.CoreV1().Pods(nameSpace).List(metav1.ListOptions{}) 5     if err != nil { 6         log.Println(err.Error()) 7     } 8     // deployment列表获取 9     deploymentsClient := clientSet.AppsV1().Deployments(nameSpace)10     deployments, err := deploymentsClient.List(metav1.ListOptions{})11     if err != nil {12         panic(err)13     }14     // deployment详情获取15     deploymentsClient := clientSet.AppsV1().Deployments(nameSpace)16     deployment, err := deploymentsClient.Get(deploymentName, metav1.GetOptions{})17     if err != nil {18         panic(err)19     }20     // 扩缩容,num是扩缩容至多少21   deploymentsClient := clientSet.AppsV1().Deployments(nameSpace)22    retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {23         result, getErr := deploymentsClient.Get(deploymentName, metav1.GetOptions{})24         if getErr != nil {25             panic(fmt.Errorf("失败,确认之后再试一下呗~: %v", getErr))26         }27         result.Spec.Replicas = int32Ptr(int32(num))28         _, updateErr := deploymentsClient.Update(result)29         return updateErr30     })31     if retryErr != nil {32         panic(fmt.Errorf("扩容出现问题,请检查调用~: %v", retryErr))33     }

亲测可用~,点个赞呗~


本文来自:51CTO博客

感谢作者:独孤一笑

查看原文:client-go获取k8s集群内部连接,实现deployment的增删改查

相关阅读 >>

Go mod使用

Golang 底层也用 Golang 吗?

解决Golang使用mysq无法执行多条语句

ubuntu下安装Golang

Golang标准库database连接池实现

Go-carbon1.2.4发布了!新增系列时间比较方法

Golang反射机制

Golang escape analyze

Golang测试是否能ping通

解决Go升级到1.14后无法debug

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...