拥抱云原生,如何将开源项目用k8s部署?(二)

简介: 拥抱云原生,如何将开源项目用k8s部署?(二)

4.启动脚本改造


Otter包括两个部分,管理控制台manager和工作运行节点node,正常情况下都是用各自的启动脚本startup.sh启动的。


为了适配k8s,我们需要对启动脚本做改造,本文以otter-manager的启动脚本为例,otter-node也是类似。


将启动脚本startup.sh改造为 startup-moon.sh,重点解决两个问题


  • 前台进程保持运行
  • jvm参数自定义改造


4.1 前台进程保持运行


由于容器中用entrypoint启动的进程为1号进程,一旦1号进程执行结束,容器就会退出了。


而原本的startup.sh中,用java启动后,使用 “&” 将java进程转换为后台进程,所以startup.sh作为1号进程会很快执行结束,容器就会自动退出了。


所以我们需要将1号进程保持住,不要退出。


这里考虑了两个方案:


  • Startup.sh脚本中增加一个前台进程进行保持,比如 tail -f /dev/null 命令
  • 将“&”去掉,让java启动后就作为前台进程一直保持


后来考虑了一下,还是选择了方案二。主要原因是为了利用pod自动重启的特性。


如果Java进程意外退出了,那么方案二就能使得1号进程也结束,然后pod就能自动重启了。而方案一的话,由于startup.sh脚本仍然在执行tail,所以即使java进程退出,1号进程也不会结束。


具体修改如下:

27.png


最终pod中的进程如图所示

28.png

  • 1号进程是启动脚本
  • 1号进程的子进程是otter的java应用进程(前台进程)


4.2 虚拟机大小自定义配置


由于otter项目中,将jvm的启动参数配置在了start.sh中,不方便进行手动配置。


因此,将start.sh的配置jvm参数的逻辑注释掉,采用自己配置的环境变量JAVA_OPTIONS进行注入。

29.png


这个环境变量的注入方式也比较简单,就是在Deployment中的env配置的(蓝色框部分),方便以后手动修改jvm参数大小而不用修改镜像。

30.png


5.k8s上固定IP/Port访问


otter-node的部署中,有个比较特殊的地方。


不同于普通的微服务的无状态扩展,otter-node的部署必须指定nid、ip、port,这种设计据说是为解决单机部署多实例而设计的,允许单机多node指定不同的端口(具体可以参考官方wiki,https://github.com/alibaba/otter/wiki/Node_Quickstart,这里不展开说明)。


还是直接看看如何在k8s上进行适配吧。


这里采用了k8s的NodePort进行处理。


NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。如下图所示。


31.jpg


在上面的配置中,可以使用IP1:3000 或者 IP2:3000 或者 IP3:3000 访问service。


当然,为了保证不绑定特定KVM的IP,我们在前面挂一个SLB服务,通过访问SLB的 虚拟IP:PORT 的形式访问。


对于otter部署来说,otter-manager需要两组 IP:PORT、每个node需要三组 IP:PORT。


注意,由于otter部署中,每个node需要暴露的port都是不同的,所以每次新增一个otter-node,都需要新增三组 IP:PORT。


我们以otter-node为例,来看下NodePort类型的Service的yml文件吧。

32.jpg

  • kind为service
  • type为NodePort
  • 配置了三组端口。port/targetport都是应用暴露端口,而nodePort是对外访问端口。


6.总结


经过这样的改造,我们就能用k8s的部署otter-manager和otter-node了,并且能够快速扩容节点、弹性使用机器资源。


我们回顾一下其中的关键问题和技巧:


  • Dockerfile编写中,可以把环境相关依赖打成一个新的基础镜像,提高后续应用镜像的构建速度。
  • Dockerfile中,可以通过ARG定义一些构建过程中的变量,进行替换。
  • 对于不同环境的配置文件,可以在不同环境(k8s的namespace)下配置不同的ConfigMap,然后在Deployment文件中通过volumeMounts的方式挂载进去。
  • 对于后台进程,需要改造为前台进程使得pod能够保持
  • 对于一些特定的环境变量,可以在Deployment中通过env进行传入。

其他开源项目如果有需要上k8s的,这些技巧应该都能用上。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2天前
|
存储 测试技术 对象存储
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。
|
10天前
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
36 12
|
10天前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
22 10
|
10天前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
|
10天前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
|
17天前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
介绍如何使用ACK Edge与虚拟节点满足DeepSeek部署的弹性需求。
|
20天前
|
Kubernetes 持续交付 数据库
阿里云ACK+GitLab企业级部署实战教程
GitLab 是一个功能强大的基于 Web 的 DevOps 生命周期平台,整合了源代码管理、持续集成/持续部署(CI/CD)、项目管理等多种工具。其一体化设计使得开发团队能够在同一平台上进行代码协作、自动化构建与部署及全面的项目监控,极大提升了开发效率和项目透明度。 GitLab 的优势在于其作为一体化平台减少了工具切换,高度可定制以满足不同项目需求,并拥有活跃的开源社区和企业级功能,如高级权限管理和专业的技术支持。借助这些优势,GitLab 成为许多开发团队首选的 DevOps 工具,实现从代码编写到生产部署的全流程自动化和优化。
|
10天前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
|
10天前
|
存储 Kubernetes 对象存储
部署 DeepSeek 但 GPU 不足,ACK One 注册集群助力解决 IDC GPU 资源不足
部署 DeepSeek 但 GPU 不足,ACK One 注册集群助力解决 IDC GPU 资源不足
|
3月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。

热门文章

最新文章