先介绍下本篇文章是基于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属性的,如下:

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

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

基于idea做java程序的本地k8s调试-skaffold(一)的更多相关文章

  1. 基于idea做java程序的本地k8s调试-skaffold(二)

    上一篇讲完了java代码发到本机minikube中run,这篇来讲讲minkube中进行debug(idea下) 话说,上篇是把pigx基础infra微服务都发到了minikube中,这些微服务是ru ...

  2. 要做Java程序员 需要知道那些技术 重点有那些

    一.Java程序员         高级特性               反射.泛型.注释符.自动装箱和拆箱.枚举类.可变               参数.可变返回类型.增强循环.静态导入     ...

  3. 第一次做Java程序注意事项

    public class myapp{ public static void main(String[] args){ System.out.println("Hallo Java!&quo ...

  4. java程序的10个调试技巧

    参看下面链接:http://www.kuqin.com/java/20120906/330130.html

  5. hadoop程序在本地模式调试作业

    1.首先下载cygwin,例如安装在该目录下,D:\Program Files\cygwin\ 2.copy linux上的jar包到D:\Program Files\cygwin\home\lib ...

  6. 从安装linux(centos7.6)系统到部署springboot java程序到k8s(大纲)

    本文说明从安装linux系统开始,一直到在k8s运行springboot程序全过程 本文假设在自己电脑操作,因此linux系统使用vmware虚拟机,linux发行版使用centos 7.6.1810 ...

  7. CentOS修改默认编码为UTF-8,使java程序字符集默认为UTF-8

    java程序在本地接受php的utf8字符串好好的,到了服务器就行了. 解决,修改vi /etc/sysconfig/i18n,修改之后ssh断开,重连后KILL你的java. LANG=" ...

  8. java远程调试(断点)程序/tomcat( eclipse远程调试Tomcat方法)

    tomcat远程调试: 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=dt_soc ...

  9. java方法和本地方法

    java中的方法有两种,java方法和本地方法. java方法:是由java语言编写,编译成字节码,存储在class文件中的.java方法是与平台无关的. 本地方法:本地方法是由其他语言(如C.C++ ...

随机推荐

  1. 微服务架构 | 10.1 使用 Sleuth 追踪服务调用链

    目录 前言 1. Sleuth 基础知识 1.1 Sleuth 原理 2. 在服务中使用 Sleuth 追踪 2.1 引入 pom.xml 依赖文件 2.2 查看日志信息 最后 前言 参考资料: &l ...

  2. Lesson6——Pandas Pandas描述性统计

    1 简介 描述统计学(descriptive statistics)是一门统计学领域的学科,主要研究如何取得反映客观现象的数据,并以图表形式对所搜集的数据进行处理和显示,最终对数据的规律.特征做出综合 ...

  3. AT2401 [ARC072C] Alice in linear land

    基于观察,可以发现这样一条性质: 我们并不关心当前位置和终点的绝对关系,只在乎当前位置和终点的距离,当这个距离确定的时候接下来能走到的位置也是确定的. 基于这个观察可以发现,本质上每个位置的状态就是和 ...

  4. @property修饰符

    @property修饰符 修饰是否生成getter方法的 readonly 只生成setter方法,不生成getter方法 readwrite 既生成getter 又生成setter方法(默认) @p ...

  5. endl与\n的区别

    看C++Primer的时候看到的,然后去百度了一下: 比较明白的解释: 1.区别在于: \n只代表换行的转义字符 endl除了代表换行,还紧跟着清出缓冲槽 2.接下来我们看一下具体内容的辨析: 要明白 ...

  6. iOS中处理时间的类

      登录|注册     sakulafly的专栏       目录视图 摘要视图 订阅 Markdown博文大赛清新开启    天天爱答题 一大波C币袭来    中国云计算大会演讲议题公布     大 ...

  7. shell脚本之循环语句与函数

    shell脚本之循环语句与函数 echo的用法: echo -n #表示不换行输出 echo -e #输出转义字符,将转义后的内容输出到屏幕上 转义字符: \n :换行,被输出的字符从"\n ...

  8. Vue 子组件更新父组件的值

    今天在使用Vue中遇到了一个新的需求:子组件需要修改由父组件传递过来的值,由于子组件的值是由父组件传递过来的,不能直接修改属性的值, 我们想改变传递过来的值只能通过自定义事件的形式修改父组件的值达到修 ...

  9. 07.python语法入门--流程控制

    分支结构 什么是分支结构 为什么要用分支结构 如何使用分支结构 if语法 if应用案例 循环结构 什么是循环结构 为什么要用循环结构 如何使用循环结构 while循环语法 while循环应用案例 fo ...

  10. redis(一)-----初识redis

    Redis是一种基于键值对(key-value)的NoSQL数据库 因为Redis会将所有数据都存放在内存 中,所以它的读写性能非常惊人.不仅如此,Redis还可以将内存的数据利 用快照和日志的形式保 ...