命令行应用Golang程序功能:实现kubeconfig和ServiceAccount两种模式访问k8s集群,类似kubectl工具访问k8s集群将结果输出到控制台。更多Golang开发学习资料: https://edu.51cto.com/course/31781.html

1、源码地址

2、创建命令行工程项目

1、打开windows命令行,执行安装包命令
go get github.com/spf13/cobra
go get -u github.com/spf13/cobra@latest
go get github.com/spf13/cobra-cli
go install github.com/spf13/cobra-cli@latest

2、到E:\go\path\src目录创建工程项目名(gopath下):cmd-kubectl,进入工程目录
go mod init cmd-kubectl
cobra-cli init
cobra-cli add cmd_deployment
cobra-cli add cmd_namespace
cobra-cli add cmd_pod
cobra-cli add cmd_service

3、windows环境编译运行命令行应用验证程序功能

# 运行程序之前,请替换成自己k8s集群环境的kubeconfig或ServiceAccount信息
1、使用IDE命令行或命令行工具
cd /gopath/src/cmd-kubectl
go env -w CGO_ENABLED="0" # 静态编译模式
go env -w GO111MODULE=on # 包管理模块支持,会使用modules,不会去找GOPATH
go env -w GOPROXY=https://goproxy.cn,direct # 依赖包下载国内代理
go mod init # 初始化
go mod tidy # 下载依赖包或移除依赖包
go build # 编译打包程序
2、验证
./cmd-kubectl.exe pod get -n default
./cmd-kubectl.exe deployment get -n default
./cmd-kubectl.exe namespace get -n default
./cmd-kubectl.exe service get -n default

4、linux环境编译运行命令行应用验证程序功能

# 运行程序之前,请替换成自己k8s集群环境的kubeconfig或ServiceAccount信息
1、登录linux服务器(已提前配置好golang和git环境)
2、克隆代码
cd /gopath/src/
git clone https://gitee.com/anning-liang/cmd-kubectl.git
3、编译
cd /gopath/src/cmd-kubectl
export CGO_ENABLED="0" # 静态编译模式
export GO111MODULE=on # 包管理模块支持,会使用modules,不会去找GOPATH
go env -w GOPROXY=https://goproxy.cn # 依赖包下载国内代理
go mod init # 初始化
go mod tidy # 下载依赖包或移除依赖包
go build # 编译打包程序
4、验证
./cmd-kubectl pod get -n default
./cmd-kubectl deployment get -n default
./cmd-kubectl namespace get -n default
./cmd-kubectl service get -n default

# CGO_ENABLED参数说明:Go的runtime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在Go代码中调用C代码。如果标准库中是在CGO_ENABLED=1情况下编译的,那么编译出来的最终二进制文件依旧是动态链接的,即便在go build时传入 -ldflags '-extldflags "-static"'亦无用,因为根本没有使用external linker;CGO_ENABLED=0的情况下,Go采用纯静态编译;如果CGO_ENABLED=1,但依然要强制静态编译,需传递-linkmode=external给cmd/link。

# GO111MODULE参数说明:
GO111MODULE=off,无模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,模块支持,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
(1)当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。
(2)当前文件在包含go.mod文件的目录下面。

# GOPROXY参数说明:golang默认的GOPROXY是https://goproxy.io,这个是官方的设置,我们可以使用国内的代理,windows环境配置命令:go env -w GOPROXY=https://goproxy.cn,direct

5、替换命令行应用kubeconfig配置

以kubeadm安装k8s集群为例,如果使用集群安装时的kubeconfig文件为/etc/kubernetes/admin.conf
如果使用新签发kubeconfig文件,详细步骤请参考课程相关章节内容《https://edu.51cto.com/course/31436.html》

6、创建ServiceAccount账号(Golang命令行应用使用账号和token访问k8s集群)

1、创建ServiceAccount账号
# 创建账号learn-admin
kubectl create sa learn-admin
# 获取secret名
kubectl get sa learn-admin -o yaml
# 通过secret名查看token
kubectl describe secret learn-admin-token-4w69f
# 提示:secret的token名改成自己集群环境的
2、设置账号learn-admin鉴权信息和Context
# 设置账号鉴权信息。使用前一步查询的token
kubectl config set-credentials learn-admin --token <token of secret>
# 提示:token参数值改成自己集群环境
# 设置集群的访问信息
kubectl config set-cluster k8s-learn --server https://k8s.yunlearn.org:6443 --certificate-authority /etc/kubernetes/pki/ca.crt --embed-certs=true
# 创建一个Context,把集群信息和鉴权信息绑定在一起
kubectl config set-context k8s-learn-ctx --cluster k8s-learn --user learn-admin
# 创建Context
kubectl config use-context k8s-learn-ctx
3、创建一个 Role,并绑定角色
# 切回管理员context
kubectl config use-context kubernetes-admin@kubernetes
# 创建角色,在这个 Role 中授予操作相关资源的权限
kubectl create role learn-admin-role --resource pod,service,deployment,secret,ingress --verb create,update,delete,patch,get,list,watch
# 创建一个 RoleBinding,将这个 Role 和 ServiceAccount 绑定在一起
kubectl create rolebinding learn-admin-role-binding --role learn-admin-role --serviceaccount default:learn-admin