前一篇文章《wydevops——微服务打包发布如此简单!》介绍了wydevops本地工作模式下,直接从源码生成docker镜像并在配置的节点上运行起来。本文继续介绍wydevops直接从源码生成chart镜像并在指定的K8S集群中运行起来。

 1. 准备环境

     除了上一篇文章准备阶段需要做好的工作外,还需要安装nexus3和harbor(2.10+),也可以选择安装其一即可.

1.1 安装nexus3

      打开git bash命令行窗口,输入并回车:

docker run -d -p 8081:8081 -p 8001:8001 -p 8002:8002 --name nexus -v d:\\nexus-data:/nexus-data sonatype/nexus3

 命令行中的d:\\nexus-data目录请自行修改. 并且预先打开了8001和8002端口(可只打开一个,我们只会创建一个docker仓库) .  执行完毕后在docker desktop中可以看到:

     在浏览器中打开http://localhost:8081(首次打开需要输入默认凭证,修改密码等,这里跳过请自行百度)

        

        点击sign in输入账号和密码后, 界面显示出了设置按钮, 如下:

继续点击上图指明的设置按钮. 即进入了admin管理界面. 如下图:

       上图已经预先创建好了chartmusem(chart镜像仓库)和wydevops(docker镜像仓库, 绑定了8001端口). 这里说明一下chart镜像仓库不需要单独再绑定端口,它使用的就是8081端口. 而docker端口需要单独绑定一个连接端口(这里绑定的是8001端口, 这个端口必须存在于前面的docker run命令行中开放的端口集合中) 

        小心坑:nexus仓库一定要勾选允许匿名拉取镜像选项。harbor创建的项目一定要勾选公开选项

        接着如上图,使能Docker Bearer Token Realm, 否则docker login时会报401错误。

        至此我们已经有了nexus类型的仓库了.

1.2 安装harbor

        在生产环境中harbor应用的更广泛,因此wydevops也整合兼容了harbor类型的仓库. 我这里为了演示采用的是docker-compose方式部署harbor, 没有把它部署到K8S集群中. 效果是一样的.

安装过程如下:        

harbor-offline-installer-v2.11.0.tgz离线安装文件到D盘根目录下.

  • 打开ubuntu on windows命令行, 执行:

    cp  /mnt/d/harbor-offline-installer-v2.11.0.tgz  ~/

    tar -zxvf harbor-offline-installer-v2.11.0-rc2.tgz    

     进入解压得到的harbor目录, 执行:

cp harbor.yml.tmpl  harbor.yml

vim harbor.yml

参照上图修改harbor.yml文件的内容:

hostname: 设定为你使用的计算机的网卡IP地址,不要使用localhost或127.0.0.1.

http.port: 设定为8088端口, 不要使用80端口(80端口我留给了K8S Ingress-Nginx网关)

注释掉所有https配置节的内容.

修改后保存退出.

在~/harbor目录中执行:

sudo bash ./install.sh

等待执行完毕,可以在docker desktop中查询到harbor,如下:

 在浏览器中打开 http://localhost:8088, 输入账号:admin, 密码: Harbor12345,登录进去,即可看到如下界面:

这里我已经预先创建有两个项目: chartmuseum(chart镜像用)和wydevops(docker镜像用), 默认只有一个library项目.

这里说明一下nexus和harbor在管理镜像上的一些区别:

  • harbor要求推送的Docker镜像必须由项目前缀, nexus没有这个要求. wydevops默认统一都在镜像前加上了项目名称前缀, nexus的Docker镜像项目名称前缀使用的是其目标仓库的名称来代替项目名称. 因此nexus的docker仓库名称因尽量简洁. (可以修改默认配置禁止为nexus仓库的镜像添加项目前缀)
  • harbor最新版本已经不再使用helm push插件进行Chart镜像推送了,采用oci协议直接推送. 为了减少helm push插件安装的繁琐, wydevops在nexus模式下也不再使用helm push插件,而采用其提供的api接口推送Chart镜像.
  • wydevops为更好的适应开方环境, 在上传Docker镜像和Chart镜像前都会通过API接口先删除同名同版本的已有镜像,确保部署的镜像一定是最新的. 减少开发人员在开发环节为测试新代码不断升级版本的麻烦, 一切为了更敏捷. (安全问题可后续提供配置信息加解密机制来解决)

至此 harbor安装配置完毕.

1.3 为K8S集群安装Ingree-nginx服务

