git push还能这样用?介绍一款基于git命令完成构建部署的
一、介绍
Gitkube 是一款用GO语言编写的、能够使用git push直接构建和部署Docker镜像到Kubernetes集群的工具。只需要简单的初始化设置,用户就可以使用git push自动化的构建和部署Kubernetes集群上。Gitkube与Draft、Skaffold不同的是,Gitkube不提供命令行工具,只需要使用git push命令即可,在如今Git版本控制系统一统天下的年代,只要会用git 命令就会使用Gitkube,大大降低了开发人员的学习成本。
二、特性
Gitkube具有以下特性:
1、除了服务器上的原生工具,如:git、kubectl之外,不需要安装其他依赖
2、安装简单,即插即用的安装方式
3、具备基于简单公钥(Simple Public Key)的身份验证
4、使用RBAC实现对Git 远程的访问控制
5、支持基于命名空间(Namespace)的多租户,远程只能部署到自己的命名空间
6、对代码仓库的存储库结构没有要求
三、使用场景
任何一个工具都会有具体的使用场景,任何一个工具也都不可能覆盖所有的场景。Gitkube的使用场景与其他本地开发调试工具是一样的,都是为了能够快速验证本地开发代码的正确性。最主要的一点是,Gitkube是基于Git命令的工具,只要会使用基本的git 命令,就能使用Gitkube。使用场景比如:
1、WIP(Work In Process)开发中的分支推送到Kubernetes集群进行测试。
2、打算在服务器上编写基于Git的自动化的参考实现。可以Fork这个代码库并创建自己的CRD+Controller+Git远程钩子,它可以在Kubernetes集群上执行任务。(CRD的意思是CustomResourceDefinition,是v1.7+新增的无需改变代码就可以扩展Kubernetes API的机制。)
四、架构图
下面是Gitkube的整体架构图,比较简单。主要包含以下三个组件:
1、Remote:由K8s CRD定义的Custom Resource,主要包含了用于构建镜像所需的基本信息,比如授权,镜像地址和代码库路径。
2、gitkube-controller:用于管理Remote对象并将变更提交给gitkube的控制器。
3、gitkubed:用于从代码库构建Docker镜像并进行部署的gitkubed服务。
需要在K8s 集群中安装一些组件,开发人员本地环境不需要安装任何工具。
五、安装
安装Gitkube有以下两种方式:
1、使用kubectl安装
kubectl create -f https://storage.googleapis.com/gitkube/gitkube-setup-stable.yaml
#expose gitkubed service
kubectl --namespace kube-system expose deployment gitkubed --type=LoadBalancer --name=gitkubed
使用提供的YAML文件能够直接创建gitkube的资源
2、使用gitkube CLI安装
这种安装方式是将gitkube安装到本地机器上,可以在命令行上执行gitkube命令。gitkube客户端可以安装到不同在不同的操作系统上。
Linux/MacOS
$curl https://raw.githubusercontent.com/hasura/gitkube/master/gimme.sh | bash
Windows
$scoop install gitkube
使用gitkube install安装Gitkube到K8s集群中(建议使用这种安装方式,后面在创建、安装Remote对象时会用到)
$gitkube install
到此gitkube和gitkube-controller安装到K8s集群中了
六、工作流程
使用gitkube进行本地开发的流程,主要包含四个阶段:
1、本地开发阶段
开发人员在本地代码库中进行开发,本地代码库需要包含Dockerfile和K8s部署配置文件。
下载并解压gitkube-example代码库
$ wget https://github.com/hasura/gitkube-example/archive/master.zip
$ unzip master.zip
$ mv gitkube-example-master gitkube-examples
$cd gitkube-example/mono-example
$ git init
2、设置Remote
进入代码库的根目录下创建Remote对象,一个Remote资源包含三部分:
①、authorizedKey:用于授权git push的ssh-keys列表,也就是ssh的公钥。
②、registry:镜像构建之后推送的镜像仓库地址。
③、deployments:用于构建docker镜像以及升级K8s deployment所需的信息。
创建ssh key 用于通过ssh协议执行git push命令,生成的公钥也会添加到remote.yaml文件中。
$ ssh-keygen -t rsa
创建myremote.yaml文件,gitkube提供了命令行辅助功能,通过输入一些必填项的值创建Remote文件。
$ gitkube remote generate -f myremote.yaml
> Remote name: myremote
> Namespace: default
> Public key file: /root/.ssh/id_rsa.pub
> Initialisation:
> K8s Yaml Manifests --------------------
> Helm Chart
> None
> Manifests/Chart directory: manifests
> Choose docker registry:
> docker.io/xinglongjian ---------------------
> Specify a different registry
> Skip for now> Deployment name: www
> Container name: www
> Dockerfile path: microservices/nginx/Dockerfile
> Build context path: microservice/nginx
> Add another container? N
> Add another deployment? N
3、安装Remote资源
使用上面生成的myremote.yaml文件,将Remote对象安装到K8s集群中,并提供了remote url 。(备注:在minikube中创建Remote对象时,总是不能生成remote url)
$ gitkube remotecreate-f myremote.yaml
INFO[0000] remote myremote created
INFO[0000] waitingforremoteurl
INFO[0000] remoteurl: ssh://default-myremote@219815023.us-west-2.elb.amazonaws.com/~/git/default-myremote
4、推送部署
当安装好Remote资源后,找到Remote里的remote url的值,然后在当前代码库中使用git remote add设置remote URL,使用git push 即可推送到指定的remote对象上。
# add the remote to your git repo and push:
gitremote add myremote ssh://default-myremote@219815023.us-west-2.elb.amazonaws.com/~/git/default-myremote
git push myremote master
下面是官方提供的一个演示动画可供参考。
七、总结
Git大家已经非常熟悉了,是如今用的最多的分布式版本控制工具,开发人员在写完代码提交到Git版本控制库时,都会使用Git命令。在云原生时代,如果也能利用Git的命令完成代码库镜像的构建、推送和部署流程,不需要学习和了解新的工具,新的命令,降低了学习的成本,还提升了本地开发的效率,一举两得。
Gitkube的设计理念非常好,利用了git的优势完成容器镜像的构建和部署工作,但目前Gitkube代码库的贡献者在Github上并不活跃,2019年到目前为止,仅提交过3次Commit,Gitkube在使用过程中会有很多不完善的地方,广大网友在企业内部使用时慎重,该文章只用作调用学习使用,希望能为后面的创新者提供一个好的思路,也希望Gitkube社区能活跃起来继续完善Gitkube的功能。
DevOps一直都在强调提高效率,只有让一切人工参与的步骤自动化,让没有工具支撑的工作工具化,才能提高开发人员的开发效率。从代码开发到代码部署到测试环境,这个CICD的过程是最容易利用工具自动化的方式提高效率的,而且这个阶段的工具也非常多,基于Docker容器、Kubernetes容器编排的生态下,云原生下的CICD会更加的百花齐放。
====欢迎加入DevOps亮哥公众号====