13. Spring Cloud Kubernetes 配置监听器
Kubernetes 提供了将 ConfigMap 或 Secret 作为卷挂载到应用程序容器中的能力。当 ConfigMap 或 Secret 的内容发生更改时,已挂载的卷将随之更新这些更改。
然而,除非重新启动应用程序,否则 Spring Boot 不会自动更新这些更改。Spring Cloud 提供了在不重启应用程序的情况下刷新应用上下文的能力,方法是通过调用指标端点 /refresh 或通过使用 Spring Cloud Bus 发布 RefreshRemoteApplicationEvent。
要实现此配置刷新,适用于在 Kubernetes 上运行的 Spring Cloud 应用,可将 Spring Cloud Kubernetes 配置监听器控制器部署到您的 Kubernetes 集群中。
该应用程序以容器形式发布,并可在 Docker Hub 上获取。然而,如果您需要自定义配置监视器的行为,或更倾向于自行构建镜像,您可以轻松地从 GitHub 上的源代码 构建您自己的镜像并使用它。
Spring Cloud Kubernetes 配置观察器可以通过两种方式向应用程序发送刷新通知。
-
通过 HTTP 进行,此时被通知的应用程序必须能够访问集群内部暴露并可访问的
/refresh指标端点。 -
使用 Spring Cloud Bus,此时您需要在集群中部署一个消息代理,以便应用程序能够使用它。
13.1. 部署 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:2.0.1-SNAPSHOT
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 8888
path: /actuator/health/readiness
livenessProbe:
httpGet:
port: 8888
path: /actuator/health/liveness
ports:
- containerPort: 8888
服务账号(Service Account)及其关联的角色绑定(Role Binding)对于 Spring Cloud Kubernetes 配置正常工作至关重要。控制器需要访问权限,以读取 Kubernetes 集群中关于 ConfigMaps、Pods、Services、Endpoints 和 Secrets 的数据。
13.2. 监控 ConfigMaps 和 Secrets
Spring Cloud Kubernetes 配置观察器将响应带有标签 spring.cloud.kubernetes.config 且值为 true 的 ConfigMap 的变更,或任何带有标签 spring.cloud.kubernetes.secret 且值为 true 的 Secret 的变更。如果 ConfigMap 或 Secret 既不包含上述任一标签,或者这些标签的值不为 true,则任何变更都将被忽略。
Spring Cloud Kubernetes 配置观察器在 ConfigMaps 和 Secrets 上查找的标签可以通过分别设置 spring.cloud.kubernetes.configuration.watcher.configLabel 和 spring.cloud.kubernetes.configuration.watcher.secretLabel 来更改。
如果对具有有效标签的 ConfigMap 或 Secret 进行了更改,Spring Cloud Kubernetes 配置监听器将获取该 ConfigMap 或 Secret 的名称,并向应用程序发送包含该名称的通知。
13.3. HTTP 实现
HTTP 实现是默认使用的。当使用此实现时,Spring Cloud Kubernetes 配置监视器在 ConfigMap 或 Secret 发生变更时,将利用 Spring Cloud Kubernetes 发现客户端获取所有与 ConfigMap 或 Secret 名称匹配的应用实例,并向应用的指标端点(actuator)发送 HTTP POST 请求。/refresh 端点。默认情况下,它会通过发现客户端注册的端口,向 /actuator/refresh 发送 POST 请求。
13.3.1. 非默认管理端口和指标端点路径
如果应用程序使用非默认的指标端点路径和/或为管理端点使用不同的端口,该应用程序的 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。
13.4. 消息实现
消息传递实现可以通过在将 Spring Cloud Kubernetes Configuration Watcher 应用部署到 Kubernetes 时,将配置文件设置为 bus-amqp(RabbitMQ)或 bus-kafka(Kafka)来启用。
13.5. 配置 RabbitMQ
当启用 bus-amqp 配置文件时,您需要配置 Spring RabbitMQ,使其指向您希望使用的 RabbitMQ 实例的位置,并提供任何必要的身份验证凭据。您可以通过设置标准的 Spring RabbitMQ 属性来完成此操作,例如
spring:
rabbitmq:
username: user
password: password
host: rabbitmq
13.6. 配置 Kafka
当启用 bus-kafka 配置文件时,您需要配置 Spring Kafka,使其指向您希望使用的 Kafka 代理实例的位置。这可以通过设置标准的 Spring Kafka 属性来完成,例如
spring:
kafka:
producer:
bootstrap-servers: localhost:9092