docker desktop自带的k8s默认是没有安装的Ingress资源的, 在ubuntu on windows命令行窗口执行以下命令完成Ingree-nginx服务的安装(网关默认端口为80):

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.1/deploy/static/provider/cloud/deploy.yaml  

安装完毕后,在ubuntu on windows命令行窗口中执行kubectl get pod --all-namespaces,可以看到

ingress-nginx相关的pod, 如下图表明ingress-nginx已经成功安装了

2. 修改java-sample项目的配置

    运行过wydevops-run.sh后Java-sample项目主模块目录中会多出一个wydevops文件夹和几个文件: 

    

_global_params.yaml:  全局初始化参数缓存文件, 当工作在Jenkins pipeline 模式下时多个构建阶段之间是独立的, 为了减少后续构建阶段重新初始化全局变量,第一个阶段调用wydevops.sh脚本时会带-c标志(清除现存的_global_params.yaml文件,并创建新的), 后续阶段调用wydevops.sh脚本不带-c标志(不清除_global_params.yaml,直接从该文件读取全局变量). 这样可以加快后续阶段的执行速度,又可让全局变量得以在各阶段都可访问.  

       同样的,在本地工作模式下, 默认执行build, docker, chart, package, deploy五个阶段, 如果执行到chart阶段报错退出了, 修改配置后我们重新执行, 又需要重复执行前面的build和docker阶段.这样很费时间, _global_params.yaml文件的存在也能较好的解决这个问题. 我们可以修改wydevops-run.sh文件内容,将-c标志删除,并将-S 参数中的build,docker删除. 这样执行wydevops-run.sh文件就会直接从global_params.yaml文件中加载全局变量(速度比重新读取\合并\解析全局变量快的多), 并从chart阶段开始执行后续过程. 

ci-cd.yaml: 该文件是所有配置项解析处理后的标准文件.其内存放了5个构建阶段最终的所有配置参数. 当因配置错误中断执行后,  我们想修改配置后从报错的阶段开始继续运行后面的过程时, 不能去修改ci-cd-config.yaml里面的参数,而要修改ci-cd.yaml中的参数才能其作用. 因为接续执行后面过程时-c标志会被删除, 此时不会执行从ci-cd-config.yaml读取参数的过程了.

ci-cd-config.yaml: 该文件是开发人员用来修改默认参数项的文件, 通过ci-cd-config.yaml文件开发人员可修改wydevops源码中为对应语言配置的参数模板文件_ci-cd-template.yaml中的所有参数. ci-cd-config.yaml文件中只需定义需要修改的参数的值即可, wydevops会自动合并或覆盖这些参数到_ci-cd-template模板文件中,并最终生成ci-cd.yaml 文件. 这是wydevops强大的地方之一. 它将复杂的_ci-cd-template配置模板文件隐藏到ci-cd-config.yaml配置文件的后面, 将简洁留给开发人员,将复杂留给了团队devops的运维人员. 并且wydevops也为devops的运维人员提供了一套不需要太多干涉即可正常使用的内置模板和K8S资源配置文件生成器插件集合. 开发人员也可根据需要在项目中自定义资源配置文件生成器插件,wydevops会自动扫描和加载. 下图展示了源码中现有的插件集合:

debug.txt: 是wydevops在调试模式下的默认日志输出文件

docker-run.sh: 该文件是微服务按docker部署方式部署时生成的一个中间文件,该文件最终是在远程节点上执行的.这里是为了便于验证保留了该文件,后续会移除.可以忽略该文件.

wydevops目录是wydevops的工作目录, 该目录下有5个子目录:

docker-build: docker镜像的打包目录

chart-build: chart镜像的打包目录

build-out: 各阶段输出文件的存在目录,里面存有微服务的docker镜像导出文件,chart镜像文件,离线安装包文件等

plugins: 该目录是项目级资源配置文件生成器插件的定义目录, wydevops会自动加载里面的插件.

shell: 该目录是wydevops源码中各种扩展点的项目级扩展实现脚本存放位置. wydevops会自动调用这里面的脚本(在Jenkins模式下这里存在安全性问题, 最佳实践是在让wydevops运行在一个容器中,不要在主机中直接运行, 避免恶意脚本注入导致重大损失, 本地模式下不考虑这个问题)

       发散的有点厉害, 回归到项目配置文件的修改上来: 

  • 打开ci-cd-config.yaml文件, 如果这个文件不存在,wydevops会为你生成一个, 里面默认只有deploy配置节中的部分必须的参数. 如下图: 

将deployType参数设置为k8s;

