如何配置Spring Cloud Task复用SCDF集群的Kafka并自动传递地址?
针对你提出的两个问题,结合你已经尝试的方案,我整理了更清晰的实现方式和优化思路:
1. 如何配置SCT以复用SCDF的Kafka?
你当前通过SCDF Shell传递--spring.kafka.bootstrap-servers=${KAFKA_SERVICE_HOST}:${KAFKA_SERVICE_PORT}的方式是完全可行的,除此之外还有两种更便捷的全局配置方式,避免每次启动任务都手动传参:
为单个任务应用预设属性:如果这个Kafka配置只针对特定的任务应用,可以在SCDF里给该应用绑定默认属性:
dataflow>app registry set --name sample-task --type task --properties "spring.kafka.bootstrap-servers=${KAFKA_SERVICE_HOST}:${KAFKA_SERVICE_PORT}"之后启动该任务时,无需再传递Kafka参数,SCDF会自动应用这个预设配置。
设置全局任务默认属性:如果所有任务都需要复用这个Kafka配置,可以设置全局的任务属性:
dataflow>task config server set --name spring.kafka.bootstrap-servers --value ${KAFKA_SERVICE_HOST}:${KAFKA_SERVICE_PORT}所有后续启动的Spring Cloud Task都会自动继承这个Kafka配置。
2. 是否可以配置SCT使其在启动时自动获取Kafka服务器地址?
当然可以!你可以借助SCDF的环境变量传递机制,让SCT自动读取SCDF所在Pod的Kafka相关环境变量,无需手动传递参数,具体实现有两种方式:
方式一:在SCT应用中直接引用环境变量
在你的Spring Cloud Task应用的application.yml(或application.properties)里直接配置:
spring: kafka: bootstrap-servers: ${KAFKA_SERVICE_HOST}:${KAFKA_SERVICE_PORT}
然后在SCDF的Kubernetes部署配置中,开启将SCDF自身的环境变量传递给任务Pod的功能。如果你用Helm部署SCDF,可以在values.yaml中添加:
task: platform: kubernetes: deploymentProperties: - env[KAFKA_SERVICE_HOST]=${KAFKA_SERVICE_HOST} - env[KAFKA_SERVICE_PORT]=${KAFKA_SERVICE_PORT}
这样SCDF启动任务时,会自动把这两个环境变量注入到任务Pod中,SCT应用就能自动读取并配置Kafka地址了。
方式二:通过SCDF Shell配置全局任务环境变量
如果不想修改Helm配置,也可以通过SCDF Shell直接设置全局任务的环境变量传递规则:
dataflow>task platform update --name kubernetes --properties "deployer.*.kubernetes.deployment-properties=env[KAFKA_SERVICE_HOST]=${KAFKA_SERVICE_HOST},env[KAFKA_SERVICE_PORT]=${KAFKA_SERVICE_PORT}"
同样能实现任务Pod自动获取Kafka地址的效果。
你自己提出的启动命令是完全有效的,上面的方案则是在此基础上的优化,让配置更自动化、更易于维护。
内容的提问来源于stack exchange,提问作者Phuong Hoang

