2024-09-17-生活在Kubernetes中的Springboot

news/2024/9/19 11:42:05/文章来源:https://www.cnblogs.com/narcissu5/p/18417211

Springboot和Kubernetes中的很多功能都是重叠的,SpringCloud重合的就更多了。不过我还是希望尽可能采用微服务及服务网格这套思路,应用层做轻,SpringCloud就不用了,重合的部分也尽可能用Kubernetes的功能。

配置中心

Kubernetes本身提供了对配置中心的支持,不需要再使用Apollo之类的工具。

使用ConfigMap来指定Profile

期望应用部署时不用分别设置当前使用的profile,相同集群相同名称空间下的应用自动使用相同的profile。这一功能可以通过ConfigMap来实现。

首先创建一个ConfigMap用存储当前的profile:

apiVersion: v1
kind: ConfigMap
metadata:name: spring-profilenamespace: default
data:SPRING_PROFILES_ACTIVE: prod

Deployment部署文件的containers节点下增加如下配置:

      containers:- name: your-app-nameenvFrom:- configMapRef:name: spring-profile

这样配置将拉取spring-profile中的所有配置,并将其作为当前容器的环境变量。Springboot会识别前面设置的SPRING_PROFILES_ACTIVE变量并将其作为profile。另外也可以不使用整个Map,Kubernetes提供了相当灵活的配置方式。

使用Secret来存储数据库密码

数据库密码写在配置文件中是不安全的,配置中心中也不一定安全。Kubernetes提供了专门的Secret来存储密码,存储在Secret的信息都会加密。

可以用和ConfigMap相似的方法创建Secret,或者如果担心文件会泄漏,也可以直接使用命令行:

kubectl create secret generic mysql-user-psd --from-literal=mysql-user=username --from-literal=mysql-password='password'

Deployment部署文件的containers节点下增加类似的一行:

      containers:- name: your-app-nameenvFrom:- secretRef:name: mysql-user-psd

同时配置文件需要做响应的修改,不再直接写明用户名密码等敏感信息,而是使用环境变量:

spring:datasource:url: jdbc:mysql://host.minikube.internal:3306/yourdatabase?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=trueusername: ${mysql-user}password: ${mysql-password}

服务注册与发现

Kubernetes中通过服务在集群内部暴露一组服务,首先创建一个服务对象:

apiVersion: v1
kind: Service
metadata:name: order-systemlabels:name: order-system
spec:type: NodePortselector:app: order-systemports:- port: 80  # 服务暴露端口targetPort: 8080 # 目标服务的端口

服务创建后Kubernetes会为其分配一个IP地址,通过该地址即可访问服务:

docker@minikube:~$ curl http://10.105.200.157/actuator/health
{"status":"DOWN","groups":["liveness","readiness"]}

那么如果获得上面这个IP地址呢?有两种方法:

通过环境变量

当一个Pod启动,Kubernetes会为每个运行中的服务注入两个环境变量:{SVCNAME}_SERVICE_HOST{SVCNAME}_SERVICE_PORT,其中服务名会全部转为大写,并且使用_替换-。但是注意Pod启动之后出现的服务不会被注入进来。

通过DNS

Kubernetes并不原生支持DNS的方式,不过一般集群都会启用DNS插件(如CoreDNS),minikube中DNS插件也是默认启用的,所以可以直接使用域名访问服务:

root@order-system-7ccc9d54b6-fp9nz:~# curl http://order-system.default/actuator/health
{"status":"DOWN","groups":["liveness","readiness"]}

如果是同一名称空间,则域名中表示名称空间的default也可以省略。

健康检查

Kubernetes会对容易进行检查:

  • 存活(Liveness):如果Pod频繁在存活检查中失败,Kubernetes会尝试重启Pod
  • 就绪(Readiness):Pod启动时检查,在就绪之前Kubernetes不会为其分配网络流量

SpringBoot内置了对这两种检查的支持,需要引入actuator的依赖,当然通常都会依赖这个:

dependencies {implementation 'org.springframework.boot:spring-boot-starter-validation'implementation 'org.springframework.boot:spring-boot-starter-web'implementation 'org.springframework.boot:spring-boot-starter-actuator'// ... 其它依赖
}

