Spring Cloud Kubernetes - Spring Cloud与Kubernetes 集成 理论知识

陶飞鸿
2023-12-01

 

Spring Cloud Kubernetes 组件

Spring Cloud Kubernetes 组件Spring Cloud应用  提供Kubernetes服务通用接口,让 Spring Cloud应用  更好的运行在Kubernetes上。

 

项目地址

https://github.com/spring-cloud/spring-cloud-kubernetes

 

特点

  1. 兼容kubernetes特点
  2. etcd 代替 Eureka,作为服务注册和发现中心
  3. k8s configmap 代替 Spring cloud congfig
  4. k8s ingress 代替 Spring cloud gateway/zuul

 

DiscoveryClient for Kubernetes

Spring Cloud Kubernetes项目使用Kubernetes的注册中心,它可以通过名字发现Kubernetes中的服务。
举例:将 A 和 B 服务部署在Kubernetes上,Kubernetes 注册表(etcd)中就会有A和B服务信息,
Spring Cloud Kubernetes项目就可以通过DiscoveryClient 调用到A和B服务。

  • 在你的项目中添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes</artifactId>
    <version>${latest.version}</version>
</dependency>
  • 项目启用DiscoveryClient

Spring Cloud Kubernetes 项目启动 DiscoveryClient功能,添加@EnableDiscoveryClient 注解,如下:

@SpringBootApplication
@EnableDiscoveryClient
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
  • 使用DiscoveryClient
@Autowired
private DiscoveryClient discoveryClient;
  • 项目关闭DiscoveryClient

在项目配置文件 application.properties 中设置:

spring.cloud.kubernetes.discovery.enabled=false

 

Spring Cloud Kubernetes 项目 配置文件

通过Kubernetes 的 ConfigMap 资源来配置 配置文件(application.properties|yaml),当然也可以通过系统属性或者环境变量来为Spring启动程序提供属性值或自定义值。配置方法如下:

  • 创建 目录/app-config.yaml
spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      config:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes 将寻找命名空间为 default-namespace 下名字为 cm1 的 ConfigMap
         - name: cm1
         # Spring Cloud Kubernetes 将寻找命名空间为 n2 下名字为 default-name 的 ConfigMap
         - namespace: n2
         # Spring Cloud Kubernetes 将寻找命名空间为 n3 下名字为 cm3 的 ConfigMap
         - namespace: n3
           name: cm3
  • Kubernetes 创建 ConfigMap

kubectl create configmap k8s-cloud-config --from-file=目录/app-config.yaml

创建项目所需的配置,创建的以下资源均是Kubernetes资源,得对Kubernetes比较熟悉,举例:

kind: ConfigMap
apiVersion: v1
metadata:
  name: demo
data:
  pool.size.core: 2
  pool.size.max: 12

kind: ConfigMap
apiVersion: v1
metadata:
  name: demo
data:
  custom-name.yaml: |-
    pool:
      size:
        core: 2
        max:12
kind: ConfigMap
apiVersion: v1
metadata:
  name: demo
data:
  application.yml: |-
    greeting:
      message: default greeting
    farewell:
      message: default farewell
    ---
    spring:
      profiles: development
    greeting:
      message: default greeting development
    farewell:
      message: default greeting development
    ---
    spring:
      profiles: production
    greeting:
      message: default greeting production
apiVersion: v1
data:
  password: aBK022gc=
  username: aBK022gc==
kind: Secret
metadata:
  creationTimestamp: 2020-03-06T10:05:56Z
  name: db-secret
  namespace: default
  resourceVersion: "568901"
  selfLink: /api/v1/namespaces/default/secrets/db-secret
  uid: 345252246-619q-990a-dbs3-dxdf0s1459
type: Opaque
apiVersion: v1
kind: Deployment
metadata:
  name: k8s-cloud-app
spec:
   template:
     spec:
       containers:
         - env:
            - name: DB_USERNAME
              valueFrom:
                 secretKeyRef:
                   name: db-secret
                   key: username
            - name: DB_PASSWORD
              valueFrom:
                 secretKeyRef:
                   name: db-secret
                   key: password

 

重新加载机制

当ConfigMap或Secret发生变化时,会触发应用程序重新加载,默认情况下此功能是禁用的,开启此功能
spring.cloud.kubernetes.reload.enabled=true

监听ConfigMap或Secret发生变化分为两种

  • 事件:event,监听配置变化事件
  • 轮询:polling,每隔一段时间去查询配置有无变化

重新加载策略

spring.cloud.kubernetes.reload.strategy: refresh
  • refresh

只重新加载带有@ConfigurationProperties或@RefreshScope注释的配置bean,刷新Spring Cloud上下文。

  • restart_context

整个Spring ApplicationContext被优雅地重新启动,使用新的配置重新创建bean.

  • shutdown

Spring ApplicationContext被关闭,该应用的Pod重新启动。此模式的Pod应该有多个副本,并且所有非守护进程线程的生命周期绑定到ApplicationContext上。

 

Ribbon discovery in Kubernetes

Ribbon discovery 主要用于客户端负载均衡,即存在两个及以上副本的客户端,客户端副本实现负载均衡,以便记录那个客户端调用了服务。

  • 项目添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
    <version>${latest.version}</version>
</dependency>

 

Spring Cloud Kubernetes 与 k8s通信

Spring Cloud Kubernetes 项目代码依赖于Fabric8 Kubernetes Java客户端,所以不需要将其部署到Kubernetes中,也可以使用http协议与Kubernetes服务器的REST API进行通信。

fabric8地址:https://github.com/fabric8io/kubernetes-client

 

Spring Cloud Kubernetes Pod 健康检查

Spring Cloud Kubernetes 项目默认提供Pod检查检查功能,它包含很多k8s健康信息,如:Pod 名字,命名空间,ip地址,标识信息,所在节点IP及名称等,非常容易对其进行健康检查。
 

 类似资料: