方案一:spring-cloud-starter-kubernetes
org.springframework.cloud
spring-cloud-starter-kubernetes
使用此依赖后可以弃用eureka、nacos等原有的服务注册中心,使用K8S原生的服务发现(etcd)
方案一:
k8s服务
注册中心:eureka
配置中心:
网关:zuul
其他业务微服务:
注册中心:固定主机ip+端口:其他微服务要配置注册中心的IP+端口,所以需要注册中心有固定主机ip+端口,不能经常变化。各节点配置文件不同:eureka各个节点也需要相互注册,所以每个节点的spring配置文件各不相同。
1、注册中心需要固定的IP和端口,供其他服务注册。可以使用k8s的HostPort网络模式,内外部都可使用
2、需要固定的IP相当于需要固定的宿主机,所以在rancher创建eureka服务(s)时要配置主机调度策略,这样即使eureka服务的pod重新部署时也不会随机分派到集群里的其他主机上,导致注册中心变更ip,所有业务服务都要修改eureka地址。
3、注册中心最好分配到不同服务器上运行,形成高可用。所以推荐为每一个eureka节点在rancher单独创建一个服务,例如:eureka1、eureka2。
eureka1-rancher配置:主机调度:主机1;环境变量 spring.cloud.profile=eureka1;
eureka2-rancher配置:主机调度:主机2;环境变量 spring.cloud.profile=eureka2;
rancher启动两个eureka服务,每个服务中配置只有一个pod运行。这两个eureka会在分别固定在主机1、主机2启动,分别读取不同的spring配置文件,可以实现相互注册达到高可用。
网关服务:要配置在nginx中做负载均衡,所以也需要固定主机IP端口。
1、HostPort网络模式:与上边的注册中心rancher配置同理,通过配置主机调度规则,k8s服务与主机一对一绑定,每个k8s网关服务中只有一个Pod。
或者只创建一个k8s服务,通过主机调度lable限制部署的服务器,有几台服务器就配置几个pod,这样pod会在每个服务器上启动一个。
2、NodePort网络模式:网关只创建一个k8s服务,为此服务增加pod进行网关集群扩容。Nginx内可配置任意一个或多个网关宿主机的 NodeIp:NodePort。由K8S自己实现负载均衡。使用此模式部署网关时,最好在node上加lable标签,在k8s网关服务配置时加入主机调度 lable=的限制,限制网关部署服务器node的范围。
其他业务微服务:一般业务服务特点:不需要固定IP端口(服务发现由eureka负责),各节点配置文件相同、环境变量相同。K8S-Service 使用Deployment类型管理POD。
注意:确认微服务注册到注册中心中暴露的 ip:port,各个微服务之间是否可以在K8S环境中的各Node上调用通。HostPort、NodePort模式映射的主机Node端口不同。
推荐Rancher将k8s服务配置为NodePort网络模式,方便pod扩容缩容(HostPort网络模式扩容时一个宿主机只能部署一个pod,NodePort模式不存在此问题)。可以通过配置主机调度+lable,控制当前k8s服务部署服务器node的范围。
注意:
1.springCloud 注册中心客户端配置必须按照以下方式写,否则会因为容器注册的ip是一个随机字符串而无法访问。k8s容器内部应用向eruaka注册ip问题
spring.application.name=xxxx 注意项目配置应用名以方便网关中以serviceID转发
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${spring.application.name}:${server.port}:@project.version@
spring.cloud.client.ipAddress为IP
@project.version@为jar包版本
例如 10.42.213.34:spring-boot-service-b:7008:0.0.1-SNAPSHOT
2.注册中心eureka必须固定IP地址/域名,固定端口配置,不可使用docker随机内部IP
3.网关zuul作为唯一入口必须以域名或者固定IP,不可使用docker内部随机IP
4.在rancher上创建服务时刻选择调度规则,指定主机或者让rancher自动为我们选择合适的主机(创建eureka和zuul时要指定主机,其余业务服务选择让系统自动选择合适的主机)
5.使用docker官方register不安全访问(http)方式时要在所有节点docker仓库中添加仓库并重启docker,否则
在/etc/docker/daemon.json中加入 "insecure-registries" : ["192.168.10.17:5000"]"
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries" : ["192.168.10.17:5000"]
}
6.使用docker-registry-ui查看registry需要在registry中配置跨域访问,详见上面registry安装
7.最好将rancher的数据挂载到主机上,防止删除rancher中pod数据丢失
8.时差问题 springboot启动后时间与真实时间差8小时。时区时区需要更改为CST。
解决方法1:设置环境变量,键位Timezone/TZ 值为Asia/Shanghai
解决方法2:dockerFile环境变量设置时区,
dockerFile中 java -jar启动命令增加-Duser.timezone=GMT+08。