然后在配置中打开支持:

management:endpoint:health:probes:enabled: truehealth:livenessstate:enabled: truereadinessstate:enabled: trueendpoints:web:exposure:include:- health

对外网关

Kubernetes本身不提供Zuul这样的网关,需要通过其它技术如Istio来支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pikachu靶场的代码审计,和一些危险函数

对pikachu靶场进行代码审计,审计分析文件上传、命令执行漏洞,越权漏洞,sql注入,xxe漏洞 文件上传 client:并未对后缀进行判断,只对大小做了验证后端并未进行文件的类型校验,仅仅是生成了一个目录去保存上传的文件同时对文件的保存路径暴露 MIME Type只对mime进行了验证,…

Xcode 16 正式版发布下载 - Apple 平台 IDE

Xcode 16 (16A242d) - Apple 平台 IDEXcode 16 (16A242d) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接:https://sysin.org/blog/apple-xcode-16/,查看最新版。原创作品,转载请保留出处。The SDKs it contains are:iOS 18.0 (Build 22A3…

凡人歌:平凡公司的技术面试

我们见惯了大厂刷题面试宝典,大佬们只招世界上最优秀的人新闻。我们也乐见这些金字塔顶端给大家洒下的热点鸡汤。而现实却是平凡的小公司才是主流。我们见惯了大厂刷题面试宝典,大佬们只招世界上最优秀的人新闻。我们也乐见这些金字塔顶端给大家洒下的热点鸡汤。而现实却是平…

攻防世界 ————新手模式适合作为桌面 misc

(本篇文章参考大佬的解题) 下载附件,得到rar的的压缩包,解压缩,打开文件后有一张图片:打开图片发现什么也没有:使用软件Stegsolve打开图片看有什么问题:点击下一页:点击后发现有一个二维码:把他保存下来,使用软件扫码看看里面有什么: (我是用微信扫码的) 出现了十…

代码整洁之道--读书笔记(11)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

Win7玩游戏Ctrl和空格不能一起按的解决方案

前几天在Windows7上玩《Minecraft》的时候,发现Ctrl和空格不能一起按,就开始研究,找到一个解决方案。 首先打开控制面板,点击更改键盘或其他输入法,就会进入文本服务与输入语言。点击更改键盘,进入高级键设置选项卡,点击下面的快捷键,再点击更改按键顺序。如图,随便把…

深度学习 初识学习 9.16

什么是SVM SVM(Support Vector Machine,支持向量机)是一种监督学习模型,用于分类和回归分析。其基本思想是找到一个超平面,使得两类样本在该超平面上的间隔最大化。这个间隔被称为“最大间隔”,而位于最大间隔边界上的样本点则被称为“支持向量”。 SVM的关键概念:超平面…

C++信奥老师解一本通题 1370:最小函数值(minval)

​ 【题目描述】有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x*x+Bi*x+Ci(x∈N∗)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的mm个(如有重复的要输出多个)。【输入】第一行输入两个正整数n和m。 以下nn行每行三个正整数,其中第ii行的三个数分别位Ai、Bi和C…

反DDD模式之关系型数据库

本文书接上回《图穷匕见-所有反DDD模式都是垃圾》,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新; DDD框架源码(.NET、Java双平台); 加群畅聊,建模分析、技术实现交流; 视频和直播在B站。 背景 我在与开发者交流关于DDD的建模思路时,往往会遇到一个难题,就是…

常回家看看之house_of_catWO

house_of_cat 前言: house of cat 这个利用手法和前面提到的 house of kiwi ,和 house of emma 利用的手法是一个链子,当程序无法通过main函数返回时候,或者程序不能显性调用exit函数的时候,我们可以通过 __malloc_assert 来刷新IO流,当然这个函数在2.35之后移除了刷新IO…

C++11 线程同步接口std::condition_variable和std::future的简单使用sk

合集 - C++(1)1.C++11 线程同步接口std::condition_variable和std::future的简单使用09-17收起 std::condition_variable 条件变量std::condition_variable有wait和notify接口用于线程间的同步。如下图所示,Thread 2阻塞在wait接口,Thread 1通过notify接口通知Thread 2继续执…