Kubernetes 提供了将 ConfigMap 或 Secret 挂载为应用程序容器中的卷的功能。当 ConfigMap 或 Secret 的内容发生更改时,挂载的卷将根据这些更改进行更新。
但是,除非重新启动应用程序,否则 Spring Boot 不会自动更新这些更改。春云
提供刷新应用程序上下文的功能,而无需重新启动应用程序,方法是按
执行器端点或通过使用 Spring Cloud Bus 发布。/refresh
RefreshRemoteApplicationEvent
若要实现在 Kubernetes 上运行的 Spring Cloud 应用的配置刷新,可以部署 Spring Cloud Kubernetes 配置观察程序控制器进入 Kubernetes 集群。
该应用程序作为容器发布,可在 Docker Hub 上使用。 但是,如果您需要自定义配置观察程序行为,或者更喜欢自己构建映像,则可以轻松构建自己的映像 来自 GitHub 源代码的图像并使用它。
配置它的另一个选项是在用于部署配置观察程序的 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 规则。
仅当特定更改来自具有标签的源时,来自 configmaps/secret 的更改才会触发从配置观察程序触发的事件: 或 .spring.cloud.kubernetes.config=true
spring.cloud.kubernetes.secret=true
简单来说,如果您更改了没有上述标签的 configmap(或密钥),配置观察程序将跳过为其触发事件(如果您启用了调试日志记录,这将在日志中可见)。
默认情况下,配置观察程序将监视已配置命名空间中的所有配置映射/密钥。如果要过滤以仅观看特定来源,可以通过设置以下设置来实现:
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 Configuration Watcher 可以通过两种方式向应用程序发送刷新通知。
-
通过 HTTP(在这种情况下,被通知的应用程序)必须公开执行器端点并从集群内访问
/refresh
-
使用 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.1.2
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、服务、端点和密钥的数据。
监控 ConfigMap 和 Secret
如果对具有有效标签的 ConfigMap 或 Secret 进行了更改(如上所述),则 Spring Cloud Kubernetes Configuration Watcher 将采用 ConfigMap 或 Secret 的名称 并使用该名称向应用程序发送通知。不过,对于您的用例来说,这可能还不够,例如,您可能想要:
-
将 config-map 绑定到多个应用程序,以便单个 configmap 中的更改触发许多服务的刷新
-
让基于配置文件的源触发应用程序的事件
出于这个原因,您可以指定一个附加注释:
spring.cloud.kubernetes.configmap.apps
或。它采用一串用逗号分隔的应用程序,
指定在此 secret/configmap 中发生更改时将收到通知的应用程序的名称。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 Configuration Watcher 和
更改为 ConfigMap 或 Secret,则 HTTP 实现将使用 Spring Cloud Kubernetes Discovery Client 获取所有
与 ConfigMap 或 Secret 的名称匹配并将 HTTP POST 请求发送到应用程序的执行器端点的应用程序实例。默认情况下,它会使用在发现客户端中注册的端口将 post 请求发送到。/refresh
/actuator/refresh
非默认管理端口和执行器路径
如果应用程序使用非默认执行器路径和/或对管理终结点使用不同的端口,则应用程序的 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
消息传递实现
当Spring Cloud Kubernetes Configuration Watcher时,可以通过将配置文件设置为(RabbitMQ)或(Kafka)来启用消息传递实现
应用程序部署到 Kubernetes。bus-amqp
bus-kafka
配置 RabbitMQ
启用配置文件后,需要将 Spring RabbitMQ 配置为将其指向 RabbitMQ 的位置
您要使用的实例以及身份验证所需的任何凭据。这是可以做到的
例如,通过设置标准的 Spring RabbitMQ 属性bus-amqp
spring:
rabbitmq:
username: user
password: password
host: rabbitmq
配置 Kafka
启用配置文件后,您需要将 Spring Kafka 配置为将其指向 Kafka 代理的位置
您要使用的实例。这可以通过设置标准的 Spring Kafka 属性来完成,例如bus-kafka
spring:
kafka:
producer:
bootstrap-servers: localhost:9092