简介
GitOps是一种开发运维实际,其核心思想是将整个应用环境以文件模式保留在Git仓库中,并通过Git的相干工具对利用进行更新、回滚等操作。
OneDev(https://github.com/theonedev/...)是一个开源的自带继续集成和部署性能的Git仓库管理软件,和GitLab相似,但更简略,机器要求低,性能好。
这篇文章介绍应用OneDev对基于Kubernetes的利用实现GitOps。
创立Kubernetes集群
首先咱们须要一个Kubernetes集群,您能够应用现成的,也能够新建一个。这里咱们应用阿里云的ACK。登录到阿里云ACK控制台,并创立费用较低的ACK托管版集群。相干选项:
- 集群规格:抉择较便宜的标准版即可
- 配置SNAT:必须勾选
- 公网拜访:必须勾选
- Worker配置:两个节点即可。每个节点内存至多为4G。应用默认操作系统。登录形式为简略起见抉择明码并设置
- 组件配置:除了勾选“装置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命令,并将改变提交到主分支即可。
治理多个部署环境
在下面的部署中,咱们将示例利用间接部署到了集群的默认名字空间中。在理论我的项目中,咱们可能须要创立多个名字空间来对应多个部署环境。上面咱们创立production和test名字空间,别离对应咱们的生产和测试环境:
$ 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页面里,咱们就能够高深莫测的查看和管制各个环境的部署状况了。
感激浏览!