云原生应用持续交付入门:基于云效部署java应用到kubernetes集群

本文涉及的产品
云效 DevOps 流水线,基础版人数 不受限
云效 DevOps 代码管理,基础版人数 不受限
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 一般来说,使用K8S部署场景如下:对源代码进行一定的质量检测,例如单元测试、代码扫描等。将源代码构建成为可交付的制品,也就是容器镜像。对制品进行测试环境验证。使用完成验证的制品进行线上部署。使用基础设施即代码的方式,在代码库中管理与应用相关的所有YAML文件。

背景知识

一般来说,使用K8S部署场景如下:

对源代码进行一定的质量检测,例如单元测试、代码扫描等。
将源代码构建成为可交付的制品,也就是容器镜像。
对制品进行测试环境验证。
使用完成验证的制品进行线上部署。
使用基础设施即代码的方式,在代码库中管理与应用相关的所有YAML文件。
上述活动需要有不同角色的参与:开发、测试、运维。如何保证不同参与者可以使用统一的交付流程来进行协作,是云效Flow交付流水线要解决的主要问题。

通过云效持续交付流水线和kubernetes很好的结合在一起,为应用的持续交付提供了很好的基础保障。
在这里插入图片描述
开发者提交代码变更到代码仓库,云效在监听代码库的变动,一旦代码发生变化,将自动触发云效持续部署流水线一次构建任务的运行,包括代码检查、构建、测试部署、测试验证和生产环境部署等过程。

其中,在构建完之后,生成Docker镜像,并自动上传至应用镜像仓库,在部署阶段时,获取当前流水线实例构建出来的镜像版本,通过kubernetes进行容器编排部署。而这一切,都是通过自动化的手段进行完成。

导入示例源代码

1.前往:云效代码管理Codeup 超链接:

https://codeup.aliyun.com?channel=yy_yc_flowlab

2.点击【导入代码库】
在这里插入图片描述

  1. 选择【URL导入】,源代码库地址填写: https://code.aliyun.com/flow-example/spring-boot.git
    在这里插入图片描述创建流水线
    1.点击左侧九宫格图标,选择【流水线】,进入云效流水线。
    在这里插入图片描述
  2. 单击右上角新建流水线,进入流水线创建向导页面。
    在这里插入图片描述
  3. 选择模板Java·测试、构建镜像,发布到kubernets集群/阿里云容器服务,并单击创建。
    在这里插入图片描述

配置代码库

创建流水线之后会自动弹出添加代码源的窗口,选择Codeup,代码仓库选择前面我们导入的spring-boot
在这里插入图片描述
勾选【开启代码源触发】,过滤条件填写 .*
这样后续master分支一旦进行了修改,将会自动触发流水线构建、测试、部署。
在这里插入图片描述

创建镜像仓库

在配置云效流水线的镜像构建任务前,需要先创建容器镜像仓库,以便存储镜像。

如果您已有阿里云容器镜像仓库,本步骤可以省略。

前往:阿里云容器镜像服务台,选择【个人实例】
在这里插入图片描述
选择【创建个人版】
在这里插入图片描述
设置阿里云Docker Registry登录密码,然后单击确定。

在这里插入图片描述
在这里插入图片描述
设置完密码后,开始创建镜像仓库。注意下方图片中的区域可以自由选择,但在下一步配置云效流水线时需要用到。

如下图,此处我们选择华东2(上海)
在这里插入图片描述
在这里插入图片描述
填写命名空间、仓库名称,自定义即可
在这里插入图片描述
在这里插入图片描述
选择本地仓库,点击【创建镜像仓库】,即可完成镜像仓库的创建
在这里插入图片描述

配置流水线构建任务

已有容器镜像仓库后,我们继续来配置云效流水线。
在这里插入图片描述
如上图,单击【Java 构建Docker镜像并推送镜像仓库】流程配置。

单击展开镜像构建并推送至阿里云镜像仓库,然后单击新建服务授权。同意授权之后,云效流水线Flow会被授予前面的阿里云镜像仓库权限。

在弹出的云资源授权页面单击同意授权。
在这里插入图片描述
接下来完成区域、仓库的配置。标签填入“${DATETIME}”,表示以流水线触发时的时间戳作为镜像的标签。Dockerfile路径填入 Dockerfile2
在这里插入图片描述

