基于 Golang 的 K8s 二次开发细节汇总

您所在的位置:网站首页 golang的开发工具 基于 Golang 的 K8s 二次开发细节汇总

基于 Golang 的 K8s 二次开发细节汇总

2023-07-04 02:21| 来源: 网络整理| 查看: 265

前情提要

针对 K8s 进行二次开发设计时,通常会采用 kubebuilder & client-go 的方式进行远程调用,通过 golang 进行开发时,往往需要基于项目实现部分业务逻辑通过汇总,这个方式是基于 golang 进行展开的,本博客将从以下层面展开针对 client-go 的一些注意问题,分别是 golang 的依赖管理;K8s 的认证管理;client-go 的接入实现;

golang 的依赖管理

这是一个环境变量,用于指定工作空间的位置。 在 G O P A T H / s r c 目 录 中 , 我 们 为 每 个 开 始 处 理 的 项 目 创 建 一 个 新 目 录 , 之 所 以 存 在 GOPATH/src目录中,我们为每个开始处理的项目创建一个新目录,之所以存在 GOPATH/src目录中,我们为每个开始处理的项目创建一个新目录,之所以存在GOPATH,是因为: GO代码中的所有导入声明均通过导入路径以及$GOPATH/src中的目录(其中go工具可以计算所有导入的软件包)引用了一个软件包,存储go get检索到的依赖项。

GOPATH 方式依赖管理 默认我们的 go 包依赖,在没有开启 go mod 时,我们的依赖文件会默认保存在 $GOPATH/src 目录下,个人项目库: github.com/vpc123/demo # 获取依赖文件目录 go get github.com/vpc123/xxx # 切换到 $GOPATH/src 路径下,查看依赖是否下载 ls $GOPATH/src/github.com/vpc123/xxx goMod 方式依赖管理 如何开启 goMod 并且全局处理依赖呢! 说明: 一旦配置了 GO111MODULE=on 系统则会自动的采用 goMod 进行项目包的依赖管理,后续使用 go get 项目包时,依赖包文件将会下载到默认路径 $GOPATH/pkg/mod 的目录下下,所有资源都会存放在此处: 以下展开一个项目 demo: # 进入全新的项目 demo cd $GOPATH/src/demo # 生成 go.mod & go.sum go mod init go mod tidy # 更新依赖存储路径 go get ./...

备注: 此处所有的依赖几乎都是默认最新的版本,如果项目需要完成依赖的处理,我们则需要进行依赖的管理工具进行项目处理,因为团队开发过程中可能会用到不同版本的依赖包文件,更新比较频繁的依赖包则有可能会出现接口函数的冲突问题,需要留意小心。

K8s 的认证管理

项目基于 K8s/k3s 的二次开发过程中,往往需要频繁的进行 Apiserver 的接口调用,如何生成并调用接口的认证信息将会是很关键的一步呦!

Token 管理 Token实际就是在计算机身份验证中的令牌(临时)的意思。 当用户向后端发起数据请求的时候,后端需要对用户进行身份验证,但是我们又不想每次都输入用户名和密码,这是就需要一个标识来证明自己的身份,这个标识就是token。 # 创建一个名叫 vpc-admin 命名空间在kube-system 下的服务账户 kubectl create serviceaccount vpc-admin -n kube-system # 针对账号 vpc-admin 进行赋权 kubectl create clusterrolebinding vpc-admin --clusterrole=cluster-admin --serviceaccount=kube-system:vpc-admin # vpc-admin 绑定为集群账户(显示出名字为vpc-admin-*的第一个匹配账户的详细信息) kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/vpc-admin/{print $1}') # 集群中的账户查看 kubectl -n kube-system get sa | grep vpc-admin

步骤解析: 这一步,主要为了获取系统用于调用 K8s 系统的 Token 信息,用于工具链接操作呦!

Kubeconfig 管理 # 获取 token 的加密文件(文件转成字节进行获取) cat ~/.kube/config | base64

说不定是个技巧呢!记得换行

client-go 的接入 package main import ( "context" "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/log" ) type Config struct { Host string Token string Port int } func main() { clientSet,_:=NewKubernetesClient(&Config{ Host: "192.168.139.134", Port: 6443, Token: "eyJhbGciOiJSUzI1NiIsImtpZCI6Ikg3THcwRzVHTkdQNDREUi1fRjlQOE45NjBUd29pZDQydEs4Tmd1SFJpNnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tbWpudmsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjdiNGZjM2ItZGEyZS00OTdhLWJmOTEtZGFmYWU3NmU5ZTU3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.kW_8iz1GpZPWL2hqDd2Jhkc-rLEX5QPKYrDCmEATyhl_834rmxRg9PJBmRhPY6T7IL58JP9ffUXlF-m65A3H8nOi47dVoAOy9jAPul8C0jS2uZrXYB4zrz_XwXfoonK4lEJtiT86ULd3M3lrUXvEI5kR8ywn3fRBTz5hVRbs0lrgfmFRY_87zELZuBFjSi-pAZTNr_lrAUtBT3Q3h3JyDXHdUJzqoWM-WcszNAZD2wJDV06PpSkNxMOCl6l0BNvUmaY3uLODb5-2yiywasfI9Ue6vKIYEmisNTk48mvbaoIEO34Gg7N1DnvFsO7raoiV_NZ_1KCJDYnxw0jC88Cr0w", }) namespaceList, err := clientSet.CoreV1().Namespaces().List(context.TODO(),metav1.ListOptions{}) if err!=nil{ log.Log.Info(err.Error()) } //namespaces:=GetAllNamespace(clientset) var namespaces []string fmt.Println("******************") for _,nsList := range namespaceList.Items { fmt.Println(nsList.Name) namespaces=append(namespaces, nsList.Name) } fmt.Println("******************") } func NewKubernetesClient(c *Config) (*kubernetes.Clientset, error) { kubeConf := &rest.Config{ Host: fmt.Sprintf("%s:%d", c.Host, c.Port), BearerToken: c.Token, TLSClientConfig: rest.TLSClientConfig{ Insecure: true, }, } return kubernetes.NewForConfig(kubeConf) } // GetAllNamespace get all namespace in cluster. func GetAllNamespace(clientset *kubernetes.Clientset) ([]string){ var namespaces []string namespaceList, err := clientset.CoreV1().Namespaces().List(context.TODO(),metav1.ListOptions{}) if err != nil { log.Log.Info("***************err*****************") log.Log.Info(err.Error()) }else{ //fmt.Printf(namespaces[0]) for _,nsList := range namespaceList.Items { namespaces=append(namespaces, nsList.Name) } } return namespaces } 拓展阅读

go 的依赖管理在工作中很重要的,手动处理依赖其实相对来说比较繁琐,虽然目前有工具帮开发人员处理这部分以来的问题,但是对于部分同学还是要清楚其内部的原理呢!

工作中涉及到 k8s 的二次开发的同学,灵活的链接 k8s 集群这个可是万里长征第一步,但目前接入的方式也就2种吧!要清楚怎么链接,才能更好的开发设计,云原生未来已来。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3