溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解決DataFlow部署K8s應(yīng)用的問題

發(fā)布時間:2021-12-06 10:54:02 來源:億速云 閱讀:105 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹如何解決DataFlow部署K8s應(yīng)用的問題,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1 前言

基于各種原因,團隊的Kubernetes被加了限制,必須在特定的Node才可以部署。而之前沒有指定,所以Spring Cloud Data Flow在跑Task時失敗了,無法創(chuàng)建Pod。按照Spring官方文檔配置也一直沒用,后面查看源碼、修改源碼增加日志后終于解決了。

2 配置無法生效

在自己定義yaml文件,并通過kubectl apply部署時,所添加的限制節(jié)點的內(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"

通過Spring Cloud Data Flow發(fā)布Task,報錯如下:

Pods in namespace pkslow can only map to specific nodes, status=Failure

查看官網(wǎng),按照官方的格式修改配置:

如何解決DataFlow部署K8s應(yī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']}]}]}}

依舊報錯。改成affinity.nodeAffinity=xxx,還是報錯。加引號,也沒用。

查看日志,也沒有太多信息。

折騰了許久,也沒太大進展。于是就查看源碼了。

3 查看源碼

3.1 源碼下載

下載了Spring Cloud Data Flow的源碼,看了一下,沒有多大用處,最終發(fā)布到Kubernetes是通過Spring Cloud Deployer Kubernetes來發(fā)布的,于是又下載了它的源碼。要注意不要下載錯了版本,我們用的是2.4.0版本?;蛘咧苯酉螺d所有,然后切換到對應(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

3.2 添加日志

查看源碼,也看不出為何配置沒有生效,于是在關(guān)鍵點打些日志出來看看。找到發(fā)布Task的入口:

KubernetesTaskLauncher#launch(AppDeploymentRequest)

即類KubernetesTaskLauncherlaunch方法。開始追蹤創(chuàng)建Kubernetes Pod的過程。

KubernetesTaskLauncher#launch(AppDeploymentRequest)
KubernetesTaskLauncher#launch(String, AppDeploymentRequest)
AbstractKubernetesDeployer#createPodSpec
DeploymentPropertiesResolver#getAffinityRules

然后在整個調(diào)用鏈增加日志打印,注意日志要加上特殊字符串,增加識別性,如:

logger.info("***pkslow log***:" + affinity.toString());

追加了日志后,重新build包,替換掉Data Flow引入的jar包,重新發(fā)布即可測試。

通過新加的日志,發(fā)現(xiàn)設(shè)置的Properties一直就是沒有生效的,但為何沒生效尚未得知。

4 修改源碼

折騰了一圈還是沒解決,但項目又要急著使用,于是想了個辦法,先修改源碼,自己根據(jù)屬性使其生效:

如何解決DataFlow部署K8s應(yīng)用的問題

如果沒有讀取到Affinity,就自己生成一個。

重新打包、替換、部署后,不再報錯,能正常執(zhí)行Task了。

5 最終解決

之前的方案只是暫時解決,并不是一個好的辦法,還是要搞清楚為何配置沒有生效。于是再次查看源碼。在查看類KubernetesDeployerProperties的時候,發(fā)現(xiàn)了一點端倪:

如何解決DataFlow部署K8s應(yīng)用的問題

這里的字段是沒有Affinity的。

另外,從測試用例入手(這是一個很好的思維,測試用例能告訴你很多信息),看到了DataFlow配置用例,如下:

如何解決DataFlow部署K8s應(yīng)用的問題

所以,應(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']}]}]}}

重新部署后,可以了?。?!

6 總結(jié)

這一次確實是被Spring坑了一把,沒有明確給出配置的示例,然后官方文檔給的提示也是極其誤導(dǎo)。一開始很難想到是不用前綴Affinity的,因為Kubernetes的標(biāo)準(zhǔn)配置是有的,而Spring的官方文檔提示也是有的。實在太坑了!

還好,通過查看源碼及調(diào)試,終于解決了這個問題。

關(guān)于如何解決DataFlow部署K8s應(yīng)用的問題就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI