Kubernetes 部署

如果您已配置并构建示例流应用程序以使用其中一个受支持的消息代理运行,则可以在 Kubernetes 集群上将它们作为独立应用程序运行。

本节将指导您如何在 Kubernetes 上部署三个 Spring Cloud Stream 应用程序。

设置 Kubernetes 集群

对于此示例,我们需要一个正在运行的 Kubernetes 集群。在本例中,我们部署到 minikube

验证 Minikube 是否正在运行

要验证 Minikube 是否正在运行,请运行以下命令(如果 Minikube 正在运行,则显示典型输出)

$minikube status

host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

构建 Docker 镜像

为了构建 Docker 镜像,我们使用 Spring Boot Maven 插件

如果您使用 Boot Maven 插件从头开始构建应用程序,则默认配置应该可以工作。

现在,您可以运行 Maven 构建以在 minikube Docker 注册表中创建 Docker 镜像。为此,请运行以下命令

eval $(minikube docker-env)
./mvnw spring-boot:build-image

如果您下载了项目源代码,则该项目包含一个父 pom,以便您可以使用单个命令构建所有模块。否则,请分别为源代码、处理器和接收器运行构建。您只需为每个终端会话运行一次 eval $(minikube docker-env)

如果您使用 -Pkafka-Prabbit 从项目源代码构建,则镜像将包含相应的绑定器依赖项。如果要为特定的消息代理构建镜像,请使用

./mvnw clean spring-boot:build-image -P<broker>

安装 Apache Kafka

现在,我们可以使用 Spring Cloud Data Flow 的默认配置安装 Kafka 消息代理。为此,请运行以下命令:

kubectl apply -f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/kubernetes/kafka/kafka-deployment.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/kubernetes/kafka/kafka-svc.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/kubernetes/kafka/kafka-zk-deployment.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/kubernetes/kafka/kafka-zk-svc.yaml

部署流

要部署流,您必须先复制并粘贴以下 YAML 并将其保存到 usage-cost-stream.yaml

kind: Pod
apiVersion: v1
metadata:
  name: usage-detail-sender
  labels:
    app: usage-cost-stream
spec:
  containers:
    - name: usage-detail-sender
      image: usage-detail-sender:0.0.1-SNAPSHOT
      env:
        - name: SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKERS
          value: kafka
        - name: SPRING_CLOUD_STREAM_BINDINGS_OUTPUT_DESTINATION
          value: user-details
---
kind: Pod
apiVersion: v1
metadata:
  name: usage-cost-processor
  labels:
    app: usage-cost-stream
spec:
  containers:
    - name: usage-cost-processor
      image: usage-cost-processor:0.0.1-SNAPSHOT
      ports:
        - containerPort: 80
          protocol: TCP
      env:
        - name: SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKERS
          value: kafka
        - name: SPRING_CLOUD_STREAM_BINDINGS_INPUT_GROUP
          value: usage-cost-stream
        - name: SPRING_CLOUD_STREAM_BINDINGS_INPUT_DESTINATION
          value: user-details
        - name: SPRING_CLOUD_STREAM_BINDINGS_OUTPUT_DESTINATION
          value: user-cost
---
kind: Pod
apiVersion: v1
metadata:
  name: usage-cost-logger
  labels:
    app: usage-cost-stream
spec:
  containers:
    - name: usage-cost-logger
      image: usage-cost-logger:0.0.1-SNAPSHOT
      env:
        - name: SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKERS
          value: kafka
        - name: SPRING_CLOUD_STREAM_BINDINGS_INPUT_GROUP
          value: usage-cost-stream
        - name: SPRING_CLOUD_STREAM_BINDINGS_INPUT_DESTINATION
          value: user-cost

然后,您需要通过运行以下命令来部署应用程序:

kubectl apply -f usage-cost-stream.yaml

如果一切顺利,您应该会看到以下输出:

pod/usage-detail-sender created
pod/usage-cost-processor created
pod/usage-cost-logger created

前面的 YAML 为源、处理器和接收器应用程序指定了三个 pod 资源。每个 pod 都有一个容器,该容器引用相应的 Docker 映像。

我们将 Kafka 绑定参数设置为环境变量。输入和输出目标名称必须正确才能连接流。具体来说,源的输出必须与处理器的输入相同,处理器的输出必须与接收器的输入相同。我们还设置了 Kafka 代理的逻辑主机名,以便每个应用程序都可以连接到它。这里我们使用 Kafka 服务名称,在本例中为 kafka-broker。我们设置了 app: user-cost-stream 标签来对我们的应用程序进行逻辑分组。

