這篇文章給大家介紹如何解決DataFlow部署K8s應(yīng)用的問(wèn)題,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)是一家專業(yè)提供新田企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、HTML5建站、小程序制作等業(yè)務(wù)。10年已為新田眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
基于各種原因,團(tuán)隊(duì)的Kubernetes被加了限制,必須在特定的Node才可以部署。而之前沒(méi)有指定,所以Spring Cloud Data Flow在跑Task時(shí)失敗了,無(wú)法創(chuàng)建Pod。按照Spring官方文檔配置也一直沒(méi)用,后面查看源碼、修改源碼增加日志后終于解決了。
在自己定義yaml文件,并通過(guò)kubectl apply部署時(shí),所添加的限制節(jié)點(diǎn)的內(nèi)容是這樣的:
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
這樣設(shè)置是可以成功部署的。
修改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"通過(guò)Spring Cloud Data Flow發(fā)布Task,報(bào)錯(cuò)如下:
Pods in namespace pkslow can only map to specific nodes, status=Failure
查看官網(wǎng),按照官方的格式修改配置:

修改如下:
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']}]}]}}依舊報(bào)錯(cuò)。改成affinity.nodeAffinity=xxx,還是報(bào)錯(cuò)。加引號(hào),也沒(méi)用。
查看日志,也沒(méi)有太多信息。
折騰了許久,也沒(méi)太大進(jìn)展。于是就查看源碼了。
下載了Spring Cloud Data Flow的源碼,看了一下,沒(méi)有多大用處,最終發(fā)布到Kubernetes是通過(guò)Spring Cloud Deployer Kubernetes來(lái)發(fā)布的,于是又下載了它的源碼。要注意不要下載錯(cuò)了版本,我們用的是2.4.0版本。或者直接下載所有,然后切換到對(duì)應(yīng)分支:
$ 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. $ cd spring-cloud-deployer-kubernetes/ $ git branch * master $ 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' $ git branch * 2.4.0 master
先build一下,確保成功:
$ mvn clean install -DskipTests
查看源碼,也看不出為何配置沒(méi)有生效,于是在關(guān)鍵點(diǎn)打些日志出來(lái)看看。找到發(fā)布Task的入口:
KubernetesTaskLauncher#launch(AppDeploymentRequest)
即類KubernetesTaskLauncher的launch方法。開始追蹤創(chuàng)建Kubernetes Pod的過(guò)程。
KubernetesTaskLauncher#launch(AppDeploymentRequest) KubernetesTaskLauncher#launch(String, AppDeploymentRequest) AbstractKubernetesDeployer#createPodSpec DeploymentPropertiesResolver#getAffinityRules
然后在整個(gè)調(diào)用鏈增加日志打印,注意日志要加上特殊字符串,增加識(shí)別性,如:
logger.info("***pkslow log***:" + affinity.toString());追加了日志后,重新build包,替換掉Data Flow引入的jar包,重新發(fā)布即可測(cè)試。
通過(guò)新加的日志,發(fā)現(xiàn)設(shè)置的Properties一直就是沒(méi)有生效的,但為何沒(méi)生效尚未得知。
折騰了一圈還是沒(méi)解決,但項(xiàng)目又要急著使用,于是想了個(gè)辦法,先修改源碼,自己根據(jù)屬性使其生效:

如果沒(méi)有讀取到Affinity,就自己生成一個(gè)。
重新打包、替換、部署后,不再報(bào)錯(cuò),能正常執(zhí)行Task了。
之前的方案只是暫時(shí)解決,并不是一個(gè)好的辦法,還是要搞清楚為何配置沒(méi)有生效。于是再次查看源碼。在查看類KubernetesDeployerProperties的時(shí)候,發(fā)現(xiàn)了一點(diǎn)端倪:

這里的字段是沒(méi)有Affinity的。
另外,從測(cè)試用例入手(這是一個(gè)很好的思維,測(cè)試用例能告訴你很多信息),看到了DataFlow配置用例,如下:

所以,應(yīng)該是不用配置前綴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']}]}]}}重新部署后,可以了!!!
這一次確實(shí)是被Spring坑了一把,沒(méi)有明確給出配置的示例,然后官方文檔給的提示也是極其誤導(dǎo)。一開始很難想到是不用前綴Affinity的,因?yàn)?code>Kubernetes的標(biāo)準(zhǔn)配置是有的,而Spring的官方文檔提示也是有的。實(shí)在太坑了!
還好,通過(guò)查看源碼及調(diào)試,終于解決了這個(gè)問(wèn)題。
關(guān)于如何解決DataFlow部署K8s應(yīng)用的問(wèn)題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
本文題目:如何解決DataFlow部署K8s應(yīng)用的問(wèn)題
URL分享:http://www.chinadenli.net/article46/peechg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷推廣、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)