13. Spring Cloud Kubernetes 配置观察器
Kubernetes 提供了将 ConfigMap 或 Secret 作为卷挂载到应用程序容器中的功能。当 ConfigMap 或 Secret 的内容发生更改时,挂载的卷将使用这些更改进行更新。
但是,除非您重新启动应用程序,否则 Spring Boot 不会自动更新这些更改。Spring Cloud
提供了刷新应用程序上下文而无需重新启动应用程序的功能,方法是点击
执行器端点/refresh
或通过发布RefreshRemoteApplicationEvent
使用 Spring Cloud Bus。
要实现在 Kubernetes 上运行的 Spring Cloud 应用程序的配置刷新,您可以部署 Spring Cloud Kubernetes 配置观察程序控制器添加到 Kubernetes 集群中。
该应用程序作为容器发布,可在 Docker Hub 上使用。 但是,如果您需要自定义配置观察器行为或更喜欢自己构建映像,则可以轻松构建自己的映像 图像来自 GitHub 上的源代码并使用它。
Spring Cloud Kubernetes Configuration Watcher 可以通过两种方式向应用程序发送刷新通知。
-
通过 HTTP,在这种情况下,收到通知的应用程序必须
/refresh
执行器端点公开并可从集群内访问 -
使用 Spring Cloud Bus,在这种情况下,您需要将消息代理部署到您的 custer 上,以便应用程序使用。
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
服务帐户和相关的角色绑定对于 Spring Cloud Kubernetes 配置的正常工作非常重要。 控制器需要访问权限才能读取有关 Kubernetes 集群中的 ConfigMaps、Pod、服务、端点和密钥的数据。
13.2. 监控 ConfigMap 和密钥
Spring Cloud Kubernetes Configuration Watcher 将对 ConfigMaps 中的更改做出反应,标签为spring.cloud.kubernetes.config
与值true
或标签为spring.cloud.kubernetes.secret
与值true
.如果 ConfigMap 或 Secret 没有这些标签
或者这些标签的值不是true
则任何更改都将被忽略。
Spring Cloud Kubernetes Configuration Watcher 在 ConfigMaps 和 Secrets 上查找的标签可以通过设置spring.cloud.kubernetes.configuration.watcher.configLabel
和spring.cloud.kubernetes.configuration.watcher.secretLabel
分别。
如果对具有有效标签的 ConfigMap 或 Secret 进行了更改,则 Spring Cloud Kubernetes Configuration Watcher 将采用 ConfigMap 或 Secret 的名称 并使用该名称向应用程序发送通知。
13.3. HTTP 实现
默认情况下使用的 HTTP 实现。使用此实现时,Spring Cloud Kubernetes Configuration Watcher 和
更改为 ConfigMap 或 Secret 时,HTTP 实现将使用 Spring Cloud Kubernetes Discovery Client 来获取所有
与 ConfigMap 或 Secret 的名称匹配的应用程序实例,并向应用程序的执行器发送 HTTP POST 请求/refresh
端点。默认情况下,它会将发布请求发送到/actuator/refresh
使用在发现客户端中注册的端口。
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. 消息传递实现
可以通过将配置文件设置为bus-amqp
(RabbitMQ) 或bus-kafka
(Kafka) 当 Spring Cloud Kubernetes 配置观察器
应用程序被部署到 Kubernetes。
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