简介

最近在研究k8s,顺便将公司springcloud架构改造了一下,以更好适应用k8s来部署。期间遇到了一些问题,自己想办法解决了。在此记录下。

1. 提供者和消费者向eureka注册时的问题

大家都知道,springcloud架构是有一个注册中心的,无论是服务提供者还是服务消费者都要注册到该注册中心上。在上一篇博文中,已经介绍过如何把eureka部署到k8s上。接下来,我们应该将其他服务注册到eureka中,但是springcloud默认向注册中心注册时,是以 主机名:实例名称:端口 的形式注册上去的,注册结果如cloud-eureka-server-6f59b94548-fc9gl:o2o-gateway:9999,这样服务之间调用的时候会报unknowHostException异常。要解决这个问题,可以在springcoud项目中加入配置,使得服务向注册中心注册时,注册形式改变为 主机IP:PORT的方式。

eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port}     #springcloud版本不同,此处语法会稍有差异
eureka.instance.prefer-ip-address=true

这样服务向eureka注册的结果就会如下图一下

注意:在k8s上部署springcloud,注册上去的地址是pod地址

2. 多环境问题

所有公司肯定会有开发、测试、生产等多套不同的环境,而不同环境使用不同的配置文件,我们不可能所有环境都打一个对应环境的镜像,最理想的情况应该是所有环境都使用同一个镜像,只是在不同环境部署的时候,使用的配置文件不同而已。那么如何来实现呢?我们可以考虑把所有涉及到多环境配置的地方变量化,在部署的时候分别给这些变量不同的值来达到让项目加载不同环境配置文件的目的。
拿springcloud的网关服务来说明我是如何做的

spring.cloud.config.uri=http://${config.host:config-service}:${config.port:9999}
spring.cloud.config.name=o2o-gateway
spring.cloud.config.profile=${config.profile:default}eureka.client.serviceUrl.defaultZone=http://${eureka.host:eureka-service}:9761/eureka/
eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port}
eureka.instance.prefer-ip-address=true#client name
spring.application.name=cloud-o2o-gateway

在上边的代码中,我把涉及到多环境的地方都做了变量化,无论是配置中心地址、注册中心地址还是监听端口

然后看下我的dockerfile文件配置

FROM registry.11wlw.cn/common/java:8u111-jdk
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone
ADD /cloud-zuul-server-1.0.0.jar /
ADD ./run.sh /
ENV JAVA_OPTS=""
ENV EUREKA_HOST="eureka-service"
ENV CONFIG_HOST="config-service"
ENV CONFIG_PROFILE="default"
ENV SERVER_PORT="8105"
ENTRYPOINT [ "sh", "-c", "/run.sh" ]

我在dockerfile文件中设置了和bootstrap.properties相对应的环境变量,并赋予了默认值。

看下run.sh的内容

java $JAVA_OPTS -jar /cloud-zuul-server-1.0.0.jar \--eureka.host=$EUREKA_HOST --config.host=$CONFIG_HOST --config.profile=$CONFIG_PROFILE --server.port=$SERVER_PORT

在容器启动的时候,会去读取环境变量的值来决定服务注册到哪个环境的配置中心去,去哪个环境的配置中心拉取配置文件,拉取哪个环境的配置文件以及监听哪个端口。
这样我们在用k8s部署springcloud的时候,在部署yaml文件中通过重新赋予这些环境变量不同的值就可以达到解决这个问题的目的。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: cloud-zuul-servernamespace: local
spec:replicas: 1template:metadata:labels:app: cloud-zuul-serverspec:containers:- name: cloud-module-authimage: registry.11wlw.cn/o2o/cloud-zuul-serverenv:- name: EUREKA_HOSTvalue: eureka-service- name: CONFIG_HOSTvalue: config-service- name: CONFIG_PROFILEvalue: newqatty: trueports:- containerPort: 8105

上述yaml文件中我们通过env参数来重新为bootstrap.properties文件中的启动参数赋值,容器起来后,springcloud服务就会注册到不同的环境中,加载不同的配置文件了。

3 配置中心

springcloud架构有自己的配置中心组件,就是springConfig。我不知道别的公司是否在每套环境都搭了配置中心?但是我觉得,对于配置中心来说,所有环境可以共同只使用一套,在部署的时候,通过给CONFIG_HOST和CONFIG_PROFILE赋予不同的值的方式。

说明:整套架构要想走通,是建立在k8s安装了kubedns、ingress的基础上的

  1. springcloud各项目中eureka和config配置中配置的是eureka和config这两个pod的service的service名称,部署后通过kubedns解析成对于的ip
  2. springcloud网关服务通过ingress向外暴露服务入口
  3. 除了上述3个springcloud服务,其他服务不是必须创建pod对于的service,可以根据需要来决定

