3

基于idea做java程序的本地k8s调试-skaffold(一) - McKay

 2 years ago
source link: https://www.cnblogs.com/aarond/p/ci-1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
基于idea做java程序的本地k8s调试-skaffold(一) - McKay - 博客园

先介绍下本篇文章是基于ideas下开发微服务的场景,大家都知道微服务嘛,一个个微的服务...很多,先不谈调试,要跑起来都费力,可能的原因有:

  1. 环境变量的配置,如果多个项目穿插着来,env变量可能废了,乱了
  2. host文件的改变,有些环境变量是通过hostname来解析的,而不是ip,可能多个项目对应的hostname字符串都一个(但是ip不同),比如redis/mysql这种中间件名称的定义
  3. 有些基础服务,还不得不启动,才能有业务的run或者debug这说,不然免谈,跑不起来,比如认证服务、网关等,机器烂的话,呵呵了
  4. 其他等等等等

最后跑起来了,但是跑到运维环境里又出问题了,为啥?也许:

  1. ideas下run/debug模式和mvn打包后的jar不一致,可能class不一致,如版本不同,或者打了多个不同版本进jar里
  2. 环境变量不同,到了运维环境里,环境变量不一致,导致无法启动,比如找不到配置中心,然后就application start failed
  3. 其他等等等等

这么解决这些问题呢?用skaffold,下面先介绍下skaffold:

Skaffold是一款命令行工具,旨在促进Kubernetes应用的持续开发。

就是这么简短!就是说用k8s,然后套个持续集成的工具来自动化。只要发到和最终运维环境一致的环境下进行debug,不就解决了么。还真是,至于为什么这么说的逻辑推理,大家自己百度。

下面就看看skaffold是如何持续发布到k8s的,上个图吧:

 只需要1个按钮,就能发布到k8集群里,并且日志什么的,状态监控等等都有了,当然,前提是装完以及配置完相应插件。效果目前为止挺好。

需要安装的ideas插件:Cloud Code, 同样是google出品(skaffold同样是google出品)

 然后进行配置:

 上述红框框内的3个命令行,需要大家自行安装

  1. skaffold:https://skaffold.dev/docs/install/#standalone-binary
  2. minikube: https://minikube.sigs.k8s.io/docs/start/

安装相对容易,这里不展开了。

启动minikube集群时,需要注意些参数配置,因为防火墙的关系,默认会打包失败,或者无法下载情况出现,我这的启动参数如下:

 --force是因为我本机是ubuntu的root账号,必须加这个参数才能启动集群

--image开头的参数都是国内代理

--cpus是代表minikube所能使用的cpu核心数,默认只有2个cpus,会很慢

接下来,要让skaffold工作,就需要两种文件:

  1. skaffold定义文件
  2. k8s定义文件 

上述图片来自skaffold官网,讲的是skaffold管道,skaffold的yaml文件就是用来定义这个管道的,如下:

 artifacts:是镜像来源,对应的context路径下必须存在Dockerfile,用于打包用途

deploy用于部署管道,上图中配置为kubectl命令来部署yaml,这些yaml文件都是k8s的近原生yaml定义,说它是接近原生定义是因为里面的image会动态改变(由skaffold)

比如这个k8 pod yaml定义:

 如果直接原生方式kubectl命令行apply的话,找的是pigx-gateway这个镜像,但是最终在skaffold下,最终是会动态变更这个image属性的,如下:

68230-20220312230146851-679972004.png

 image是会变化的(由skaffold改变,见pipeline图的tag部分),细心的读者也看到了,其他好多属性是被动态加上去的,比如labels属性。

 到此为止,可以说,只要主程,或者运维,又或者架构师、开发经理,只要有那么1个人,把这么一套yaml文件push到git里,组员都能在瞬间本地生成一套和运维环境一致的集群!这次牛逼了,再也不会发上去无法运行,报错这种问题存在了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK