git push还能这样用?介绍一款基于git命令完成构建部署的工具---Gitkube

一、介绍

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://[email protected]/~/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://[email protected]/~/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亮哥公众号====

你可能感兴趣的:(git push还能这样用?介绍一款基于git命令完成构建部署的工具---Gitkube)