一开始写了一个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-159aefb8556b 11 k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.0.0-20191004105649-b14e3c49469a 12 k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20191004074956-c5d2f014d689 13 sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.3.0 14 )