首页 > 其他分享 >2024-09-17-生活在Kubernetes中的Springboot

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

时间:2024-09-17 15:49:12浏览次数:1  
标签:profile 服务 17 Kubernetes spring 09 mysql name

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

配置中心

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

使用ConfigMap来指定Profile

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

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

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

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

      containers:
        - name: your-app-name
          envFrom:
          - 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-name
          envFrom:
          - secretRef:
              name: mysql-user-psd

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

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

服务注册与发现

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

apiVersion: v1
kind: Service
metadata:
  name: order-system
  labels:
    name: order-system
spec:
  type: NodePort
  selector:
    app: order-system
  ports:
    - 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: true
  health:
    livenessstate:
      enabled: true
    readinessstate:
      enabled: true
  endpoints:
    web:
      exposure:
        include:
          - health

对外网关

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

标签:profile,服务,17,Kubernetes,spring,09,mysql,name
From: https://www.cnblogs.com/narcissu5/p/18417211

相关文章

  • Docker 镜像加速列表(截止到20240910)
    国内经常使用Docker的朋友,可能都会涉及到配置镜像源的操作,来加速自己的镜像拉取。然而这段时间陆续发现曾经常用的国内镜像站(各种云商和高校镜像站)现在已经不能用了,搜索互联网可用镜像站或者镜像加速地址,并测试后汇总如下,使用前请自行斟酌。Docker镜像加速列表(截止到20240910)注......
  • CMake构建学习笔记17-uriparser库的构建和使用
    在连续论述了几篇关于CMake如何使用的文章之后,笔者也是感觉被掏空了。接下来几篇就还是回到构建依赖库的问题上,容笔者花时间找到更好的主题来介绍更多关于CMake使用干货。如何有的读者自信已经很熟悉这方面的知识,可以进行跳过,在需要的时候再进行查阅。uriparser是一个严格遵循RFC......
  • 代码随想录算法训练营,9月17日 | 669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,5
    669.修剪二叉搜索树题目链接:669.修剪二叉搜索树文档讲解︰代码随想录(programmercarl.com)视频讲解︰修剪二叉搜索树日期:2024-09-17想法:节点为空返回空,值在中间时,继续递归左右两边,小于时递归右子树,大于时递归左子树Java代码如下:classSolution{publicTreeNodetrimBST......
  • 【Kubernetes】常见面试题汇总(二十二)
    目录68.简述Helm及其优势?特别说明:题目1-68属于【Kubernetes】的常规概念题。68.简述Helm及其优势?(1)Helm是Kubernetes的软件包管理工具。类似Ubuntu中使用的apt、Centos中使用的yum或者Python中的pip一样。(2)Helm能够将一组K8S资源打包统一管理,是查......
  • 【Kubernetes】常见面试题汇总(二十一)
    目录65.简述Kubernetes中,如何使用EFK实现日志的统一管理?66.简述Kubernetes如何进行优雅的节点关机维护?67.简述Kubernetes集群联邦?65.简述Kubernetes中,如何使用EFK实现日志的统一管理?-在Kubernetes集群环境中,通常一个完整的应用或服务涉及组件过多,建议对......
  • 2024.09.17模拟赛总结
    破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了破防了$T1$怎么每次$rfy$模拟赛,$T1$都这么难。想了大半场比赛,结果还没做出来,要是换成$T2$应该能过。$T......
  • 全国青少年人工智能创新挑战赛 20240917_114400
    官网全国青少年人工智能创新挑战赛-首页http://aiic.china61.org.cn/编程赛项编程创作与信息学专项赛参赛手册20240917-114033编程创作与信息学专项赛资源-CSDN文库https://download.csdn.net/download/ifubing/89762000更多赛项https://share.weiyun.com/QZCw2I60......
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-17
    计算机人工智能前沿进展-大语言模型方向-2024-09-171.LargeLanguageModelsinBiomedicalandHealthInformatics:AReviewwithBibliometricAnalysisHYu,LFan,LLi,JZhou,ZMa,LXian,WHua,SHe…-JournalofHealthcare…,2024生物医学和健康信......
  • 201909-2 小明种苹果(续)ccfcsp
    一道简单的模拟。。。includeincludeusingnamespacestd;intmain(){constintN=1010;booldrop[N]={false};intn,m,i,j,cnt=0,cnt1=0;cin>>n;inty;intsum=0,sum1,temp=0;intindex;for(i=0;i<n;i++){ sum1=0;scanf("%d",&m);for(j=0;j&......
  • 2024/9/17 笔记
    多项式以后再写吧。首先庆祝一下把猪国杀A了[SDOI2010]猪国杀题目描述游戏背景《猪国杀》是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪。每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多只,每只猪扮演$1$种角色。游戏目的主猪/\(\texttt{MP}\):自己存活......