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 可以通过两种方式向应用程序发送刷新通知。

  1. 通过 HTTP,在这种情况下,被通知的应用程序必须/refreshActuator 终端节点公开且可从集群内访问

  2. 使用 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.configLabelspring.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.actuatorPathspring.cloud.kubernetes.configuration.watcher.actuatorPort.

13.4. 消息传递实现

可以通过将 profile 设置为bus-amqp(RabbitMQ) 或bus-kafka(Kafka) 当 Spring Cloud Kubernetes 配置观察器 应用程序部署到 Kubernetes。

13.5. 配置 RabbitMQ

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

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

13.6. 配置 Kafka

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

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

APP信息