SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用

SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用

1. 创建K8s集群

1.登录EDAS控制台。

2.单击左侧导航中的集群 > 集群,单击右上角的创建Kubernetes集群

3.设置集群的基本信息。

表1. 集群参数配置表

SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用

4.在集群设置页面的右上角,最后单击创建集群

5.在当前配置确认页面,所有项目检查通过后,单击确认,启动部署。

2. 在容器服务 K8s 集群中部署应用(镜像)

EDAS 支持通过镜像部署容器服务 Kubernetes 版集群应用,您需准备好镜像,在容器服务 Kubernetes 版控制台中创建容器服务 Kubernetes 版集群,并将该集群导入到 EDAS 控制台,然后创建应用并完成部署。
容器服务 Kubernetes 版提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端极佳的 Kubernetes 容器化应用运行环境。

1.登录EDAS控制台。

2.在左侧导航栏中选择资源管理 > 集群

3.在集群列表页面单击容器服务 K8S 集群。在集群列表中选择已创建的容器服务 Kubernetes 集群,在操作列单击导入,并在导入 Kubernetes 集群的对话框中单击导入

SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用

当创建的容器服务 Kubernetes 集群的操作列的按钮变为删除,且集群状态为运行中,则表示容器服务的 Kubernetes 版集群已成功导入到 EDAS。

4.在 EDAS 控制台左侧导航栏选择应用管理 > 应用列表

5.在应用列表页面选择地域和命名空间,然后在页面右上角单击创建应用

6.在应用基本信息页面中设置应用的基本信息和参数,然后单击下一步

  • 命名空间:在左侧下拉列表选择地域;在右侧下拉列表选择命名空间,如果不做选择命名空间则设置为
  • 集群类型:在左侧下拉列表中选择集群类型为容器服务 K8s 集群,右侧下拉列表内选择具体的集群。
  • K8s Namespace:K8s Namespace 通过将系统内部的对象分配到不同的 Namespace 中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。

    default:没有其他命名空间的对象的默认命名空间。
    kube-system:系统创建的对象的命名空间。
    kube-public:此命名空间是自动创建的,并且可供所有用户(包括未经过身份验证的用户)读取。

  • 应用名称:输入应用名称。
  • 应用描述:填写应用的基本情况。

7.在应用配置页面配置镜像。应用部署方式默认选择为镜像。在我的镜像区域选择您创建的镜像。

8.设置 Pod。

  • 设置单 Pod 资源配额

    Pod 在运行失败或出现故障时,可以自动重启或者快速迁移,保证应用的高可用。有状态应用如果使用了持久化存储,能保存实例数据;无状态应用重新部署时不保存实例数据。您最多可以设置 Pod 总数为 50 。

  • 设置单 Pod 资源配额

    系统默认不做配额限制,即单 Pod 的 CPU 和 Memory 显示为 0。如果需要限制配额,请填设置数字。

9.设置启动命令和启动参数。

  • 启动命令:输入启动命令,如命令 CMD ["/usr/sbin/sshd","-D"],则在输入框内填写 /usr/sbin/sshd –D
  • 启动参数:一个参数写一行。如 args:["-c"; "while sleep 2"; "do echo date"; "done"] 中包含 4 个参数,需要分为 4 行来填写。

10.设置环境变量。
在创建应用过程中,将所填环境变量注入到即将生成的容器中,这样可以避免常用环境变量的重复添加。
假如您使用 MySQL 镜像时,可以参考如下环境变量:

  • MYSQL_ROOT_PASSWORD(必选项):用于设置 MySQL 的 root 密码,必选项。
  • MYSQL_USER 和 MYSQL_PASSWORD(可选项):用于添加除 root 之外的账号并设置密码。
  • MYSQL_DATABASE(可选项):用于设置生成容器时需要新建的数据库。

如使用其它类型的镜像,请根据实际需求进行配置。

11.设置应用生命周期管理。
容器服务 Kubernetes 集群中的应用有两种状态:

  • 无状态应用:支持多副本部署。重新部署时不保存实例数据。适用于以下使用场景:

    ①Web 应用,应用升级或迁移时,实例内数据不保留。
    ②需要灵活水平扩展,以应对业务量骤然变化的应用。

  • 有状态应用:区别于无状态应用,有状态应用会存储需要持久化的数据,在应用升级或迁移时,实例内数据不会丢失。适用于以下使用场景:

    ①需要频繁通过 SSH 到容器进行操作。
    ②数据需要持久化存储(如数据库应用 MySQL 等),或者集群之间有选举特性,服务发现的应用,如 ZooKeeper,etcd等。

有状态应用可以选择设置应用生命周期管理。

生命周期管理脚本说明:

  • Poststart 脚本:一种容器钩子。该钩子在容器被创建后立刻触发,通知容器它已经被创建。该钩子不需要向其所对应的 hook handler 传入任何参数。如果该钩子对应的 hook handler 执行失败,则该容器会被杀死,并根据该容器的重启策略决定是否要重启该容器。
  • PreStop 脚本:一种容器钩子。该钩子在容器被删除前触发,其所对应的 hook handler 必须在删除该容器的请求发送给 Docker daemon 之前完成。在该钩子对应的 hook handler 完成后不论执行的结果如何,Docker daemon 会发送一个 SGTERN 信号量给 Docker daemon 来删除该容器。
  • Liveness 脚本:一种探测容器状态的探针,探测应用是否处于健康状态。如果不健康,则删除重建容器。
  • Readiness 脚本:一种探测容器状态的探针,探测应用是否启动完成并且处于正常服务状态。如果不正常,则更新容器的状态。

12.设置完成后,单击确认创建

3. 优化镜像部署

使用通用的镜像打包出来的容器镜像体积很大,经常会达到700MB~800MB,不利于应用快速部署。

  • 原因分析:

    选择基础镜像CentOS7的镜像:CentOS7的镜像大小在200MB以上,在CentOS7上安装openjdk8就已经接近600MB,加上应用jar包镜像基本会达到700MB~800MB。

  • 优化方法:

    选择较小的基础镜像:以openjdk:8-jre-alpine作为基础镜像,openjdk:8-jre-alpine的大小不到100MB,加上jar包镜像基本为100MB~200MB。

下图为demo应用(jar包39M)和openjdk:8-jre-alpine的镜像大小:

SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用

将应用包打成镜像,需要执行以下Dockerfile代码:

FROM openjdk:8-jre-alpine

ENV ADMIN_HOME /home/admin
ENV LANG="en_US.UTF-8"
ENV TERM=xterm
ENV JAVA_OPTS=""

RUN mkdir -p /home/admin/app/
ADD nacos-service-consumer-0.0.1-SNAPSHOT.jar /home/admin/app/app.jar
RUN echo 'java -jar $CATALINA_OPTS /home/admin/app/app.jar --server.port=8080' >> /home/admin/start.sh
RUN chmod +x /home/admin/start.sh

WORKDIR $ADMIN_HOME
CMD ["/bin/bash", "/home/admin/start.sh"]

往期内容

SpringCloud迁移至EDAS微服务——Series1:组件介绍及迁移
SpringCloud迁移至EDAS微服务——Series2:在 ECS 集群中部署 Web 应用

我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术,您可用钉钉扫描下方二维码,加入阿里云SRE技术学院钉钉圈子,和更多云上人交流关于云平台的那些事。

SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用

上一篇:阿里云Web应用托管服务(web+)如何使用命令行工具变更部署环境配置?


下一篇:OpenStack如何实现高可用集群介绍