您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何解決DataFlow部署K8s應用的問題,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
基于各種原因,團隊的Kubernetes
被加了限制,必須在特定的Node
才可以部署。而之前沒有指定,所以Spring Cloud Data Flow
在跑Task
時失敗了,無法創建Pod
。按照Spring
官方文檔配置也一直沒用,后面查看源碼、修改源碼增加日志后終于解決了。
在自己定義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
,還是報錯。加引號,也沒用。
查看日志,也沒有太多信息。
折騰了許久,也沒太大進展。于是就查看源碼了。
下載了Spring Cloud Data Flow的源碼,看了一下,沒有多大用處,最終發布到Kubernetes
是通過Spring Cloud Deployer Kubernetes
來發布的,于是又下載了它的源碼。要注意不要下載錯了版本,我們用的是2.4.0
版本。或者直接下載所有,然后切換到對應分支:
$ 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
查看源碼,也看不出為何配置沒有生效,于是在關鍵點打些日志出來看看。找到發布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
一直就是沒有生效的,但為何沒生效尚未得知。
折騰了一圈還是沒解決,但項目又要急著使用,于是想了個辦法,先修改源碼,自己根據屬性使其生效:
如果沒有讀取到Affinity
,就自己生成一個。
重新打包、替換、部署后,不再報錯,能正常執行Task
了。
之前的方案只是暫時解決,并不是一個好的辦法,還是要搞清楚為何配置沒有生效。于是再次查看源碼。在查看類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']}]}]}}
重新部署后,可以了!!!
這一次確實是被Spring
坑了一把,沒有明確給出配置的示例,然后官方文檔給的提示也是極其誤導。一開始很難想到是不用前綴Affinity
的,因為Kubernetes
的標準配置是有的,而Spring
的官方文檔提示也是有的。實在太坑了!
還好,通過查看源碼及調試,終于解決了這個問題。
關于如何解決DataFlow部署K8s應用的問題就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。