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-details
和SPRING_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