|
对于最新稳定版本,请使用Spring Cloud Kubernetes 5.0.0! |
Spring Cloud Kubernetes Configuration Watcher
Kubernetes 提供将 ConfigMap 或 Secret 挂载为卷的功能,并存入你的应用容器中。当 ConfigMap 或 Secret 的内容发生变化时,已挂载的卷也会随同更新。
然而,除非你重启应用程序,否则 Spring Boot 不会自动更新这些更改。Spring Cloud提供通过点击以下执行器端点来刷新应用程序上下文的功能/刷新或通过出版RefreshRemoteApplicationEvent使用春云总线。
为了实现运行在 Kubernetes 上的 Spring Cloud 应用的配置刷新,你可以将 Spring CloudKubernetes 配置观察者控制器部署到你的 Kubernetes 集群中。
该应用以容器形式发布,可在 Docker Hub 上使用。不过,如果你需要自定义配置观察者的行为,或者更喜欢自己构建镜像,你可以轻松地从源代码中构建自己的镜像并使用它。
另一种配置选项是在部署配置监视器的deployment.yaml中提供一些环境变量。以下是一些重要的变量:
env:
- name: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_CONFIGURATION_WATCHER
value: DEBUG
- name: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_CLIENT_CONFIG_RELOAD
value: DEBUG
- name: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_KUBERNETES_COMMONS_CONFIG_RELOAD
value: DEBUG
这些功能使配置监控器进行调试日志成为可能,在初始设置中尤为有用,能够诊断潜在的错误配置。
env:
- name: SPRING_CLOUD_KUBERNETES_RELOAD_NAMESPACES_0
value: "namespace-a"
这个选项让观察者知道在哪里搜索秘密和配置图。你这里有两个选项:选择命名空间(上述设置)和由命名空间解析选择的命名空间(这是默认选项)。请记住,所有这些选项都需要合适的 RBAC 规则。
只有当配置文件/秘密的更改来自带有标签的源时,配置文件监控器才会触发事件:Spring.cloud.kubernetes.config=true或Spring.cloud.Kubernetes.Secret=True.
简单来说,如果你更改了没有上述标签的configmap(或secret),配置观察者会跳过触发该事件(如果你启用了调试日志,日志中会显示出来)。
默认情况下,配置观察者会监控配置命名空间内的所有配置地图/秘密。如果你想筛选只监控特定源,可以通过设置:
SPRING_CLOUD_KUBERNETES_CONFIG_INFORMER_ENABLED=TRUE
这会告诉观察者只监控带有标签的来源:spring.cloud.kubernetes.config.informer.enabled=true.
还有一个重要的配置,特别是对于配置图和以卷形式挂载的秘密配置(通过Spring.cloud.kubernetes.config.paths/Spring.cloud.kubernetes.secrets.paths或者使用spring.config.import)是:
- name: SPRING_CLOUD_KUBERNETES_CONFIGURATION_WATCHER_REFRESHDELAY
value: "10000"
这说明我们应该等待多少毫秒,然后才从配置观察者触发事件。这很重要,因为 Kubernetes 文档中写道:
当当前在卷中被消耗的 ConfigMap 更新时,投影键最终也会被更新。
你需要在集群上“匹配”这个部分,最终以毫秒计分。
Spring Cloud Kubernetes 配置观察器可以通过两种方式向应用程序发送刷新通知。
-
在 HTTP 上,在这种情况下,被通知的应用程序必须具备
/刷新执行器端点暴露并可从集群内部访问 -
使用Spring Cloud Bus,这种情况下你需要在custer上部署一个消息代理来让应用使用。
部署 YAML
下面是一个示例的部署 YAML,你可以用来将 Kubernetes 配置观察器部署到 Kubernetes 上。
---
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: Service
metadata:
labels:
app: spring-cloud-kubernetes-configuration-watcher
name: spring-cloud-kubernetes-configuration-watcher
spec:
ports:
- name: http
port: 8888
targetPort: 8888
selector:
app: spring-cloud-kubernetes-configuration-watcher
type: ClusterIP
- apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: spring-cloud-kubernetes-configuration-watcher
name: spring-cloud-kubernetes-configuration-watcher
- apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
app: spring-cloud-kubernetes-configuration-watcher
name: spring-cloud-kubernetes-configuration-watcher:view
roleRef:
kind: Role
apiGroup: rbac.authorization.k8s.io
name: namespace-reader
subjects:
- kind: ServiceAccount
name: spring-cloud-kubernetes-configuration-watcher
- apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: namespace-reader
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["configmaps", "pods", "services", "endpoints", "secrets"]
verbs: ["get", "list", "watch"]
- apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-kubernetes-configuration-watcher-deployment
spec:
selector:
matchLabels:
app: spring-cloud-kubernetes-configuration-watcher
template:
metadata:
labels:
app: spring-cloud-kubernetes-configuration-watcher
spec:
serviceAccount: spring-cloud-kubernetes-configuration-watcher
containers:
- name: spring-cloud-kubernetes-configuration-watcher
image: springcloud/spring-cloud-kubernetes-configuration-watcher:3.3.0
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 8888
path: /actuator/health/readiness
livenessProbe:
httpGet:
port: 8888
path: /actuator/health/liveness
ports:
- containerPort: 8888
服务账户及其相关的角色绑定对于Spring Cloud的Kubernetes配置正常工作非常重要。 控制器需要访问 Kubernetes 集群中关于 ConfigMap、Pods、Services、Endpoints 和 Secrets 的数据。
监控配置映射与秘密
如果对带有有效标签的 ConfigMap 或 Secret 进行更改(如上所述),Spring Cloud Kubernetes Configuration Watcher 将使用该 ConfigMap 或 Secret 的名称 并向该应用发送通知。不过这可能不够满足你的使用场景,你可以比如:
-
将配置映射绑定到多个应用程序,使得单个配置映射内的更改会触发多个服务的刷新
-
让基于配置文件的源触发你的应用事件
因此,你可以指定一个附加注释:
Spring.cloud.kubernetes.configmap.apps或Spring.cloud.kubernetes.secret.apps.它需要一串用逗号分隔的应用,
它指定了当该秘密/配置文件图发生变更时,将收到通知的应用程序名称。
例如:
kind: ConfigMap
apiVersion: v1
metadata:
name: example-configmap
labels:
spring.cloud.kubernetes.config: "true"
annotations:
spring.cloud.kubernetes.configmap.apps: "app-a, app-b"
HTTP 实现
默认使用的是HTTP实现。当使用该实现时,Spring Cloud Kubernetes 配置观察者和
当 ConfigMap 或 Secret 发生变化时,HTTP 实现将使用 Spring Cloud Kubernetes Discovery 客户端来获取所有
与ConfigMap或Secret名称匹配的应用程序实例,并向应用程序执行器发送HTTP POST请求/刷新端点。默认情况下,它会将帖子请求发送到/执行器/刷新使用发现客户端注册的端口。
你也可以配置配置观察者调用实例关闭执行器端点。为此你可以设置Spring.cloud.kubernetes.configuration.watcher.refresh-strategy=shutdown.
非默认管理端口和执行器路径
如果应用使用非默认执行器路径和/或管理端点使用不同端口,则应用的Kubernetes服务
可以添加一个名为boot.spring.io/actuator并将其值设置为应用程序使用的路径和端口。例如
apiVersion: v1
kind: Service
metadata:
labels:
app: config-map-demo
name: config-map-demo
annotations:
boot.spring.io/actuator: http://:9090/myactuator/home
spec:
ports:
- name: http
port: 8080
targetPort: 8080
selector:
app: config-map-demo
你还可以选择配置执行器路径和/或管理端口的另一种方式,是设置spring.cloud.kubernetes.configuration.watcher.actuatorPath和spring.cloud.kubernetes.configuration.watcher.actuatorPort.
消息传递实现
消息传递实现可以通过将配置文件设置为以下总线-AMQP(RabbitMQ)或巴士卡夫卡(Kafka) when the Spring Cloud Kubernetes Configuration Watcher
应用程序部署到 Kubernetes。默认情况下,使用消息实现时,配置观察者会发送RefreshRemoteApplicationEvent用
将 Spring Cloud Bus 扩展到所有应用实例。这会导致应用程序实例刷新应用程序的配置属性,且
重启实例。
你也可以配置关闭应用实例,以刷新应用的配置属性。
当应用关闭时,Kubernetes 会重启应用实例,并加载新的配置属性。使用
这套策略集Spring.cloud.kubernetes.configuration.watcher.refresh-strategy=shutdown.
配置RabbitMQ
当总线-AMQP启用配置文件后,你需要配置 Spring RabbitMQ 来指向 RabbitMQ 的位置
例如,你想使用以及任何认证所需的凭证。这是可以做到的
例如,通过设置标准的 Spring RabbitMQ 属性
spring:
rabbitmq:
username: user
password: password
host: rabbitmq
配置Kafka
当巴士卡夫卡配置文件启用后,你需要配置 Spring Kafka 来指向 Kafka 代理的位置
你想使用的示例。这可以通过设置标准的Spring Kafka属性来实现,例如。
spring:
kafka:
producer:
bootstrap-servers: localhost:9092