对于最新稳定版本,请使用Spring Cloud Kubernetes 5.0.0spring-doc.cadn.net.cn

Spring Cloud Kubernetes Configuration Watcher

Kubernetes 提供了将 ConfigMap 或 Secret 作为卷挂载到应用容器的功能。当 ConfigMap 或 Secret 的内容发生变化时,已挂载的卷会被更新为这些更改spring-doc.cadn.net.cn

不过,除非你重启应用程序,否则 Spring Boot 不会自动更新这些更改。春云 提供无需重启应用程序,即可刷新应用上下文的能力,通过点击以下作 执行器端点/刷新或通过出版RefreshRemoteApplicationEvent使用春云总线。spring-doc.cadn.net.cn

为了实现运行在 Kubernetes 上的 Spring Cloud 应用的配置刷新,你可以部署 Spring Cloud 将Kubernetes配置观察者控制器集成到你的Kubernetes集群中。spring-doc.cadn.net.cn

该应用以容器形式发布,可在 Docker Hub 上使用。 不过,如果你需要自定义配置观察者的行为,或者更喜欢自己构建镜像,你可以轻松自己构建 GitHub 上的源代码图片,然后用那个。spring-doc.cadn.net.cn

另一种配置选项是在部署配置监视器的deployment.yaml中提供一些环境变量。以下是一些重要的内容:spring-doc.cadn.net.cn

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

这些功能使配置监控器进行调试日志成为可能,在初始设置中尤为有用,能够诊断潜在的错误配置。spring-doc.cadn.net.cn

env:
  - name: SPRING_CLOUD_KUBERNETES_RELOAD_NAMESPACES_0
    value: "namespace-a"

这个功能让观察者知道在哪里搜索秘密和配置图。这里有两个选项:选择性命名空间(上述设置)和由命名空间解析选择的命名空间(这是默认选项)。 请记住,所有这些选项都需要符合RBAC的规定。spring-doc.cadn.net.cn

只有当配置文件/秘密的更改来自带有标签的源时,配置文件监控器才会触发事件:Spring.cloud.kubernetes.config=trueSpring.cloud.Kubernetes.Secret=True.spring-doc.cadn.net.cn

简单来说,如果你更改了没有上述标签的configmap(或secret),配置观察者会跳过触发该事件(如果你启用了调试日志,日志中会显示出来)。spring-doc.cadn.net.cn

默认情况下,配置观察员会监控配置命名空间内的所有配置地图/秘密。如果你想筛选只看特定来源,可以通过设置:spring-doc.cadn.net.cn

SPRING_CLOUD_KUBERNETES_CONFIG_INFORMER_ENABLED=TRUE

这会告诉观察者只监控带有标签的来源:spring.cloud.kubernetes.config.informer.enabled=true.spring-doc.cadn.net.cn

还有一个重要的配置,特别是对于配置图和以卷形式挂载的秘密配置(通过Spring.cloud.kubernetes.config.paths/Spring.cloud.kubernetes.secrets.paths或者使用spring.config.import)是:spring-doc.cadn.net.cn

- name: SPRING_CLOUD_KUBERNETES_CONFIGURATION_WATCHER_REFRESHDELAY
  value: "10000"

这说明我们应该等待多少毫秒,然后才从配置观察器触发事件。这很重要,因为 Kubernetes 文档中写道:spring-doc.cadn.net.cn

当当前在卷中被消耗的 ConfigMap 更新时,投影键最终也会被更新。spring-doc.cadn.net.cn

你需要在集群上“匹配”这个部分,最终以毫秒计分。spring-doc.cadn.net.cn

Spring Cloud Kubernetes 配置观察器可以通过两种方式向应用程序发送刷新通知。spring-doc.cadn.net.cn

  1. 在 HTTP 上,在这种情况下,被通知的应用程序必须具备/刷新执行器端点暴露并可从集群内部访问spring-doc.cadn.net.cn

  2. 使用Spring Cloud Bus,这种情况下你需要在custer上部署一个消息代理来让应用使用。spring-doc.cadn.net.cn

部署 YAML

下面是一个示例的部署 YAML,你可以用来将 Kubernetes 配置观察器部署到 Kubernetes 上。spring-doc.cadn.net.cn

---
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.2.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、Pods、Services、Endpoints 和 Secrets 的数据。spring-doc.cadn.net.cn

监控配置映射与秘密

如果对带有有效标签的 ConfigMap 或 Secret 进行了更改(如上所述),Spring Cloud Kubernetes Configuration Watcher 会使用该 ConfigMap 或 Secret 的名称并向该名称的应用程序发送通知。不过这可能不够满足你的使用场景,例如你可以:spring-doc.cadn.net.cn

因此,你可以指定一个附加注释:spring-doc.cadn.net.cn

Spring.cloud.kubernetes.configmap.appsSpring.cloud.kubernetes.secret.apps. 它使用一串用逗号分隔的应用串,指定当该秘密/配置映射发生变化时,将收到通知的应用程序名称。spring-doc.cadn.net.cn

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配置观察器和发生对ConfigMap或Secret的更改,HTTP实现将使用Spring Cloud的Kubernetes发现客户端获取所有与ConfigMap或Secret名称匹配的应用实例,并向应用执行器发送HTTP POST请求/刷新端点。 默认情况下,它会将帖子请求发送到/执行器/刷新使用发现客户端注册的端口。spring-doc.cadn.net.cn

你也可以配置配置观察者调用实例关闭执行器端点。为此你可以设置Spring.cloud.kubernetes.configuration.watcher.refresh-strategy=shutdown.spring-doc.cadn.net.cn

非默认管理端口和执行器路径

如果应用使用非默认执行器路径和/或管理端点使用不同端口,应用的 Kubernetes 服务可以添加一个名为boot.spring.io/actuator并将其值设置为应用程序使用的路径和端口。 例如spring-doc.cadn.net.cn

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.actuatorPathspring.cloud.kubernetes.configuration.watcher.actuatorPort.spring-doc.cadn.net.cn

消息传递实现

消息传递实现可以通过将配置文件设置为以下总线-AMQP(RabbitMQ)或巴士卡夫卡(Kafka)当 Spring Cloud Kubernetes 配置观察者应用部署到 Kubernetes 时。默认情况下,使用消息实现时,配置观察者会发送RefreshRemoteApplicationEvent用 为所有应用实例 Spring Cloud Bus。这将使应用实例刷新应用的配置属性,而无需重启实例。spring-doc.cadn.net.cn

你也可以配置关闭应用实例,以刷新应用的配置属性。当应用关闭时,Kubernetes 会重启应用实例,加载新的配置属性。使用此策略集合Spring.cloud.kubernetes.configuration.watcher.refresh-strategy=shutdown.spring-doc.cadn.net.cn

配置RabbitMQ

总线-AMQP启用配置文件后,你需要配置 Spring RabbitMQ,将其指向 RabbitMQ 实例的位置以及认证所需的凭证。这可以通过设置例如,通过设置标准的 Spring RabbitMQ 属性来实现spring-doc.cadn.net.cn

spring:
  rabbitmq:
    username: user
    password: password
    host: rabbitmq

配置Kafka

巴士卡夫卡配置文件已启用,你需要配置 Spring Kafka 将其指向 Kafka Broker 的位置实例。这可以通过设置标准的 Spring Kafka 属性来实现,例如。spring-doc.cadn.net.cn

spring:
  kafka:
    producer:
      bootstrap-servers: localhost:9092