网站首页 > 技术文章 正文
1 前言
SCDF指的是Spring Cloud Data Flow。
基于各种原因,团队的Kubernetes被加了限制,必须在特定的Node才可以部署。而之前没有指定,所以Spring Cloud Data Flow在跑Task时失败了,无法创建Pod。按照Spring官方文档配置也一直没用,后面查看源码、修改源码增加日志后终于解决了。
2 配置无法生效
在自己定义yaml文件,并通过kubectl apply部署时,所添加的限制节点的内容是这样的:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/os
operator: In
values:
- linux
containers:
- name: php-apache
image: 'pkslow/hpa-example:latest'
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
cpu: 200m
imagePullPolicy: IfNotPresent
这样设置是可以成功部署的。
修改Data Flow的配置如下:
spring:
cloud:
dataflow:
task:
platform:
kubernetes:
accounts:
default:
limits:
memory: 1024Mi
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/os
operator: In
values:
- linux
datasource:
url: jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT}/mysql
username: root
password: ${mysql-root-password}
driverClassName: org.mariadb.jdbc.Driver
testOnBorrow: true
validationQuery: "SELECT 1"
通过Spring Cloud Data Flow发布Task,报错如下:
Pods in namespace pkslow can only map to specific nodes, status=Failure
查看官网,按照官方的格式修改配置:
修改如下:
spring:
cloud:
dataflow:
task:
platform:
kubernetes:
accounts:
default:
limits:
memory: 1024Mi
affinity:
nodeAffinity: { requiredDuringSchedulingIgnoredDuringExecution: { nodeSelectorTerms: [ { matchExpressions: [ { key: 'beta.kubernetes.io/os', operator: 'In', values: [ 'linux']}]}]}}
依旧报错。改成affinity.nodeAffinity=xxx,还是报错。加引号,也没用。
查看日志,也没有太多信息。
折腾了许久,也没太大进展。于是就查看源码了。
3 查看源码
3.1 源码下载
下载了Spring Cloud Data Flow的源码,看了一下,没有多大用处,最终发布到Kubernetes是通过Spring Cloud Deployer Kubernetes来发布的,于是又下载了它的源码。要注意不要下载错了版本,我们用的是2.4.0版本。或者直接下载所有,然后切换到对应分支:
nbsp;git clone https://github.com/spring-cloud/spring-cloud-deployer-kubernetes.git
Cloning into 'spring-cloud-deployer-kubernetes'...
remote: Enumerating objects: 65, done.
remote: Counting objects: 100% (65/65), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 4201 (delta 26), reused 42 (delta 8), pack-reused 4136
Receiving objects: 100% (4201/4201), 738.79 KiB | 936.00 KiB/s, done.
Resolving deltas: 100% (1478/1478), done.
nbsp;cd spring-cloud-deployer-kubernetes/
nbsp;git branch
* master
nbsp;git checkout 2.4.0
Branch '2.4.0' set up to track remote branch '2.4.0' from 'origin'.
Switched to a new branch '2.4.0'
nbsp;git branch
* 2.4.0
master
先build一下,确保成功:
nbsp;mvn clean install -DskipTests
3.2 添加日志
查看源码,也看不出为何配置没有生效,于是在关键点打些日志出来看看。找到发布Task的入口:
KubernetesTaskLauncher#launch(AppDeploymentRequest)
即类KubernetesTaskLauncher的launch方法。开始追踪创建Kubernetes Pod的过程。
KubernetesTaskLauncher#launch(AppDeploymentRequest)
KubernetesTaskLauncher#launch(String, AppDeploymentRequest)
AbstractKubernetesDeployer#createPodSpec
DeploymentPropertiesResolver#getAffinityRules
然后在整个调用链增加日志打印,注意日志要加上特殊字符串,增加识别性,如:
logger.info("***pkslow log***:" + affinity.toString());
追加了日志后,重新build包,替换掉Data Flow引入的jar包,重新发布即可测试。
通过新加的日志,发现设置的Properties一直就是没有生效的,但为何没生效尚未得知。
4 修改源码
折腾了一圈还是没解决,但项目又要急着使用,于是想了个办法,先修改源码,自己根据属性使其生效:
如果没有读取到Affinity,就自己生成一个。
重新打包、替换、部署后,不再报错,能正常执行Task了。
5 最终解决
之前的方案只是暂时解决,并不是一个好的办法,还是要搞清楚为何配置没有生效。于是再次查看源码。在查看类
KubernetesDeployerProperties的时候,发现了一点端倪:
这里的字段是没有Affinity的。
另外,从测试用例入手(这是一个很好的思维,测试用例能告诉你很多信息),看到了DataFlow配置用例,如下:
所以,应该是不用配置前缀Affinity的,修改后配置如下:
spring:
cloud:
dataflow:
task:
platform:
kubernetes:
accounts:
default:
limits:
memory: 1024Mi
nodeAffinity: { requiredDuringSchedulingIgnoredDuringExecution: { nodeSelectorTerms: [ { matchExpressions: [ { key: 'beta.kubernetes.io/os', operator: 'In', values: [ 'linux']}]}]}}
重新部署后,可以了!!!
6 总结
这一次确实是被Spring坑了一把,没有明确给出配置的示例,然后官方文档给的提示也是极其误导。一开始很难想到是不用前缀Affinity的,因为Kubernetes的标准配置是有的,而Spring的官方文档提示也是有的。实在太坑了!
还好,通过查看源码及调试,终于解决了这个问题。
多读书,多分享;多写作,多整理。
猜你喜欢
- 2025-07-19 4个AI生成UI界面的神器,哪个更好用?
- 2025-04-24 详解使用git和jmeter-maven-plugin管理jmeter脚本的接口测试方案
- 2025-04-24 不切换 Git 分支,却能同时在多个分支上工作,我是怎么做到的?
- 2025-04-24 常用 Git 命令清单
- 2025-04-24 k8s自动化运维四之数据备份
- 2024-07-18 高质量产品研发迭代,Git技能保驾护航
- 2024-07-18 git常用命令总结(git常用命令详解)
- 2024-07-18 Git知识点总结(git的理解)
- 2024-07-18 gitlab搭建与使用(gitlab-ce)
- 2024-07-18 Git常用命令备忘(git提交备注规范)
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 569℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 511℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 468℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 447℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 445℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)