关于devops:GitOps实战

12次阅读

共计 5554 个字符,预计需要花费 14 分钟才能阅读完成。

简介

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: 1
jobs:
- 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/v1
kind: Deployment
metadata:
  name: gitops-demo
  labels:
    tier: gitops-demo
spec:
  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: v1
kind: Service
metadata:
  name: gitops-demo
  labels:
    tier: gitops-demo
spec:
  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: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: gitops-demo
rules:
- 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 -e
apk add --update npm jq curl
buildVersion=`jq -r '.version' package.json`
echo "##onedev[SetBuildVersion'$buildVersion']"

npm install -g yarn
yarn install
export CI=true
yarn test
yarn build

docker 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/kubectl
sed -i "s/imageTag/@commit_hash@/g" k8s.yaml
kubectl 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 production
else
    kubectl apply -f k8s.yaml -n @branch@ 
fi;

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

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

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

kubectl get service -n <namespace>

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

感激浏览!

正文完
 0