简介

GitOps是一种开发运维实际,其核心思想是将整个应用环境以文件模式保留在Git仓库中,并通过Git的相干工具对利用进行更新、回滚等操作。

OneDev(https://github.com/theonedev/...)是一个开源的自带继续集成和部署性能的Git仓库管理软件,和GitLab相似,但更简略,机器要求低,性能好。

这篇文章介绍应用OneDev对基于Kubernetes的利用实现GitOps。

创立Kubernetes集群

首先咱们须要一个Kubernetes集群,您能够应用现成的,也能够新建一个。这里咱们应用阿里云的ACK。登录到阿里云ACK控制台,并创立费用较低的ACK托管版集群。相干选项:

  1. 集群规格:抉择较便宜的标准版即可
  2. 配置SNAT:必须勾选
  3. 公网拜访:必须勾选
  4. Worker配置:两个节点即可。每个节点内存至多为4G。应用默认操作系统。登录形式为简略起见抉择明码并设置
  5. 组件配置:除了勾选“装置Ingress组件“,其余组件均不须要

集群创立胜利后,将连贯信息里的公网拜访凭据复制到本地文件$HOME/.kube/config并运行如下命令确认可能连贯到集群(如果本地还没有kubectl,能够参照此文先进行装置):

$ kubectl cluster-info 

因为国内拜访官网Docker Registry太慢,咱们还须要应用阿里的容器镜像服务。拜访容器镜像服务,并在适合的命名空间内创立镜像仓库gitops-demo。为不便配置,仓库类型抉择公开。代码源抉择本地仓库。镜像仓库创立后,详情页里查看所在阿里云区域的docker registry(比方http://registry.cn-shanghai.aliyuncs.com),并确保在命令行里能用适合的用户名和明码登录该registry。

部署OneDev

为不便对集群里的利用进行管制,咱们将OneDev部署到Kubernetes集群里。

1.运行上面的命令设置默认的storageclass。因为OneDev的部署须要申请贮存卷(详见下步):

kubectl patch storageclass alicloud-disk-ssd -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

2.下载OneDev的K8s资源定义, 解压并运行如下命令(OneDev部署会创立两个存储卷:100G的用来存储Git仓库,20G的用来存储MySQL数据库,存储卷的大小能够在文件k8s-resources/production/disk-settings.yaml中进行批改):

$ cd k8s-resources/production$ kubectl apply -k .

3.部署实现后,运行上面的命令获取OneDev服务的external ip(如果external ip还未调配,期待片刻后再重试):

$ kubectl get services -n onedev

4.在浏览器内拜访地址http://<OneDev external ip>并按提醒配置OneDev(除了创立管理员账号外,其余均用默认设置)。如果网页无法访问,期待片刻再重试。

创立示例利用

接着咱们配置一个示例利用:

1.在OneDev Projects页面中创立一个名为gitops-demo的我的项目
2.在命令行下运行如下命令创立一个react我的项目并push到OneDev(该步骤须要node.js运行环境,具体参照react文档:

$ npx create-react-app gitops-demo $ cd gitops-demo$ git remote add origin http://<OneDev external ip>/gitops-demo$ git push --set-upstream origin master (应用之前创立的OneDev管理员作为push的账号)

3.刷新OneDev示例我的项目的_Files_页面,并按下图所示点击_Add build spec_链接:

4.在build spec编辑页面中,点击Edit Source(留神之前不要减少任何Job),而后将build spec的源代码替换为如下内容:

version: 1jobs:- name: CI  image: node:15.4-alpine  commands:  - set -e  - ''  - apk add --update jq  - buildVersion=`jq -r '.version' package.json`  - echo "##onedev[SetBuildVersion '$buildVersion']"  - ''  - yarn install  - ''  - export CI=true  - yarn test  triggers:  - !BranchUpdateTrigger {}  retrieveSource: true  cloneCredential: !DefaultCredential {}  cpuRequirement: 250m  memoryRequirement: 128m  retryCondition: never  maxRetries: 3  retryDelay: 30  caches:  - key: npm-cache    path: /root/.npm  timeout: 3600

5.保留并提交改变。如下图所示,OneDev将主动对示例我的项目进行构建:

施行GitOps

咱们曾经可能构建示例利用,上面着手将它部署到Kubernetes中:

1.要部署到Kubernetes中,咱们首先须要构建示例利用的docker image。在示例我的项目的根目录创立文件Dockerfile,内容如下:

FROM nginx:1.19.5 COPY build /usr/share/nginx/html EXPOSE 80

文件提交后OneDev会主动构建,这时不用理睬。

2.持续在根目录创立用来形容部署的Kubernetes资源文件k8s.yaml。内容如下。留神须要将<docker repository>替换为容器仓库的地址,比方registry.cn-shanghai.aliyuncs.com/test/gitops-demo,具体地址在前述阿里云容器镜像仓库的详情页里有显示。

apiVersion: apps/v1kind: Deploymentmetadata:  name: gitops-demo  labels:    tier: gitops-demospec:  selector:    matchLabels:      tier: gitops-demo  strategy:    type: Recreate  template:    metadata:      name: gitops-demo      labels:        tier: gitops-demo    spec:      containers:      - name: gitops-demo        image: <docker repository>:imageTag        ports:        - containerPort: 80---apiVersion: v1kind: Servicemetadata:  name: gitops-demo  labels:    tier: gitops-demospec:  type: LoadBalancer  ports:  - name: http    port: 80    targetPort: 80    protocol: TCP  selector:    tier: gitops-demo

3.为了可能将示例利用的image公布到阿里云的docker registry,OneDev须要晓得docker registry的明码。在示例我的项目里减少一个job secret,给它一个名字,比方docker-registry-password,并将值设置为docker registry的拜访明码。如下图所示:

4.因为须要在构建时将示例利用部署到Kubernetes,OneDev须要额定的集群权限。在本机创立文件gitops-demo-role.yaml并蕴含如下内容:

kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:  name: gitops-demorules:- apiGroups: [""]  resources: ["services"]  verbs: ["get", "create"]- apiGroups: ["apps"]  resources: ["deployments"]  verbs: ["get", "patch", "create"]

而后在命令行下运行如下命令:

$ kubectl apply -f gitops-demo-role.yaml

接着在OneDev的治理页面里删除原有的auto-discover job executor,并新建一个Kubernetes Executor。设置名字,并将字段Cluster Role设置为gitops-demo。其余内容放弃不变,而后保留。具体如下所示:

5.最初在OneDev里回到示例我的项目页面,在文件根目录中点击.onedev-buildspec.yml查看详情,而后进行编辑。将image字段设置为docker:19.03.5,并将commands字段设置为如下内容。留神须要将<docker-registry-login>替换为前述阿里云docker registry的登录名,将<docker repository>替换为容器仓库的地址(例如registry.cn-shanghai.aliyuncs.com/test/gitops-demo),以及将<docker registry>替换为所在阿里云区域的docker registry(例如registry.cn-shanghai.aliyuncs.com)。这些属性均可在前述容器镜像仓库的详情内查看。

set -eapk add --update npm jq curlbuildVersion=`jq -r '.version' package.json`echo "##onedev[SetBuildVersion '$buildVersion']"npm install -g yarnyarn installexport CI=trueyarn testyarn builddocker build -t <docker repository>:@commit_hash@ .docker login -u <docker-registry-login> -p @secrets:docker-registry-password@ <docker registry>docker push <docker repository>:@commit_hash@curl -o /usr/local/bin/kubectl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"chmod +x /usr/local/bin/kubectlsed -i "s/imageTag/@commit_hash@/g" k8s.yamlkubectl apply -f k8s.yaml -n default

6.保留并提交改变。OneDev就会开始构建并部署示例利用。构建胜利后,运行上面的命令查看示例利用的external ip:

kubectl get service gitops-demo

而后就能够用浏览器关上地址_http://<gitops-demo-external-ip-address>_来拜访部署好的示例利用了。

祝贺!当初您曾经胜利配置了一个简略的GitOps流程:当有新的commit提交到主分支时(无论是通过push还是通过pull request合并),OneDev的CI工作会主动触发来构建、测试并重新部署示例我的项目。当须要回滚到前一个部署时,只须要运行git revert master命令,并将改变提交到主分支即可。

治理多个部署环境

在下面的部署中,咱们将示例利用间接部署到了集群的默认名字空间中。在理论我的项目中,咱们可能须要创立多个名字空间来对应多个部署环境。上面咱们创立productiontest名字空间,别离对应咱们的生产和测试环境:

$ kubectl create namespace test$ kubectl create namespace production

编辑build spec将Commands字段的最初一行替换为如下内容:

if [ "@branch@" = "master" ]; then     kubectl apply -f k8s.yaml -n productionelse    kubectl apply -f k8s.yaml -n @branch@ fi;

这通知OneDev将所有提交到主分支的改变部署到生产环境,并将其余分支的改变部署到和分支名雷同的命名空间中。

改变提交到主分支后,示例利用将会被部署到生产环境中。接着咱们在OneDev里创立test分支,能够看到该分支创立后,示例利用也被部署到测试环境中。

能够在命令行下运行如下命令查看特定部署环境的external ip。留神须要将<namespace>替换为对应环境的集群名字空间:

kubectl get service -n <namespace>

这样在OneDev的commits页面里,咱们就能够高深莫测的查看和管制各个环境的部署状况了。

感激浏览!