13. Spring Cloud Kubernetes 配置观察器

Kubernetes 提供了将 ConfigMap 或 Secret 作为卷挂载到应用程序容器中的功能。当 ConfigMap 或 Secret 的内容发生更改时,挂载的卷将使用这些更改进行更新spring-doc.cn

但是,除非您重新启动应用程序,否则 Spring Boot 不会自动更新这些更改。Spring Cloud 提供刷新应用程序上下文的能力,而无需重新启动应用程序,方法是点击 actuator 端点或通过使用 Spring Cloud Bus 发布一个。/refreshRefreshRemoteApplicationEventspring-doc.cn

要实现在 Kubernetes 上运行的 Spring Cloud 应用程序的配置刷新,您可以部署 Spring Cloud Kubernetes Configuration Watcher 控制器部署到 Kubernetes 集群中。spring-doc.cn

该应用程序作为容器发布,可在 Docker Hub 上使用。 但是,如果您需要自定义配置观察程序行为或更喜欢自己构建镜像,则可以轻松构建自己的镜像 图像,并使用它。spring-doc.cn

Spring Cloud Kubernetes Configuration Watcher 可以通过两种方式向应用程序发送刷新通知。spring-doc.cn

  1. 通过 HTTP,在这种情况下,被通知的应用程序必须公开 actuator 端点,并且可以从集群内部访问/refreshspring-doc.cn

  2. 使用 Spring Cloud Bus,在这种情况下,您需要将消息代理部署到您的客户中,以供应用程序使用。spring-doc.cn

13.1. 部署 YAML

以下是可用于将 Kubernetes Configuration Watcher 部署到 Kubernetes 的示例部署 YAML。spring-doc.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: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 的数据。spring-doc.cn

13.2. 监控 ConfigMap 和 Secret

Spring Cloud Kubernetes Configuration Watcher 将对 ConfigMaps 中的更改做出反应,其标签为 with 值或任何 Secret 的标签为 with the value。如果 ConfigMap 或 Secret 没有这些标签中的任何一个 或者这些标签的值不是,则任何更改都将被忽略。spring.cloud.kubernetes.configtruespring.cloud.kubernetes.secrettruetruespring-doc.cn

Spring Cloud Kubernetes Configuration Watcher 在 ConfigMaps 和 Secrets 上查找的标签可以通过分别设置 和 来更改。spring.cloud.kubernetes.configuration.watcher.configLabelspring.cloud.kubernetes.configuration.watcher.secretLabelspring-doc.cn

如果对具有有效标签的 ConfigMap 或 Secret 进行了更改,则 Spring Cloud Kubernetes Configuration Watcher 将采用 ConfigMap 或 Secret 的名称 ,然后使用该名称向应用程序发送通知。spring-doc.cn

13.3. HTTP 实现

HTTP 实现是默认使用的。使用此实现时, Spring Cloud Kubernetes Configuration Watcher 和 更改为 ConfigMap 或 Secret 时,HTTP 实现将使用 Spring Cloud Kubernetes Discovery Client 来获取所有 与 ConfigMap 或 Secret 的名称匹配并向应用程序的 actuator 端点发送 HTTP POST 请求的实例。默认情况下,它将使用在 discovery client 中注册的端口发送 post 请求。/refresh/actuator/refreshspring-doc.cn

13.3.1. 非默认 Management Port 和 Actuator 路径

如果应用程序使用非默认 actuator 路径和/或对管理端点使用不同的端口,则应用程序的 Kubernetes 服务 可以添加一个名为 THE NOT,并将其值设置为应用程序使用的 path 和 port。例如boot.spring.io/actuatorspring-doc.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.actuatorPortspring-doc.cn

13.4. 消息传递实现

当 Spring Cloud Kubernetes 配置观察器时,可以通过将 profile 设置为 (RabbitMQ) 或 (Kafka) 来启用消息传递实现 应用程序部署到 Kubernetes。bus-amqpbus-kafkaspring-doc.cn

13.5. 配置 RabbitMQ

启用配置文件后,您需要配置 Spring RabbitMQ 以将其指向 RabbitMQ 的位置 实例以及进行身份验证所需的任何凭证。这是可以做到的 通过设置标准的 Spring RabbitMQ 属性,例如bus-amqpspring-doc.cn

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

13.6. 配置 Kafka

启用配置文件后,您需要配置 Spring Kafka 以将其指向 Kafka Broker 的位置 实例。这可以通过设置标准的 Spring Kafka 属性来完成,例如bus-kafkaspring-doc.cn

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