13. Spring Cloud Kubernetes 配置观察器
Kubernetes 提供了将 ConfigMap 或 Secret 作为卷挂载到应用程序容器中的功能。当 ConfigMap 或 Secret 的内容发生更改时,挂载的卷将使用这些更改进行更新。
但是,除非您重新启动应用程序,否则 Spring Boot 不会自动更新这些更改。Spring Cloud
提供刷新应用程序上下文的能力,而无需重新启动应用程序,方法是点击
执行器端点/refresh
或通过发布RefreshRemoteApplicationEvent
使用 Spring Cloud Bus。
要实现在 Kubernetes 上运行的 Spring Cloud 应用程序的配置刷新,您可以部署 Spring Cloud Kubernetes Configuration Watcher 控制器部署到 Kubernetes 集群中。
该应用程序作为容器发布,可在 Docker Hub 上使用。
Spring Cloud Kubernetes Configuration Watcher 可以通过两种方式向应用程序发送刷新通知。
-
通过 HTTP,在这种情况下,被通知的应用程序必须
/refresh
Actuator 终端节点公开且可从集群内访问 -
使用 Spring Cloud Bus,在这种情况下,您需要将消息代理部署到您的客户中,以供应用程序使用。
13.1. 部署 YAML
以下是可用于将 Kubernetes Configuration Watcher 部署到 Kubernetes 的示例部署 YAML。
---
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 集群中的 ConfigMap、Pod、服务、端点和 Secrets 的数据。
13.2. 监控 ConfigMap 和 Secret
Spring Cloud Kubernetes 配置观察器将使用标签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 的名称匹配并向应用程序的 actuator 发送 HTTP POST 请求的实例/refresh
端点。默认情况下,它会将 post 请求发送到/actuator/refresh
使用在 Discovery Client 中注册的端口。
13.3.1. 非默认 Management Port 和 Actuator 路径
如果应用程序使用非默认 actuator 路径和/或对管理端点使用不同的端口,则应用程序的 Kubernetes 服务
可以添加一个名为boot.spring.io/actuator
并将其值设置为应用程序使用的 path 和 port。例如
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
您可以选择配置 actuator path 和/或 management port 的另一种方法是设置spring.cloud.kubernetes.configuration.watcher.actuatorPath
和spring.cloud.kubernetes.configuration.watcher.actuatorPort
.
13.4. 消息传递实现
可以通过将 profile 设置为bus-amqp
(RabbitMQ) 或bus-kafka
(Kafka) 当 Spring Cloud Kubernetes 配置观察器
应用程序部署到 Kubernetes。
13.5. 配置 RabbitMQ
当bus-amqp
profile 启用后,您需要配置 Spring RabbitMQ 以将其指向 RabbitMQ 的位置
实例以及进行身份验证所需的任何凭证。这是可以做到的
通过设置标准的 Spring RabbitMQ 属性,例如
spring:
rabbitmq:
username: user
password: password
host: rabbitmq
13.6. 配置 Kafka
当bus-kafka
profile 启用后,您需要配置 Spring Kafka 以将其指向 Kafka Broker 的位置
实例。这可以通过设置标准的 Spring Kafka 属性来完成,例如
spring:
kafka:
producer:
bootstrap-servers: localhost:9092