将apiServer参数设置为K8S集群的apiServer节点, 并确保能免密SSH连接成功. wydevops将自动通过SSH连接从服务器上读取Helm install安装时需要的-kubeconfig参数的值.

  • 打开wydevops-run.sh文件, 参照如下图进行修改:

上图中的IP地址和端口号要换成你的地址和端口. 参数格式说明如下:

-C, --chartRepo     string    Chart镜像仓库信息, 格式:{仓库类型(nexus或harbor)},{仓库实例名称(nexus)或项目名称(harbor)},{仓库访问地址({IP}:{端口})},{登录账号},{登录密码},{Web管理端口(RestfulAPI接口使用的端口)}
-D, --dockerRepo    string    Docker镜像仓库信息, 格式:{仓库类型(nexus或harbor)},{仓库实例名称(nexus)或项目名称(harbor)},{仓库访问地址({IP}:{端口})},{登录账号},{登录密码},{Web管理端口(RestfulAPI接口使用的端口)},{镜像名称是否带仓库实例名前缀(仅对nexus类型仓库有效,默认为true)}

至此, 项目配置文件修改完毕.

3. 执行K8S微服务部署

在wydevops-run.sh所在的目录中打开git bash命令行窗口, 执行bash wydevops-run.sh. 

等待直至运行完成,如下图:

出现上述红框内的信息,则说明微服务K8S部署已经成功.

4. 结果验证

4.1 先看K8S集群中是否存在java-sample服务相关资源

在ubuntu on windows 命令行窗口执行:

kubectl get pods --all-namespaces

kubectl get deployments --all-namespaces

 上图中红框中的内容即说明java-sample服务已经正常运行起来了

4.2 检查配置文件是否处理正确

在ubuntu on windows 命令行窗口执行:

kubectl get configMap -n develop -o yaml

通过上图我们可以看到java-sample服务的配置文件已经被装入了ConfigMap文件中了

其他的如:service资源等请大家自行检查。

4.3 通过网关访问java-sample服务

在浏览器中打开http://localhost/wydevops/v1/sample/hello, 返回如下界面即说明服务发布成功:

4.4 在nexus仓库中查询docker镜像和chart镜像

如下图:

docker仓库中存在两个带有仓库名称为前缀的docker镜像,两个版本不同。一个版本后缀有架构信息,一个没有那个后缀(多架构镜像)。这说明docker镜像生成和推送完全正确。

以下是chart仓库的内容,可以看到存在名称为java-sample的chart镜像,版本为1.0.0.

至此,wydevops部署微服务到K8S集群的演示已完毕。

5. 使用harbor仓库,再次部署java-sample服务。

修改wydevops-run.sh文件内容,如下图:

修改完毕后,在wydevops-run.sh所在的目录中打开git bash命令行窗口, 执行bash wydevops-run.sh. 后续即可参照第4节对部署结果进行验证。

这里给出harbor中项目下的镜像信息截图:

特别说明:

  • 上述两种仓库可以混用。
  • 这里默认了K8S集群内使用的docker仓库,与wydevops使用的docker仓库是同一个仓库,

        如果不同,则需要在ci-cd-config.yaml文件中配置deploy[0].k8s.dockerRepo参数,配置格式与-D参数相同。还要确保本地计算机可以访问到该仓库。

  • 最好的学习wydevops的方法是查看源码目录下script/templates/config/java/_ci-cd-template.yaml文件中的各个参数的注释,以及param-mapping子目录下*.config文件中的注释。如果你对源码感兴趣,欢迎通读源码。

至此,wydevops使用两种仓库进行K8S集群部署已经演示完毕。

6. 后续的问题

  • wydevops是如何知道要去哪些文件中读取哪些参数并赋值给其内置模板的哪个参数的?
  • wydevops是如何兼容不同开发语言项目的?
  • NodePort类型的服务如何发布?
  • 怎么构建双镜像服务?
  • 怎么一次生成多个架构类型的镜像?
  • application.yaml或application-prod.yaml文件中带有{{ .Values.* }}这样格式的参数,wydevops是怎么处理的?
  • 如果发布多个端口的服务?并且不同端口要按不同的服务类型(NodePort或ClusterIP)发布,怎么配置?
  • 如何将其他chart镜像中的服务合并到当前chart镜像中?
  • 如何将其他chart镜像中的容器合并当前chart镜像的某个容器中?
  • 如何定制自己的资源生成器插件?

....

wydevops都已经为你解决了上述问题,敬请期待后续解读。

感谢你的关注。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