获取kubernetes集群配置文件

注意:本步骤所有操作均需新建无痕窗口,并使用第一步创建好的阿里云RAM账号

1.打开浏览器的无痕模式窗口,浏览器地址栏输入 www.aliyun.com

Goole Chrome浏览器打开无痕模式的快捷键为Ctrl/Cmd+Shift+N。
2.使用左侧云产品资源列表中提供的子用户名称和子用户密码登录阿里云
在这里插入图片描述
选择【RAM用户登录】,用户名和密码填写左侧云产品资源的子用户名和子用户密码
在这里插入图片描述
在这里插入图片描述

  1. 继续在无痕窗口内操作,浏览器前往阿里云ACK控制台:
    https://cs.console.aliyun.com

可以看到,已成功为您创建一台ACK资源。

在这里插入图片描述
单击控制台左侧导航栏的集群,然后在集群列表中单击详情。
在这里插入图片描述
在集群详情页中,选择集群信息 > 连接信息 > 公网访问,然后单击复制,将集群配置文件内容保存下来,接下来的云效流水线配置部署任务将会用到集群连接信息。
在这里插入图片描述

配置流水线部署任务

1.切回原来的云效流水线配置窗口, 单击kubernets发布任务,进入配置,然后单击新建连接。
在这里插入图片描述

  1. 集群类型选择自定义集群,填写集群名称,然后将步骤二中保存的集群配置文件内容粘贴到集群配置文件文本框中,最后单击保存。
    在这里插入图片描述
  2. YAML路径修改为app-configs/manifest-app。
    在这里插入图片描述
  3. 单击添加参数,参数类型选择上游输出,参数名填入IMAGE,参数值选择镜像构建并推送到阿里云镜像仓库.镜像VPC地址。
    这样在运行时,云效Flow会把YAML路径下的所有文件中的${IMAGE}都替换成镜像的地址,然后再进行kubectl发布。
    示例代码库中的文件https://code.aliyun.com/flow-example/spring-boot/blob/master/app-configs/manifest-app/app.yaml的内容如下,所以其中的${IMAGE}就会被替换成实际的镜像地址。

    在这里插入图片描述
  4. 再次单击添加参数,参数类型选择自定义,参数名称填入HOST,参数值填入ACK集群的测试域名。
    这样yaml文件中的${HOST}就会被替换成实际的测试地址。
    示例代码库中的文件https://code.aliyun.com/flow-example/spring-boot/blob/master/app-configs/manifest-app/ingress.yaml的内容如下,所以其中的${HOST}就会被替换成实际的测试地址。

在这里插入图片描述

请参考以下步骤查询集群的测试域名:

返回之前打开的无痕窗口,在集群详情页,单击集群信息 > 基本信息,然后单击复制测试域名,如下图所示。
在这里插入图片描述
说明:粘贴时请将测试域名的前缀*.去掉,例如cc96863588562483e873ee0c367a579b5.cn-shanghai.alicontainer.com。

添加参数后的配置页面如下所示。
在这里插入图片描述
继续点击【添加步骤】,选择【其他】-【云效运营活动验证】
在这里插入图片描述
下面的集群连接需要与上一步kubectl的发布保持一致,如下图,我们和前面保持一致填入test ,点击保存

在这里插入图片描述

运行流水线

配置完成后,单击配置页面右上角保存并运行,触发流水线。
在这里插入图片描述

访问SpringBoot示例应用

1.集群发布成功后,点击 Kubectl发布 查看集群发布日志,可以看到发布成功的HOSTS和ADDRESS地址。
在这里插入图片描述
2.以管理员身份打开本地C:\Windows\System32\drivers\etc\hosts文件,将Host地址和Address加入hosts文件(中间以空格隔开),如下图所示,最后按下Ctrl+S键保存文件。
说明: Linux和Mac系统请修改/etc/hosts文件。
在这里插入图片描述
3.在浏览器打开域名,返回页面如下所示,表示SpringBoot示例应用部署成功。
在这里插入图片描述

修改任意代码,触发持续交付

因为我们在前面开启了代码源触发,所以当检测到master分支有代码进行变更,将会自动触发流水线的运行。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
13天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
77 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
10天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
12天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
12天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
13天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
35 3
|
13天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
93 2
|
21天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
46 6