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.

使用Docker+springboot+springcloud+axon 构建CQRS/ES的微服务架构_quguang65265的博客-CSDN博客

- -
在过去几年中,软件架构的变化步伐迅速发展. DevOps,Microservices和Containerisation等新方法已成为热门话题,采用率迅速提高. 在这篇文章中,我想向您介绍一个我一直在研究的微服务项目,它结合了过去几年中两个突出的架构进步:命令和查询责任分离(CQRS)和容器化. 在第一部分中,我将向您展示使用容器分发和运行多服务器微服务应用程序是多么容易.

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水平扩容

- - Bboysoul's Blog
k8s 的好处就是可以弹性水平扩容和纵向扩容,平时纵向扩容用的不太多,所以今天说说水平扩容,在创建hpa之前你要确定集群中已经安装了metrics-server,我使用的是k3s,直接自带. 首先创建需要的容器,下面是dockerfile. 原理就是当你访问index.php的时候会进行一个循环计算来提高cpu的使用率.

# [k8s] HPA: Horizontal Pod Autoscaling

- - V2EX - 技术
HPA 是 K8S 的一大利器. 通过 HPA, 我们可以让服务的 pod 数量根据特定指标自动增加或减少, 使得在高峰期有足够的资源服务请求, 在低峰期又可以避免占用过多的资源. 同时, 在 SOA 架构下, 我们也习惯通过 HPA 来避免劳心劳力的为每个微服务计算所需的资源.. minReplicas: 允许的最小 pod 数量.