• Kubernetes(K8s)部署 SpringCloud 服务实战


    1. 概述

    老话说的好:有可能性就不要放弃,要敢于尝试。

    言归正传,之前我们聊了一下如何在 Kubernetes(K8s)中部署容器,今天我们来聊一下如何将 SpringCloud 的服务部署到 Kubernetes(K8s)中。

    2. 有状态应用和无状态应用 

    我们先来了解两个概念,有状态应用 和 无状态应用。

    有状态应用:简单说就是不能简单的实现负载均衡的服务,例如:有数据产生的服务,Redis、MySql、RabbitMQ、ES等,这些服务必须通过一些较复杂的配置才能做到负载均衡。

    无状态应用:就是没有数据的应用,可以简单的实现负载均衡,复制一个节点即可,例如:SpringCloud中的业务服务。

    无状态的应用适合部署在 Kubernetes(K8s)中或者容器中。

    有状态的应用,建议直接在物理机部署,方便管理、维护。

    Eureka 服务,也属于有状态应用,因为 Eureka 服务集群需要每个节点去注册除自己之外的其他Eureka服务,配置文件有差异,因此每个节点是不一样的。

    这里我们只部署一个Eureka节点,就也使用容器部署。

    3. 场景说明

    使用之前搭建的 Kubernetes(K8s)集群,搭建的过程可参见我之前的文章《使用国内的镜像源搭建 kubernetes(k8s)集群》(https://www.cnblogs.com/w84422/p/15596883.html)。

    在 Kubernetes(K8s)集群中,搭建1个 Eureka 节点,搭建2个 Gateway 负载均衡节点,搭建2个 Eureka Client  负载均衡节点,提供一个简单的接口。

    搭建成功后,我们通过调用 Gateway 来访问 Eureka Client 的这个简单接口。

    4. 部署 SpringCloud 服务

    4.1 部署 Eureka 服务

    4.1.1 Eureka 服务 application.yml 配置

    spring:
      application:
        name: my-eureka
    server:
      port: 35000
    eureka:
      instance:
        hostname: my-eureka  
      client:
        register-with-eureka: false       # 是否发起服务注册
        fetch-registry: false             # 是否拉取服务注册表
      server:
        enable-self-preservation: false         # 是否开启自我保护,建议关闭,开启自我保护机制后,实例宕机也被不会剔除
        eviction-interval-timer-in-ms: 10000    # 每隔多久触发一次服务剔除,默认是60秒

    4.1.2 生成 Eureka 服务的 Docker 镜像

    简单起见,这里这里直接在 Kubernetes(K8s)的数据节点创建镜像,然后本地拉取,不上传到远程 Docker 仓库了。

    # vi Dockerfile

    FROM java:8
    ADD my-eureka-0.0.1-SNAPSHOT.jar my-eureka-0.0.1-SNAPSHOT.jar
    ENTRYPOINT ["java","-jar","my-eureka-0.0.1-SNAPSHOT.jar"]

    # docker build -t myeureka:1.0 .

    4.1.3 Eureka 服务 Deployment 部署

    在 Kubernetes(K8s)Master 节点执行

    # vi eureka-deployment.yml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-eureka
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-eureka
      template:
        metadata:
          labels:
            app: my-eureka
        spec:
          containers:
          - name: my-eureka
            image: myeureka:1.0

    # kubectl apply -f eureka-deployment.yml

    4.1.4 Eureka 服务 Service 部署

    由于需要在浏览器打开 Eureka 控制台,并且其他服务需要向 Eureka 注册,因此需要部署 Service 。

    在 Kubernetes(K8s)Master 节点执行

    # vi eureka_service.yml

    apiVersion: v1
    kind: Service
    metadata:
      name: my-eureka-svc
    spec:
      type: NodePort
      selector:
        app: my-eureka
      ports:
      - protocol: TCP
        nodePort: 35000
        port: 35000
        targetPort: 35000

    # kubectl apply -f eureka_service.yml

    4.2 部署 Eureka Client 服务

    4.2.1 Eureka Client 服务的简单接口

    @RestController
    @RequestMapping("/eurekaClient")
    public class EurekaClientController {
    
        @GetMapping("/hello")
        public String hello() {
            return "eurekaClient hello";
        }

    4.2.2 Eureka Client 服务 application.yml 配置

    spring:
      application:
        name: my-eureka-client
    server:
      port: 36000
    eureka:
      client:
        service-url:     
          defaultZone: http://my-eureka-svc:35000/eureka/
        healthcheck:
          enabled: true    # 开启健康检查, 依赖于 spring-boot-starter-actuator
      instance:
        lease-renewal-interval-in-seconds: 5      # 发出续约指令的间隔,默认30秒
        lease-expiration-duration-in-seconds: 30  # 租期到期时间,默认90秒
        instance-id: ${spring.cloud.client.ip-address}.${server.port}
        prefer-ip-address: true

    注:在 Kubernetes(K8s)中,容器间可以使用 Service 中的 metadata.name + “:” + spec.ports.port 访问服务,因此 Eureka Client 服务可以使用 my-eureka-svc:35000 访问 Eureka 服务

    4.2.3 生成 Eureka Client 服务的 Docker 镜像

    # vi Dockerfile

    FROM java:8
    ADD my-eureka-client-0.0.1-SNAPSHOT.jar my-eureka-client-0.0.1-SNAPSHOT.jar
    ENTRYPOINT ["java","-jar","my-eureka-client-0.0.1-SNAPSHOT.jar"]

    # docker build -t myeurekaclient:1.0 .

    4.2.4 Eureka Client 服务 Deployment 部署

    # vi eurekaclient-deployment.yml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-eureka-client
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-eureka-client
      template:
        metadata:
          labels:
            app: my-eureka-client
        spec:
          containers:
          - name: my-eureka-client
            image: myeurekaclient:1.0

    # kubectl apply -f eurekaclient-deployment.yml

    4.3 部署 Gateway 服务

    4.3.1 Gateway 服务 application.yml 配置

    这里用简单的路由规则,按照服务的 string.application.name 小写的形式路由

    server:
      port: 44000
    
    spring:
      application:
        name: my-gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
              lower-case-service-id: true   # service-id 是否用小写
    eureka:
      client:
        service-url:
          defaultZone: http://my-eureka-svc:35000/eureka/
          healthcheck:
            enabled: true    # 开启健康检查, 依赖于 spring-boot-starter-actuator
      instance:
        lease-renewal-interval-in-seconds: 5      # 发出续约指令的间隔,默认30秒
        lease-expiration-duration-in-seconds: 30  # 租期到期时间,默认90秒
        instance-id: ${spring.cloud.client.ip-address}.${server.port}
        prefer-ip-address: true

    4.3.2 生成 Gateway 服务的 Docker 镜像

    # vi Dockerfile

    FROM java:8
    ADD my-gateway-0.0.1-SNAPSHOT.jar my-gateway-0.0.1-SNAPSHOT.jar
    ENTRYPOINT ["java","-jar","my-gateway-0.0.1-SNAPSHOT.jar"]

    # docker build -t mygateway:1.0 .

    4.3.3 Gateway 服务 Deployment 部署

    # vi gateway-deployment.yml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-gateway
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-gateway
      template:
        metadata:
          labels:
            app: my-gateway
        spec:
          containers:
          - name: my-gateway
            image: mygateway:1.0

    # kubectl apply -f gateway-deployment.yml

    4.3.4 Gateway 服务 Service 部署

    # vi gateway_service.yml

    apiVersion: v1
    kind: Service
    metadata:
      name: my-gateway-svc
    spec:
      type: NodePort
      selector:
        app: my-gateway
      ports:
      - protocol: TCP
        nodePort: 44000
        port: 44000
        targetPort: 44000

    # kubectl apply -f gateway_service.yml

      

    4.4 验证

    4.4.1 浏览器访问 Eureka

    http://192.168.1.12:35000/

    可以看到有2个 my-eureka-client 服务 和 2个 my-gateway 服务 注册到了 Eureka。

    192.168.1.12 是 kubernetes(k8s)Master 节点的IP地址。

    4.4.2 浏览器访问接口

    http://192.168.1.12:44000/my-eureka-client/eurekaClient/hello

    接口可以正常访问,代表验证成功。

    5. 综述

    今天聊了一下 kubernetes(k8s)集群上是如何部署SpringCloud服务的,希望可以对大家的工作有所帮助。

    欢迎帮忙点赞、评论、转发、加关注 :)

    关注追风人聊Java,每天更新Java干货。

    6. 个人公众号

    追风人聊Java,欢迎大家关注

  • 相关阅读:
    解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded
    C#操作Xml:XSLT语法 在.net中使用XSLT转换xml文档示例
    C#操作Xml:XPath语法 在C#中使用XPath示例
    C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化
    C#操作Xml:如何定义Xsd文件
    C#操作Xml:linq to xml操作XML
    C#操作Xml:使用XmlWriter写Xml
    C#操作Xml:使用XmlReader读Xml
    C#操作Xml:通过XmlDocument读写Xml文档
    XML的序列化和反序列化 详细介绍
  • 原文地址:https://www.cnblogs.com/w84422/p/15630185.html
Copyright © 2020-2023  润新知