quarkus微服务应用使用kubernetes原生tekton实现devops的CI/CD构建流程 weir 2021-12-01 22:02:27.0 quarkus,tekton,k8s 852 Tekton 是一个强大而灵活的 用于创建 CI/CD 系统的开源框架,允许开发人员 构建、测试和部署 跨云提供商和本地系统。 标准化 Tekton 跨供应商、语言和部署环境标准化 CI/CD 工具和流程。它适用于 Jenkins、Jenkins X、Skaffold、Knative 和许多其他流行的 CI/CD 工具。 内置最佳实践 Tekton 可让您快速创建 CI/CD 系统,为您提供开箱即用的可扩展、无服务器、云原生执行。 最大的灵活性 Tekton 抽象了底层实现,以便您可以根据团队的需求选择构建、测试和部署工作流。 客套话说完了,大家如果像细致了解要么去官网要么自己查资料,我看中的就是原生这两个字,如果你们看过我在B站的视频,我想说下我的思想,在quarkus微服务的实现落地中尽可能使用kubernetes的原生实现,从开发到部署到持续集成,所以今天这个博客就是聚焦在quarkus微服务devops CI/CD持续集成的tekton。 多余的话不说了,首先的前置条件是搞一个kubernetes不管是集群还是mac上面的,tekton的安装我现在可能不能一下子写出来,一来时间有点长了,二来安装流程在我的记忆里我是参考官网没发生什么意外挺简单的,如果大家安装确实有什么问题我相信自己是可以解决的,容我偷个懒。 我今天写这篇博客的重点也不是为了详细介绍tekton怎么安装的,而是介绍quarkus微服务应用怎么来实现持续集成CI/CD的,所以重点还是谈谈我们现在比较常用的实现方式和tekton带来的原生实现方式跟别的实现方式的不同,持续集成工具我想没有十件也有八件,比如Jenkins,算了说实话我只用过Jenkins,tekton可能还是有些新但是前景非常好。 网上能看到的文章我也都看过了,说实话参考可以,大部分我做起来还是参考官网的,而且网上的文章也没有基于quarkus的,国外倒是有一篇文章我参考下来在关键的部分就出错了,这个我后面会说,所以这次写博客就是为了记录下来我实践的至少现在是正确的,网上文章没有一个可以放心的,当然quarkus持续集成的文章更是少之又少。 quarkus我就不再介绍了,我这段时间一直在实践落地的每个流程,如果你对quarkus有了解的话就会知道,quarkus应用可以使用简单的配置来完成编译,打包到docker仓库和发布到kubernetes,这个过程我再详细说一下,这很重要: 1.应用打jar包 2.应用生成docker镜像 3.docker镜像上传到镜像仓库 4.dock镜像部署到kubernetes集群中 这个步骤很清晰,但是quarkus可以使用一个命令来完成:mvn clean package -DskipTests -Dquarkus.kubernetes.deploy=true 你想想你们公司现在这个过程是怎么实现的,比如spring微服务是怎么实现的,再看看上面这个命令,你不心动么? 这个在开发测试阶段想想省去多少环节,一个命令就完成了一系列的持续集成工作,再加上quarkus启动速度的优势,你的机器性能越好这个过程就越丝滑(哈哈哈哈) 我们解决了开发测试阶段的问题,正式上线还是要CI/CD过程的,tekton这时就派上用场了。上线这个过程甚至可以只上线最后测试通过的docker镜像,编译打包都不需要的对不对,这个很容易理解。下面我就重点说一下这个过程, 说之前还是先给一个我参考的文章(https://www.infoq.com/articles/microservicilities-tekton/)没有这篇文章我可能开始都不知道怎么弄的。 1.拉取git仓库配置文件: apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: quarkus-member-system-source spec: type: git params: - name: url value: https://gitee.com/quarkus-microservice/quarkus-member-system.git 2.拉取docker镜像的配置文件: apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: quarkus-member-system-image spec: type: image params: - name: url value: docker.io/weir2018/quarkus-member-system:1.0.0 我最开始是放在我的docker hub 仓库下的 weir2018就是我的用户,这个你们换成你们的就行了。 3.最重要的任务配置文件: apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: build-member-app spec: # params: # - name: docker-credentials-secret # type: string # description: name of the secret holding the docker credentials # default: docker-credentials resources: inputs: - name: source type: git outputs: - name: builtImage type: image steps: - name: maven-build image: docker.io/maven:3.6-jdk-11-slim workingDir: "/workspace/source/" # script: | # #!/usr/bin/env bash # cd /workspace/source/target # ls # cat quarkus-artifact.properties command: - mvn args: - -s - "/.m2/settings.xml" - clean - compile - jib:build # - package - -DskipTests # - -Djib.to.image=hub.weir.com/weir/quarkus-member-system:latest # - -Djavax.net.ssl.trustStore=/data/hub.weir.com.jks # - -Djavax.net.ssl.trustStorePassword=336393 # env: # - name: QUARKUS_CONTAINER_IMAGE_IMAGE # value: $(outputs.resources.builtImage.url) # - name: QUARKUS_CONTAINER_IMAGE_USERNAME # valueFrom: # secretKeyRef: # name: $(params.docker-credentials-secret) # key: docker-username # - name: QUARKUS_CONTAINER_IMAGE_PASSWORD # valueFrom: # secretKeyRef: # name: $(params.docker-credentials-secret) # key: docker-password volumeMounts: - mountPath: /.m2 name: mvn-settings # - mountPath: /data # name: weir-com volumes: - name: mvn-settings configMap: name: member-maven-settings items: - key: weir.xml path: settings.xml # - name: weir-com # configMap: # name: hub-weir-com-jks # items: # - key: hub.weir.com.jks # path: hub.weir.com.jks 好好看看,我当时用了很多方式来实现最优的效果。 4.run任务配置文件: apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: build-app-run-member spec: serviceAccountName: build-bot # serviceAccountName: build-docker-bot # params: # - name: docker-credentials-secret # value: docker-credentials resources: inputs: - name: source resourceRef: name: quarkus-member-system-source outputs: - name: builtImage resourceRef: name: quarkus-member-system-image taskRef: name: build-member-app 到这里第一版的tekton就可以正产运行实现自动化构建。 但是还不是最优选择,大家了解tekton 就知道他有workspaces概念,通俗的说就是所有构建比如maven都在一个共享持久化存储那里比如maven的repository共享,settings.xml文件都是用私有的这也是共享,也能提高构建速度,加快流程。 所以今天又实现了共享存储卷的模式,首先还是环境需要搭建好就是我这边是nfs你熟悉哪个可以搭建哪个: 1.pv: apiVersion: v1 kind: PersistentVolume metadata: name: nfs spec: mountOptions: - nfsvers=3 - nolock capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: nfs nfs: path: /nfs/data/k8s server: 192.168.31.85 2.pvc: --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs spec: resources: requests: storage: 5Gi accessModes: - ReadWriteOnce storageClassName: nfs 3.任务: # workspace-mvn-task.yaml apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: mvn-task spec: workspaces: - name: maven-repo resources: inputs: - name: source type: git params: - name: GOALS description: The Maven goals to run type: array default: ["package"] steps: - name: mvn image: cnych/cloud-builders-mvn:tekton workingDir: /workspace/source command: ["/usr/bin/mvn"] args: - -Dmaven.repo.local=$(workspaces.maven-repo.path) - -s - "/.m2/settings.xml" - "$(inputs.params.GOALS)" volumeMounts: - mountPath: /.m2 name: mvn-settings volumes: - name: mvn-settings configMap: name: member-maven-settings items: - key: weir.xml path: settings.xml --- # workspace-mvn-pipeline.yaml apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: mvn-pipeline spec: workspaces: # 声明 workspaces - name: local-maven-repo resources: # 声明使用的资源 - name: app-git type: git tasks: - name: jib-build # 构建任务 taskRef: name: mvn-task # 引用上面的 mvn 任务 resources: # 传递 resources 资源 inputs: - name: source resource: app-git params: # 传递 params 参数 - name: GOALS value: ["clean","compile","jib:build","-DskipTests"] workspaces: # 传递 workspaces - name: maven-repo workspace: local-maven-repo --- # workspace-mvn-pipelinerun.yaml apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: mvn-pipelinerun spec: pipelineRef: name: mvn-pipeline resources: - name: app-git resourceSpec: type: git params: - name: url value: https://gitee.com/quarkus-microservice/quarkus-member-system.git workspaces: - name: local-maven-repo persistentVolumeClaim: claimName: nfs 还是一个重要的文件,这样就行了,我放出来几张截图: 第一次拉了maven jar包,第二次就直接打包部署了没有再去拉jar包,就说明共享卷生效了,两次的构建时间也不一样。 这就是tekton所做的工作,跟其他工具对比优劣不去下定论,我觉得还是挺好的。