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