我對此的解決方案一直以使用IP作爲ID:修剪點並且您將獲得一個唯一的ID,該ID也可在容器外部提供給其他容器。
與服務,你可以訪問到多個容器的IPS(見我的答案在這裏如何做到這一點: what's the best way to let kubenetes pods communicate with each other?
所以你可以,如果你使用的IP作爲唯一的ID獲得它們的ID太 唯一的問題是,ID是不連續的或從0開始,但動物園管理員/卡夫卡似乎並不介意做
編輯1:
的跟進關注配置動物園管理員:
每個ZK節點需要知道其他節點。 Kubernetes發現服務知道在服務內的節點,所以想法是啓動帶有ZK節點的服務。
此服務需要在創建Zookeeper pod的ReplicationController(RC)之前啓動。
的ZK容器的啓動腳本然後將需要:
- 等待發現服務,其節點(即需要幾秒鐘,現在我只需添加填充ZK服務在我的啓動腳本的開頭睡眠10,但更可靠,你應該尋找服務,至少有3個節點在它)
- 查找中發現服務形成服務容器: 這是通過查詢完成API。
KUBERNETES_SERVICE_HOST
環境變量在每個容器中都可用。 找到服務描述端點然後
URL="http(s)://$USERNAME:[email protected]${KUBERNETES_SERVICE_HOST/api/v1/namespaces/${NAMESPACE}/endpoints/${SERVICE_NAME}"
其中NAMESPACE
爲default
,除非你改變它,SERVICE_NAME
將飼養員,如果你命名你的服務飼養員。
有你形成服務容器的描述,他們在「IP」字段中的IP。 你可以這樣做:
curl -s $URL | grep '\"ip\"' | awk '{print $2}' | awk -F\" '{print $2}'
得到的服務IP地址的列表。 就這樣,填充使用上述
定義的ID的節點上的zoo.cfg您可能需要USERNAME和PASSWORD對像谷歌容器引擎服務到達終點。這些都需要放在一個祕密卷(請參閱文檔在這裏:http://kubernetes.io/v1.0/docs/user-guide/secrets.html)
您還需要使用curl -s --insecure
在谷歌集裝箱引擎,除非你通過添加CA證書到你的豆莢的麻煩
基本上將卷添加到容器,並從文件中查找值。 (相反的是對醫生說,不要把\ n的用戶名或密碼的末尾時base64編碼:它只是讓你的生活更加複雜,讀那些時)
編輯2:
您需要在Kafka節點上執行的另一件事是獲取IP和主機名,並將它們放在/ etc/hosts文件中。 卡夫卡似乎需要知道主機名的節點,這些不是默認的服務節點中設置
編輯3:
後使用IP作爲一個ID多次試驗和思想可能沒那麼大:這取決於你如何配置存儲。 對於任何一種像動物園管理員分佈式服務的,卡夫卡,蒙戈,HDFS,你可能想使用emptyDir類型的存儲,所以它只是在該節點上(安裝遠程存儲樣的失敗分發這些服務的宗旨!) emptyDir將用相同的節點上的數據relaod,因此它似乎更多的邏輯以使用節點ID(節點IP)作爲ID,因爲那時,在同一節點上重新啓動吊艙將具有該數據。 這樣可以避免潛在的數據損壞(如果新節點開始在實際上不是空的相同目錄中寫入,誰知道會發生什麼)以及Kafka,如果代理ID發生更改,則分配給broker.id的主題,zookeeper不會更新主題broker.id並且該主題看起來像可用但是指向錯誤的broker.id並且它是一團糟。
到目前爲止,我還沒有找到如何獲得節點IP,但我認爲可以通過查找服務pod名稱以及它們所在的節點來查找API。
EDIT 4
爲了得到節點的IP,就可以得到主機莢==從端點API /API/V1 /命名空間/默認/端點/ 如上所述名。 那麼你可以從莢名稱的節點IP與 /API/V1 /命名空間/默認/莢/
PS:這是由在Kubernetes回購(這裏的例子爲rethinkdb例子啓發:https://github.com/kubernetes/kubernetes/tree/master/examples/rethinkdb
來源
2015-08-26 18:00:39
MrE
好主意!這似乎是一個可行的解決方案!我現在通過一個啓動腳本來設置所有代理ID:BROKER_ID = $(ip addr | awk'/ inet/&& /eth0/{sub(/\/.*$/,"",$2);打印$ 2}'| sed -r's /\.// g')和:sed -r -i「s /(broker.id)=(。*)/ \ 1 = $ BROKER_ID/g」$ KAFKA_HOME/config/server.properties – NegatioN
我用ip = $(hostname -i)然後id = $ {ip //./} – MrE
我還可以問你如何將服務器添加到/conf/zoo.cfg?與Kubernetes的Kafka服務交互的共享卷? – NegatioN