我们使用环境变量设置 Spring Cloud Stream 绑定参数。输入和输出目标名称必须正确才能连接流。具体来说,源的输出必须与处理器的输入相同,处理器的输出必须与接收器的输入相同。我们将输入和输出设置为如下:

  • 使用情况详细信息发送器:SPRING_CLOUD_STREAM_BINDINGS_OUTPUT_DESTINATION=user-details
  • 使用成本处理器:SPRING_CLOUD_STREAM_BINDINGS_INPUT_DESTINATION=user-detailsSPRING_CLOUD_STREAM_BINDINGS_OUTPUT_DESTINATION=user-cost
  • 使用成本记录器:SPRING_CLOUD_STREAM_BINDINGS_INPUT_DESTINATION=user-cost

安装 RabbitMQ

您可以使用 Spring Cloud Data Flow 的默认配置安装 RabbitMQ 消息代理。为此,请运行以下命令:

kubectl apply -f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/kubernetes/rabbitmq/rabbitmq-deployment.yaml \
-f https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/main/src/kubernetes/rabbitmq/rabbitmq-svc.yaml

部署流

要部署流,您必须首先复制并粘贴以下 YAML 内容并将其保存到 usage-cost-stream.yaml

kind: Pod
apiVersion: v1
metadata:
  name: usage-detail-sender
  labels:
    app: usage-cost-stream
spec:
  containers:
    - name: usage-detail-sender
      image: usage-detail-sender:0.0.1-SNAPSHOT
      env:
        - name: SPRING_RABBITMQ_ADDRESSES
          value: rabbitmq

---
kind: Pod
apiVersion: v1
metadata:
  name: usage-cost-processor
  labels:
    app: usage-cost-stream
spec:
  containers:
    - name: usage-cost-processor
      image: usage-cost-processor:0.0.1-SNAPSHOT
      env:
        - name: SPRING_RABBITMQ_ADDRESSES
          value: rabbitmq
---
kind: Pod
apiVersion: v1
metadata:
  name: usage-cost-logger
  labels:
    app: usage-cost-stream
spec:
  containers:
    - name: usage-cost-logger
      image: usage-cost-logger:0.0.1-SNAPSHOT
      env:
        - name: SPRING_RABBITMQ_ADDRESSES
          value: rabbitmq

然后,您可以按如下方式部署应用程序

kubectl apply -f usage-cost-stream.yaml

如果一切顺利,您应该会看到以下输出:

pod/usage-detail-sender created
pod/usage-cost-processor created
pod/usage-cost-logger created

前面的 YAML 为源、处理器和接收器应用程序指定了三个 pod 资源。 每个 pod 都有一个引用相应 docker 镜像的容器。

我们为每个应用程序设置了 RabbitMQ 代理的逻辑主机名,以便连接到它。 这里我们使用 RabbitMQ 服务名称(在本例中为 rabbitmq)。 我们还设置了标签 app: user-cost-stream 以逻辑方式对我们的应用程序进行分组。

验证部署

要验证部署,请使用以下命令来跟踪 usage-cost-logger 接收器的日志

kubectl logs -f usage-cost-logger

您应该会看到类似于以下流式传输的消息

2021-03-05 17:40:52.280  INFO 1 --- [fOjmHePqc5VWA-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user5", "callCost": "28.1", "dataCost": "7.3500000000000005" }
2021-03-05 17:40:53.279  INFO 1 --- [fOjmHePqc5VWA-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user2", "callCost": "21.400000000000002", "dataCost": "22.900000000000002" }
2021-03-05 17:40:54.279  INFO 1 --- [fOjmHePqc5VWA-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user3", "callCost": "0.7000000000000001", "dataCost": "26.35" }
2021-03-05 17:40:55.281  INFO 1 --- [fOjmHePqc5VWA-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user5", "callCost": "17.5", "dataCost": "25.8" }
2021-03-05 17:40:56.286  INFO 1 --- [fOjmHePqc5VWA-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user3", "callCost": "25.3", "dataCost": "3.0" }
2021-03-05 17:40:57.289  INFO 1 --- [fOjmHePqc5VWA-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user4", "callCost": "6.300000000000001", "dataCost": "19.700000000000003" }
2021-03-05 17:40:58.290  INFO 1 --- [fOjmHePqc5VWA-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user4", "callCost": "1.4000000000000001", "dataCost": "19.6" }

清理

要删除流,我们可以使用我们之前创建的标签,如下所示

kubectl delete pod -l app=usage-cost-stream

或者

kubectl delete -f usage-cost-stream.yaml

要卸载 RabbitMQ,请运行以下命令

kubectl delete all -l app=rabbitmq

要卸载 Kafka,请运行以下命令

kubectl delete all -l app=kafka