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

前情提要

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

golang 的依赖管理

image

这是一个环境变量,用于指定工作空间的位置。 在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 并且全局处理依赖呢!


    image

    说明: 一旦配置了 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
image

步骤解析: 这一步,主要为了获取系统用于调用 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种吧!要清楚怎么链接,才能更好的开发设计,云原生未来已来。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容