对伊利网站建设建议,长沙市网站设计公司,企业网站宣传,模板做图 网站有哪些文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern… 文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubernetes 服务 (create-service)启动 Spring Boot 容器 (springboot-container) 完整workflow内容 在实现 Spring Boot 项目的 CI/CD 流程时可以使用 Argo Workflows 来自动化构建、测试和部署过程。Argo Workflows 是一个 Kubernetes 原生的工作流引擎能够在 Kubernetes 集群中定义、运行、监控和管理复杂的工作流。
基础镜像制作
基础镜像
FROM openjdk:8-jdk-slim这行指定了构建的基础镜像是 openjdk:8-jdk-slim。这是一个包含了 Java 8 开发工具包JDK的精简版镜像适用于 Java 开发和运行环境。
设置镜像源并安装工具git
RUN echo deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib /etc/apt/sources.list \ apt-get update \ apt-get install -y git wget tar \ apt-get clean \ rm -rf /var/lib/apt/lists/*更改 apt 源使用阿里云的 Debian 镜像源bullseye提高安装软件包时的速度和稳定性尤其是在中国地区。 更新软件包索引apt-get update 更新包索引。 安装软件包通过 apt-get install -y 安装 git用于版本控制、wget用于下载文件、和 tar用于解压文件。 清理缓存使用 apt-get clean 清理下载缓存减少镜像体积。然后rm -rf /var/lib/apt/lists/* 删除 apt 包索引文件进一步减小镜像体积。
下载和安装 Maven
RUN wget https://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.tar.gz -P /tmp || (echo Maven download failed! exit 1)下载 Maven使用 wget 从阿里云镜像站点下载 Maven 3.8.6 的二进制压缩包。如果下载失败将输出错误消息并终止构建。
RUN tar -xvzf /tmp/apache-maven-3.8.6-bin.tar.gz -C /usr/share/ \ rm -f /tmp/apache-maven-3.8.6-bin.tar.gz \ ln -s /usr/share/apache-maven-3.8.6/bin/mvn /usr/bin/mvn解压 Maven解压下载的 Maven 压缩包到 /usr/share/目录。 清理临时文件删除下载的压缩包。 创建符号链接通过 ln -s 创建一个符号链接将 Maven 的可执行文件 mvn 链接到 /usr/bin/mvn使得 Maven 命令可以在任何地方使用。
设置环境变量
ENV MAVEN_HOME/usr/share/apache-maven-3.8.6
ENV PATH$MAVEN_HOME/bin:$PATHMAVEN_HOME设置 Maven 的环境变量指向解压后的 Maven 目录。更新 PATH将 Maven 的 bin 目录添加到 PATH 环境变量中这样就可以直接在命令行使用 mvn 命令。
设置工作目录
WORKDIR /app设置容器的工作目录为 /app。所有后续的命令如构建、运行程序将会在该目录下执行。这个目录是你在容器中执行应用程序的默认位置。
默认命令
CMD [bash]这个命令指定了容器启动时的默认命令是 bash。也就是说如果你运行这个容器但没有指定其他命令它将启动一个交互式的 bash shell。
最终dockerfile
FROM openjdk:8-jdk-slim# 使用 Debian 11 (bullseye) 的镜像源
RUN echo deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib /etc/apt/sources.list \ apt-get update \ apt-get install -y git wget tar \ apt-get clean \ rm -rf /var/lib/apt/lists/*# 下载 Maven
RUN wget https://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.tar.gz -P /tmp || (echo Maven download failed! exit 1)# 解压 Maven 并创建符号链接
RUN tar -xvzf /tmp/apache-maven-3.8.6-bin.tar.gz -C /usr/share/ \ rm -f /tmp/apache-maven-3.8.6-bin.tar.gz \ ln -s /usr/share/apache-maven-3.8.6/bin/mvn /usr/bin/mvn# 设置环境变量
ENV MAVEN_HOME/usr/share/apache-maven-3.8.6
ENV PATH$MAVEN_HOME/bin:$PATH# 设置工作目录
WORKDIR /app# 默认命令
CMD [bash]
执行构建
docker build -t git-maven-base:v1 . -f Dockerfile制作ci argo workflow 模版
volumeClaimTemplates
volumeClaimTemplates:- metadata:name: shared-workdirspec:accessModes: [ReadWriteMany]resources:requests:storage: 1Gi- metadata:name: maven-repo-cachespec:accessModes: [ ReadWriteMany ]resources:requests:storage: 2Gishared-workdir: 这个 PVC 用于在工作流中的不同任务之间共享数据。它的存储请求为 1 GiB并且支持 ReadWriteMany意味着多个 pod 可以同时读写该存储。 maven-repo-cache : 用于缓存 Maven 本地仓库的数据。它的存储请求为 2 GiB同样支持 ReadWriteMany可以在不同的 pod 之间共享缓存数据避免每次构建时都重新下载依赖。
templates
在 templates 部分定义了多个步骤的模板每个步骤会在不同的容器中执行。
main 模板
- name: maindag:tasks:- name: git-clonetemplate: git-clone- name: docker-buildtemplate: docker-builddependencies: [git-clone]dag这里使用的是 DAG有向无环图 结构git-clone 任务是 docker-build 的前置依赖即 docker-build 需要在 git-clone 完成后才开始执行。
git-clone 模板
- name: git-clonecontainer:image: git-maven-base:v1command: [sh, -c]args:- |git clone https://gitee.com/qfxcoffee/shield.git /srccd /src/arthas-study mvn clean package -DskipTestscd /src/arthas-study/targetmv arthas-study.jar /src/arthas-study.jarmv /src/arthas-study/docker/Dockerfile /src/cp -r /src/. /mnt/ # 将文件复制到挂载的 PVC 中volumeMounts:- name: shared-workdirmountPath: /mnt # 挂载到容器的 /mnt 目录- name: maven-repo-cachemountPath: /root/.m2/repository # 挂载到 Maven 本地仓库路径
git-clone 任务使用一个 git-maven-base:v1 的镜像来执行 Git 克隆操作并且使用 Maven 构建项目。
构建过程中Maven 会将依赖缓存到 /root/.m2/repository并且将源码和构建产物如 arthas-study.jar 和 Dockerfile复制到 /mnt这个路径会映射到共享的 PVC (shared-workdir)保证不同任务之间的数据共享。
docker-build 模板
- name: docker-buildcontainer:image: docker:19.03.12-dindcommand: [ /bin/sh, -c ]args: [docker info cd /mnt docker build -t my-image:v1 .]volumeMounts:- name: shared-workdirmountPath: /mnt # 挂载到容器的 /mnt 目录- name: docker-socketmountPath: /var/run/docker.sock- name: maven-repo-cachemountPath: /root/.m2/repository # 挂载到 Maven 本地仓库路径docker-build 任务使用 docker:19.03.12-dind 镜像Docker-in-Docker这意味着可以在容器内执行 Docker 命令。它会进入挂载的 /mnt 目录执行 docker build 来构建 Docker 镜像。 挂载了 docker-socket这样容器可以与宿主机上的 Docker 服务进行通信执行构建命令。
volumes
volumes:- name: docker-sockethostPath:path: /var/run/docker.socktype: Socket- name: maven-repo-cachehostPath:path: /root/.m2/repositorytype: Directory docker-socket: 宿主机上的 Docker 套接字 (/var/run/docker.sock) 被挂载到容器中使得容器能够访问宿主机的 Docker 引擎从而执行 Docker 命令。 maven-repo-cache: 这里挂载了宿主机上的 /root/.m2/repository 目录到容器中用于缓存 Maven 本地仓库。这意味着 Maven 任务在执行时会使用这个缓存而不必每次都从远程仓库下载依赖减少了构建时间。
hostPath 和 volumeClaimTemplates 中的 PVC 用法
hostPath 通过指定宿主机上的目录或套接字让容器能够访问宿主机的资源。 volumeClaimTemplates 则是在 Kubernetes 中动态创建 PVC并在 Pod 内部挂载这些 PVC使得多个任务之间可以共享文件和数据。
这两种挂载方式在某些场景下配合使用可以提供灵活的数据共享和存储策略。
完整workflow文件
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: pvs-demo-
spec:entrypoint: mainvolumeClaimTemplates:- metadata:name: shared-workdir # 共享的 PVC 名称spec:accessModes: [ReadWriteMany] # 多个 Pod 可以同时读取和写入resources:requests:storage: 1Gi- metadata:name: maven-repo-cache # 用于缓存 Maven 本地仓库spec:accessModes: [ ReadWriteMany ]resources:requests:storage: 2Gitemplates:- name: maindag:tasks:- name: git-clonetemplate: git-clone- name: docker-buildtemplate: docker-builddependencies: [git-clone]- name: git-clonecontainer:image: git-maven-base:v1command: [sh, -c]args:- |git clone https://gitee.com/qfxcoffee/shield.git /srccd /src/arthas-study mvn clean package -DskipTestscd /src/arthas-study/targetmv arthas-study.jar /src/arthas-study.jarmv /src/arthas-study/docker/Dockerfile /src/cp -r /src/. /mnt/ # 将文件复制到挂载的 PVC 中volumeMounts:- name: shared-workdir # 挂载 PVCmountPath: /mnt # 挂载到容器的 /mnt 目录- name: maven-repo-cachemountPath: /root/.m2/repository # 将 PVC 挂载到 Maven 本地仓库路径- name: docker-buildcontainer:image: docker:19.03.12-dindcommand: [ /bin/sh, -c ]args: [docker info cd /mnt docker build -t my-image:v1 .]volumeMounts:- name: shared-workdir # 挂载共享 PVC确保构建上下文可用mountPath: /mnt # 挂载到容器的 /mnt 目录- name: docker-socketmountPath: /var/run/docker.sock- name: maven-repo-cachemountPath: /root/.m2/repository # 将 PVC 挂载到 Maven 本地仓库路径volumes:- name: docker-sockethostPath:path: /var/run/docker.socktype: Socket- name: maven-repo-cachehostPath:path: /root/.m2/repository # 宿主机上的目录路径type: Directory # 可以是 Directory 或 File取决于你的需求可以看到maven构建及docker构建镜像成功 制作cd argo workflow 模版
Workflow 结构
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: springboot-service-workflow-
spec:entrypoint: springboot-workflowapiVersion: argoproj.io/v1alpha1 和 kind: Workflow这定义了这是一个 Argo Workflow 类型的资源表示这个文件用于定义一个工作流。 metadata.generateName: springboot-service-workflow-这个字段为工作流生成一个唯一的名称。generateName 表示 Argo 会在每次创建工作流时为该工作流添加一个随机的后缀以确保工作流名称的唯一性。 spec.entrypoint: springboot-workflow指定工作流的入口点即从哪个模板开始执行。在这个例子中工作流会从 springboot-workflow 模板开始执行。
Templates 定义
接下来的部分定义了工作流中的多个步骤 (steps)这些步骤会按顺序执行。
创建 Kubernetes 服务 (create-service)
- name: create-serviceresource:action: applymanifest: |apiVersion: v1kind: Servicemetadata:name: springboot-servicespec:selector:app: springboot-appports:- protocol: TCPport: 8080targetPort: 8080type: NodePort # 可以根据需要修改为 LoadBalancer 或 NodePort
name: create-service这个步骤的名称。resource: action: apply表示使用 kubectl apply 命令应用 Kubernetes 资源创建一个服务。manifest: 这是一个 Kubernetes Service 的 YAML 定义描述了服务的配置。apiVersion: v1 和 kind: Service表示这个资源是一个 Kubernetes 服务。metadata.name: springboot-service服务的名称是 springboot-service。 spec: selector: 用于选择应用的 Pod。这里的选择器选择标签为 app: springboot-app 的 Pod。ports: 定义服务的端口服务监听 8080 端口并将请求转发到目标端口 8080。type: NodePort指定服务类型为 NodePort这意味着服务将暴露在 Kubernetes 节点的一个端口上便于从外部访问应用。你可以根据需要将其改为 LoadBalancer 或 ClusterIP具体取决于你的网络需求。
启动 Spring Boot 容器 (springboot-container) - name: springboot-containercontainer:name: springboot-appimage: my-image:v1 # 替换成你的 Docker 镜像command: [ java ] # 显式指定命令为 javaargs: [ -jar, arthas-study.jar ] # 显式指定 arthas-study.jar 文件作为参数ports:- containerPort: 8080env:- name: SPRING_PROFILES_ACTIVEvalue: prodmetadata:labels:app: springboot-app完整workflow内容
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: springboot-service-workflow-
spec:entrypoint: springboot-workflowtemplates:- name: springboot-workflowsteps:- - name: create-servicetemplate: create-service- - name: start-springboot-containertemplate: springboot-container- name: create-serviceresource:action: applymanifest: |apiVersion: v1kind: Servicemetadata:name: springboot-servicespec:selector:app: springboot-appports:- protocol: TCPport: 8080targetPort: 8080type: NodePort # 可以根据需要修改为 LoadBalancer 或 NodePort- name: springboot-containercontainer:name: springboot-appimage: my-image:v1 # 替换成你的 Docker 镜像command: [ java ] # 显式指定命令为 javaargs: [ -jar, arthas-study.jar ] # 显式指定 arthas-study.jar 文件作为参数ports:- containerPort: 8080env:- name: SPRING_PROFILES_ACTIVEvalue: prodmetadata:labels:app: springboot-app 可以看到springboot项目已经运行成功。
kubectl get svc -n argohttp://192.168.56.115:32356/user/1