k8s部署springcloud架构的一些心得体会_浅抒流年的博客-CSDN博客

标签: | 发表时间:2020-11-08 16:50 | 作者:
出处:https://blog.csdn.net

简介

最近在研究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-server
  namespace: local
spec:
  replicas: 1
  template:
    metadata:
     labels:
       app: cloud-zuul-server
    spec:
     containers:
     - name: cloud-module-auth
       image: registry.11wlw.cn/o2o/cloud-zuul-server
       env:
        - name: EUREKA_HOST
          value: eureka-service
        - name: CONFIG_HOST
          value: config-service
        - name: CONFIG_PROFILE
          value: newqa
       tty: true
       ports:
       - 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 架构] 推荐:

k8s部署springcloud架构的一些心得体会_浅抒流年的博客-CSDN博客

- -
最近在研究k8s,顺便将公司springcloud架构改造了一下,以更好适应用k8s来部署. 期间遇到了一些问题,自己想办法解决了. 提供者和消费者向eureka注册时的问题. 大家都知道,springcloud架构是有一个注册中心的,无论是服务提供者还是服务消费者都要注册到该注册中心上. 在上一篇博文中,已经介绍过如何把eureka部署到k8s上.

将应用从 SpringCloud 迁移到 k8s - Rason's Blog

- -
最近花了几天时间看了一下 k8s 和 istio 的文档,对容器化运维以及服务网格有了基础的了解. 俗话说读万卷书不如行万里路,于是先尝试用 minikube 练一下手,将现有了一个 Spring Cloud 项目迁移到 k8s 上来. 粗略地整理了一个整个流程,主要有以下几个改动点:. 安装 kubectl 和 minikube.

CentOS7 安装 K8S

- - 企业架构 - ITeye博客
前提:VirtualBox CentOS7. 物理机IP   192.168.18.8. 虚拟机1IP:192.168.18.100(VMaster master). 虚拟机2IP:192.168.18.101(VServer1 node1). 虚拟机3IP:192.168.18.102(VServer2 node2).

基于springcloud实现的灰度发布

- -
基于springcloud实现的灰度发布. gray-config-server 配置中心. 端口:6007,方便起见直接读取配置文件,生产环境可以读取git. 先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. gray-xxx-service 服务消费者. 调用服务提供者和服务提供者,验证是否进入灰度服务.

SpringCloud项目接入Jaeger(下) - 掘金

- -
spring-cloud-sleuth这个组件时,会面临两个问题. 首先是日志中无法显示traceId和spanId这些链路信息,其次是不能在用. spring-cloud-sleuth所提供的方式进行链路传值. spring-cloud-sleuth是将traceId等链路信息保存在. slf4j的MDC(Mapped Diagnostic Contexts)中,然后通过%X{traceId}这种方式将traceId提取出来,比如打印到控制台的默认格式是:.

Springcloud + RocketMQ 解决分布式事务

- - 掘金架构
分布式事务有哪些实现方式. 随着互联网时代的高速发展,分布式成了大型系统的标配,这是时代发展的选择. 大型分布式系统不是每个公司和开发人员都能够涉及的领域,因为大型系统后面都 隐藏着众多代名词:复杂,昂贵,高科技,人才云集,大战略. 大部分领头互联网公司甚至依托自己的分布式经验逐步建立自己的体系,并使用这套体系搭建自己的平台对内,甚至对外提供服务, 就像现在众多的云平台提供的服务,甚至有些大战略提出促进发展:大中台小前台、大炮台支援单兵作战等等.

SpringCloud Gateway与k8s_zhangjunli的博客-CSDN博客

- -
接下来的内容由以下几部分组成:. 什么是SpringCloud Gateway. SpringCloud Gateway实战参考. kubernetes上的SpringCloud Gateway. 开发k8sgatewaydemo. 什么是SpringCloud Gateway. SpringCloud Gateway是SpringCloud技术栈下的网关服务框架,在基于SpringCloud的微服务环境中,外部请求会到达SpringCloud Gateway应用,该应用对请求做转发、过滤、鉴权、熔断等前置操作,一个典型的请求响应流程如下所示:.

k8s docker集群搭建 - CSDN博客

- -
一、Kubernetes系列之介绍篇.     - 一次构建,到处运行. 2.什么是kubernetes.   首先,他是一个全新的基于容器技术的分布式架构领先方案. Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg). 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性.

深入掌握K8S Pod - Yabea - 博客园

- -
K8S configmap介绍. Pod是k8s中最小的调度单元,包含了一个“根容器”和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的基本使用,但是为了更好的应用,你需要深入了解pod的配置、调度、升级和扩缩容等. pod包含一个或多个相对紧密耦合的容器,处于同一个pod中的容器共享同样的存储空间、IP地址和Port端口.

浅谈 k8s ingress controller 选型 - 知乎

- -
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云. 业余时间比较喜欢开源,现在是Apache APISIX PPMC. 今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容需要大家对 K8S 有一定的了解,下面是我的分享. 阅读本文需要熟悉以下基本概念:. 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等云资源.