k8s部署eureka集群
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s部署eureka集群相关的知识,希望对你有一定的参考价值。
参考技术A 对于一般的后端微服务来说,在k8s中同时起多个相同的服务来做负载均衡,只需要简单的修改deployment的replicas,增加pod数量,然后通过对外暴露一个service来代理这些pod。而对于eureka来说,要实现eureka的高可用,那就不是修改replicas这么方便了。由于部署的多个eureka之间需要将自己注册到彼此,因此要做一些特殊改动。
主要是用到了StatefulSet和headless service这两个k8s对象
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括
稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
有序收缩,有序删除(即从N-1到0)
StatefulSet中每个Pod的DNS格式为
Headless Service 和普通service的一个显著的区别是,Headless Service的对应的每一个Endpoints,即每一个Pod,都会有对应的DNS域名
例如:我们可以用过这种域名来访问某个具体的pod:
在实际使用中,将service的clusterIP设置成None,就表明这个service是一个Headless Service。
通过 StatefulSet,我们得到了一些列pod,每个pod的name为statefulSetName-0..N-1,
加入我们创建了一个名称叫eureka的StatefulSet,并且设置replicas =3,那么部署到k8s后,k8s会为我们生成三个名称依次为eureka-0,eureka-1,eureka-2的pod。
通过Headless Service,我们可以通过pod名称来访问某个pod,
例如,我们在namespace=test的命名空间下创建了一个名称为register-server的service,并且关联了之前StatefulSet创建的pod,那么我们可以在集群内任意地方
通过eureka-0.register-server.test.svc.cluster.local这个域名访问到eureka-0这个pod。
有了前面的基础,现在部署eureka集群的方式就逐渐清晰了。
首先明确部署eureka的关键点:需要让每个eureka注册到另外的eureka上。
也就是eureka.client.serviceUrl.defaultZone这个配置,是一组eureka的地址。
通过StatefulSet,我们可以明确知道生成的每个eureka的名称,
通过Headless Service,我们又可以访问到每个eureka,所以eureka.client.serviceUrl.defaultZone的值就是
有个这个配置,那么我们部署StatefulSet,和Headless Service
那么我们能基本能得到一个可用的eureka集群
除了会有以下问题:
红框中的可用副本(available-replicas)会出现在不可用unavailable-replicas中
原因是我们默认是通过ip的方式来注册eureka(eureka.instance.prefer-ip-address配置默认为true),但是eureka的注册地址又是域名的形式,两者不一致。
要解决这个问题,还需做一些额外的配置。
1.在application.yaml中,将eureka.instance.prefer-ip-address设置成false。
2.StatefulSet.yaml中,增加环境变量配置,将pod的名称绑定到环境变量
3.在application.yaml中指定eureka的 hostname,其中MY_POD_NAME取到了第二部中绑定的当前pod名称
eureka:
instance:
hostname: $MY_POD_NAME.register-server
如上配置后,便可以得到一个eureka集群。
后面是一些配置文件:
整体文件配置:
service.yaml
StatefulSet.yaml
application.yml
bootstrap.yml
将一般的微服务注册到eureka集群中,可以通过eureka的service来访问eureka,即:将eureka.client.serviceUrl.defaultZone设置成register-server.test.svc.cluster.local,使用了k8s的service负载均衡,将服务注册到任意一个活着的eureka上,然后eureka集群内部会做同步,最终注册到eureka集群内部所有eureka上
Eureka非分区集群部署
1、简介
非分区集群部署是Eureka一种简单的集群部署方式,这种方式下集群中的Eureka Server不分区。通常情况下,如果我们的Eureka服务器都在同一个机房中,可以采取这种方式集群部署。
2、修改hosts文件
由于我在Windows环境下启动多个Eureka服务模拟集群部署,因此先修改C:\\Windows\\System32\\drivers\\etc\\hosts文件,以便于正确的域名寻址(不修改直接使用127.0.0.1也一样)
127.0.0.1 eureka18881.com
127.0.0.1 eureka18882.com
127.0.0.1 eureka18883.com
127.0.0.1 eureka18884.com
3、Eureka Server搭建
我这里一共搭建四个Eureka Server,为了方便看清楚整个Eureka Server的集群方式和启动过程,我搭建了四个Eureka Server,分别是Eureka-01、Eureka-02、Eureka-03、Eureka-04。如果觉得服务过多可以创建不同的profile,在启动Eureka Server时指定不同的profile即可。
第一步:引入pom依赖,我这里采用spring-cloud版本为Greenwich.SR1
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liziba</groupId>
<artifactId>spring-cloud-netflix-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>Eureka-01</module>
<module>Eureka-02</module>
<module>Eureka-03</module>
<module>Eureka-04</module>
</modules>
<properties>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
第二步:创建启动类Application_EurekaServer01.java,使用@EnableEurekaServer注解开启Eureka Sever
/**
* <p>
* EurekaServer01启动类
* </p>
*
* @Author: Liziba
* @Date: 2021/10/30 10:46
*/
@SpringBootApplication
@EnableEurekaServer
public class Application_EurekaServer01 {
public static void main(String[] args) {
SpringApplication.run(Application_EurekaServer01.class, args);
}
}
第三步:创建application.yml/application.properties配置文件,在如下配置文件中配置类当前Eureka Server的端口信息、服务名称、实例地址、集群地址数组、是否注册本身和获取注册信息,在这里我将Eureka Server本身也注册到了当前Eureka Server中。
## 端口
server:
port: 18881
## 服务名称
spring:
application:
name: Eureka-01
## Eureka 配置信息
eureka:
instance:
hostname: eureka18881.com
client:
service-url:
defaultZone: http://eureka18882.com:18882/eureka/,http://eureka18883.com:18883/eureka/,http://eureka18884.com:18884/eureka/
register-with-eureka: true
fetch-registry: true
第四步:再创建三个相同的应用,修改对应端口信息、服务名称、集群地址,比如Application_EurekaServer02的配置文件如下所示。
## 修改端口
server:
port: 18882
## 修改应用名
spring:
application:
name: Eureka-02
## 修改实例hostname
eureka:
instance:
hostname: eureka18882.com
client:
service-url:
## defaultZone中配置其他三台服务器地址,剔除自己
defaultZone: http://eureka18881.com:18881/eureka/,http://eureka18883.com:18883/eureka/,http://eureka18884.com:18884/eureka/
register-with-eureka: true
fetch-registry: true
第五步:服务启动,依次启动四个Eureka Server,等服务均启动成功后,访问Eureka Dashboard,查看集群信息。每个Eureka Dashboard中均可以看到四台服务注册信息展示在Instances currently registered with Eureka中,服务注册的名字Application 是配置文件中提供的spring.application.name应用配置名称;DS Replicas中展示的是defaultZone集群信息,展示的名称是对应Eureka Server配置文件中配置的eureka.instance.hostname
4、Eureka Client搭建
Eureka Server未进行分区划分,因此Eureka Client也无需考虑Eureka Server中分区相关配置。
第一步:创建Client服务,引入Eureka Client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
</dependency>
第二步:创建启动类,使用@EnableDiscoveryClient开启服务发现
/**
* <p>
* 客户端应用启动
* </p>
*
* @Author: Liziba
* @Date: 2021/10/30 15:34
*/
@SpringBootApplication
@EnableDiscoveryClient
public class Application_client01 {
public static void main(String[] args) {
SpringApplication.run(Application_client01.class, args);
}
}
第三步:创建配置文件,在配置文件中指定集群服务地址
server:
port: 19991
spring:
application:
name: client-01
eureka:
client:
service-url:
defaultZone: http://eureka18881.com:18881/eureka/,http://eureka18882.com:18882/eureka/,http://eureka18883.com:18883/eureka/,http://eureka18884.com:18884/eureka/
第四步:通过Eureka Dashboard查看服务注册信息,可以看到每个Eureka Server上都会有client-01服务注册上去了
以上是关于k8s部署eureka集群的主要内容,如果未能解决你的问题,请参考以下文章