2017-03-01 193 views
4

我們有一個docker鏡像和一個相應的yaml文件,用於使用kubernetes進行部署。我們建立的應用程序是與akka-http的scala。我們使用了akka集羣。在我們的應用代碼中使用的配置文件中,我們有一個特殊的變量(我們的例子中的種子節點 - akka集羣),它使用pod ip。但是,除非部署完成,否則我們不會獲得pod ip。我們應該如何解決這個問題?如果是的話,環境變量會有幫助嗎?Kubernetes - Akka集羣部署

更具體地說,一旦泊塢窗圖像部署在容器中的容器中,並且容器啓動時,Pod容器已經被分配。那麼,我們可以在容器中的流程開始之前以編程方式或以其他方式在代碼或配置文件中配置pod ips嗎?

以供參考,這是我們的配置文件:

akka { 
    actor { 
    provider = "akka.cluster.ClusterActorRefProvider" 
    }  
    remote { 
    log-remote-lifecycle-events = off 
    netty.tcp { 
     hostname = "127.0.0.1" 
     port = 0 
    } 
    } 
    cluster { 
    seed-nodes = [ 
     "akka.tcp://[email protected]:3000", 
     "akka.tcp://[email protected]:3001", 
    ], 
    metrics { 
     enabled = off 
    } 
    }  
} 
service { 
    validateTokenService { 
    ml.pubkey.path = "<filePath>" 
    } 
    ml_repository { 
    url = <url address> 
    } 
    replication.factor = 3 
    http.service.interface = "0.0.0.0" 
    http.service.port = 8080 
} 

在上面的文件,而不必akka.remote.netty.tcp.hostname爲「127.0.0.1」,我們需要有莢-ip。

seed-nodes = [ 
      "akka.tcp://[email protected]:3000", 
      "akka.tcp://[email protected]:3001", 
     ], 

我們怎麼可以這樣做: 所以,我們可以作爲種子節點使用它? 在此先感謝。

+0

看看這個偉大的博文http://paoloambrosio.net/2016/12/14/akka-location-transparency.html及其相關的GitHub演示項目https://github.com/paoloambrosio/experiments/樹/阿卡位置透明度。解決方案是在Docker鏡像啓動過程中運行發現並導出種子主機名。 –

回答

3

我嘗試了一些非常相似的東西。你可以做的是使用有狀態集Kubernetes-Stateful sets。有狀態集有一個命名約定,並且相應的命名將被命名 - 你可以在鏈接中閱讀更多關於它的信息。這樣,您可以對seed節點的值進行硬編碼,因爲您知道pod將如何命名。但是,它們有一個缺點,有狀態集尚不支持滾動更新(主要是因爲它們是按照這種方式設計的)。本文有一個很好的解釋:stateful set - akka clustering 本文解釋所有內容 - 因此發佈鏈接而不是複製這裏的步驟。希望這可以幫助

+0

看起來像鏈接是我一直在尋找。將嘗試鏈接中的方法。 –

+1

考慮到這是2017年,akka集羣以這樣一種奇怪的方式實施..你基本上必須破解你的周圍,使它在kubernetes上工作,即使你這樣做,你也不會得到那麼酷的滾動更新特徵。這看起來只對我有問題嗎? – gerasalus

+0

@gerasalus - 是的,它看起來很奇怪,但我認爲這是因爲有狀態集的設計方式。似乎有一些討論正在進行:https://github.com/kubernetes/kubernetes/issues/37566 – Tarun