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
可以看到有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,欢迎大家关注

Kubernetes(K8s)部署 SpringCloud 服务实战的更多相关文章
- 微服务探索之路03篇-docker私有仓库Harbor搭建+Kubernetes(k8s)部署私有仓库的镜像
❝ 目录: 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernet ...
- 【K8S】K8S部署Metrics-Server服务
写在前面 在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存.磁盘.CPU和网络的使用率等信息. 读者可参考< ...
- Kubernetes K8S之Service服务详解与示例
K8S之Service概述与代理说明,并详解所有的service服务类型与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master Cent ...
- .Net Core 商城微服务项目系列(十二):使用k8s部署商城服务
一.简介 本篇我们将会把商城的服务部署到k8s中,同时变化的还有以下两个地方: 1.不再使用Consul做服务的注册和发现,转而使用k8s-dns来实现. 2.不再使用Ocelot作为业务网关,使用T ...
- Kubernetes(k8s)部署redis-cluster集群
Redis Cluster 提供了一种运行 Redis 安装的方法,其中数据 在多个 Redis 节点之间自动分片. Redis Cluster 还在分区期间提供了一定程度的可用性,这实际上是在某些节 ...
- 使用k8s部署springcloud解决三大问题
1.正式环境使用的话启动时需要指定使用正式的配置文件,这个要咋处理? 解决办法 文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/13262411.html 分析 ...
- 利用Kubernetes(K8S)部署JAVA项目
一.jar包和war包区别 首先简单介绍一下jar包和war包区别,当时就没分清,导致部署总是傻傻分不清楚. jar包:jar包就是java的类进行编译生成的class文件就行打包的压缩包.里面是一些 ...
- k8s中部署springcloud
安装和配置数据存储仓库MySQL 1.MySQL简介 2.MySQL特点 3.安装和配置MySQL 4.在MySQL数据库导入数据 5.对MySQL数据库进行授权 1.MySQL简介 MySQL 是一 ...
- SpringCloud微服务实战——搭建企业级开发框架(三十四):SpringCloud + Docker + k8s实现微服务集群打包部署-Maven打包配置
SpringCloud微服务包含多个SpringBoot可运行的应用程序,在单应用程序下,版本发布时的打包部署还相对简单,当有多个应用程序的微服务发布部署时,原先的单应用程序部署方式就会显得复杂且 ...
随机推荐
- Java:ConcurrentHashMap类小记-3(JDK8)
Java:ConcurrentHashMap类小记-3(JDK8) 结构说明 // 所有数据都存在table中, 只有当第一次插入时才会被加载,扩容时总是以2的倍数进行 transient volat ...
- [软工顶级理解组] 团队规划和任务拆解(Beta)
目录 需求再分析 功能增减 管理改进 任务分解 人员管理 需求再分析 在Alpha阶段,我们的产品得到了用户的广泛好评,但是还是存在一些问题. 登录不稳定,登录速度慢等问题:这是北航VPN本身的不稳定 ...
- [no code][scrum meeting] Beta 5
$( "#cnblogs_post_body" ).catalog() 例会时间:5月18日14:30,主持者:叶开辉 下次例会时间:5月19日11:30,主持者:黎正宇 一.工作 ...
- Noip模拟30 2021.8.4
T1 毛一琛 考场上打的稳定的$O((2^n)^2)$的暴力.其实再回忆一下上次那道用二进制枚举的题$y$ 就可以知道一样的道理,使用$\textit{Meet In the Middle}$, 按照 ...
- 必备的60个常用的Linux命令
Linux必学的60个命令Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令. ...
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
- git merge远程合并
当某个分支上的开发工作完成后需要将其合入主分支master 但是在提交合并前我们自己最好做一次衍合,目的是检测是否有冲突的风险,如果有应该在本分支先解决冲突然后在提交合并. 否则解决冲突的工作就全部转 ...
- 如何反编译微信小程序👻
如何反编译微信小程序 准备工具: 夜神模拟器(或者你可以自己准备一个安卓模拟器,有root权限.) RE文件管理器(下载地址:https://soft.ucbug.com/uploads/shouji ...
- journalctl常用命令
journalctl -xe 查看全部日志# 以flow形式查看日志 $ journalctl -f # 查看内核日志 $ journalctl -k # 查看指定服务日志 $ journalctl ...
- redis学习笔记(详细)——高级篇
redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...