k8s部署springcloud架构的一些心得体会相关推荐

  1. ajax心得体会论文,AJAX重点知识的心得体会

    下面就为大家带来一篇 AJAX重点知识的心得体会.学习还是有点帮助的,给大家做个参考吧. AJAX是什么? 是Asynchronous Javascript And XML的首字母的缩写, 它不是一门 ...

  2. k8s集群部署springcloud 单应用

    k8s集群部署springcloud 单应用 docker配置docker私库 docker build 镜像 k8s集群部署 镜像 验证部署结果 1. docker配置docker私库 1.1 编辑 ...

  3. K8S 部署电商项目

    Ingress 和 Ingress Controller 概述 在 k8s 中为什么会有 service 这个概念? Pod 漂移问题 Kubernetes 具有强大的副本控制能力,能保证在任意副本( ...

  4. uni-app项目的收获及心得体会

    Uniapp是一种支持多端开发的框架,能够在一个项目中同时开发小程序.H5.APP等多个版本.学生教务系统包含了学籍信息.成绩查询.选课.课程表等众多模块,需要涉及到复杂的后台逻辑和数据库操作.使用U ...

  5. 实习第五天,说说心得体会

    实习第五天,说说心得体会 自我介绍 实习单位 总结 自我介绍 我是一名大四生,就读于哈尔滨理工大学软件工程专业,刚刚实习第五天(2020-10-16).现在在济南某某云计算科技股份有限公司实习. 主要 ...

  6. 从运维角度看微服务 k8s部署微服务【偏理论】【AL】

    从运维角度看微服务 & 部署微服务[偏理论] 1.微服务的特点 服务组件化: 每个服务独立开发.部署,有效避免一个服务的修改引起整个系统重新部署. 技术栈灵活: 约定通信方式,使得服务本身功能 ...

  7. K8S部署工具:KubeOperator集群部署

    K8S部署工具:KubeOperator集群部署 集群信息⚓︎ 项目: 选择集群所属项目 供应商: 支持裸金属(手动模式)和部署计划(自动模式) 版本: 支持版本管理中最新的两个 Kubernetes ...

  8. K8S部署工具:KubeOperator系统设置

    K8S部署工具:KubeOperator系统设置 系统设置⚓︎ 仓库协议: 支持 http 和 https,默认 http 仓库 IP: 默认为部署 KubeOperator 的服务器 IP.将使用该 ...

  9. K8S部署工具:KubeOperator安装部署

    K8S部署工具:KubeOperator安装部署 硬件要求⚓︎ 最小化配置 角色 CPU核数 内存 系统盘 数量 部署机 4 8G 100G 1 Master 4 8G 100G 1 Worker 4 ...

最新文章

  1. JAVA实现 springMVC方式的微信接入、实现消息自动回复
  2. 使用vb获取网页源文件并保存的简单代码
  3. 【转】linux tar.gz zip 解压缩 压缩命令
  4. Ubuntu下无法使用Secure_CRT连接服务器
  5. java需求设计_JavaWeb期末设计---需求分析文档. stage1
  6. [深度学习-理论篇]什么是卷积神经网络CNN
  7. 瑞典卡罗林斯卡医学院博士后招聘,图像流行病学和深度学习领域
  8. Android指纹识别
  9. setter方法的内存错误
  10. Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
  11. html h3标签,网站h1,h2,h3标签的用法和技巧
  12. 硕士研究生毕业论文书写格式总结
  13. 计算机专业建设会议纪要,本学期第六次专业建设工作会议纪要
  14. 如何检查电脑是否已经安装Flash Player
  15. [转]尺度不变特征变换(SIFT算法)Matlab程序代码测试例子的说明(Lowe的代码)
  16. 为计算机房的电脑安装防火墙和杀毒软件,杀毒软件和防火墙的关系,哪个重要...
  17. Linux基础学习笔记(持续更新)
  18. 计算机合并单元格怎么操作,excel怎么合并单元格,教您excel合并单元格的方法
  19. Android——DisplayMetrics之我见
  20. C语言 编程实现简单的计算器功能

热门文章

  1. Linux系统下延时任务及定时任务
  2. 欢迎进入半颗心脏博客导航一站式搜索(所有博客的汇总帖)
  3. python输出保留两位小数怎么表示_python中保留两位小数怎么表示
  4. 因特网计算机地址被称为什么,因特网上每台计算机有一个规定的“地址”,这个地址被称为地址.A.TCPB.IPC.WebD.以上都不对...
  5. JavaWeb学习:session
  6. Spring学习笔记 使用annotation配置实现Bean的auto-wiring (自动绑定)
  7. vos3000及外呼系统编码所占带宽详细说明
  8. 公司突然断网故障排查
  9. 让IE8兼容console
  10. 色彩校正中的 gamma 值是什么?