Spring Cloud Kubernetes 组件 为 Spring Cloud应用 提供Kubernetes服务通用接口,让 Spring Cloud应用 更好的运行在Kubernetes上。
https://github.com/spring-cloud/spring-cloud-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>
Spring Cloud Kubernetes 项目启动 DiscoveryClient功能,添加@EnableDiscoveryClient 注解,如下:
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Autowired
private DiscoveryClient discoveryClient;
在项目配置文件 application.properties 中设置:
spring.cloud.kubernetes.discovery.enabled=false
通过Kubernetes 的 ConfigMap 资源来配置 配置文件(application.properties|yaml),当然也可以通过系统属性或者环境变量来为Spring启动程序提供属性值或自定义值。配置方法如下:
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
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发生变化分为两种
重新加载策略
spring.cloud.kubernetes.reload.strategy: refresh
只重新加载带有@ConfigurationProperties或@RefreshScope注释的配置bean,刷新Spring Cloud上下文。
整个Spring ApplicationContext被优雅地重新启动,使用新的配置重新创建bean.
Spring ApplicationContext被关闭,该应用的Pod重新启动。此模式的Pod应该有多个副本,并且所有非守护进程线程的生命周期绑定到ApplicationContext上。
Ribbon discovery 主要用于客户端负载均衡,即存在两个及以上副本的客户端,客户端副本实现负载均衡,以便记录那个客户端调用了服务。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
<version>${latest.version}</version>
</dependency>
Spring Cloud Kubernetes 项目代码依赖于Fabric8 Kubernetes Java客户端,所以不需要将其部署到Kubernetes中,也可以使用http协议与Kubernetes服务器的REST API进行通信。
fabric8地址:https://github.com/fabric8io/kubernetes-client
Spring Cloud Kubernetes 项目默认提供Pod检查检查功能,它包含很多k8s健康信息,如:Pod 名字,命名空间,ip地址,标识信息,所在节点IP及名称等,非常容易对其进行健康检查。