我已經部署了兩個POD-s,hostnetwork設置爲true。當POD-s部署在同一個OpenShfit節點上時,一切正常,因爲它們可以使用節點IP發現彼此。OpenShift和hostnetwork = true
當POD-s部署在不同的OpenShift節點上時,它們不能互相發現,如果我想使用節點IP將一個POD指向另一個POD,我就無法訪問主機。如何解決這個問題?
我已經部署了兩個POD-s,hostnetwork設置爲true。當POD-s部署在同一個OpenShfit節點上時,一切正常,因爲它們可以使用節點IP發現彼此。OpenShift和hostnetwork = true
當POD-s部署在不同的OpenShift節點上時,它們不能互相發現,如果我想使用節點IP將一個POD指向另一個POD,我就無法訪問主機。如何解決這個問題?
如果您希望兩個容器共享相同的物理機器並利用回送進行快速通信,那麼最好將它們定義爲具有兩個容器的單個Pod。
如果兩個容器是爲了漂浮在一個更大的集羣上並且更鬆散地耦合,那麼我建議利用Kubernetes中的Service構造(在OpenShift下)並將其用於適當的發現。
服務在https://kubernetes.io/docs/concepts/services-networking/service/記錄,而且隨着內部DNS服務(如果實現的話 - 常見於Kubernetes 1.4及更高版本),他們提供給我們Kubernetes管理那裏的東西是一種手段,更新中的<servicename>.<namespace>.svc.cluster.local
形式的內部DNS條目。例如,如果您在默認名稱空間中設置了名爲「backend」的服務的Pod,另一個Pod可以將其引用爲backend.default.svc.cluster.local
。 Kubernetes關於DNS部分的文檔可以在https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
這也避免了「hostnetwork = true」的複雜性,並讓OpenShift(或特定的Kubernetes)管理網絡。
如果您必須絕對使用hostnetwork,則應該創建路由器,然後使用這些路由器在pod之間進行通信。您可以在opeshift中創建ha基於代理的路由器,請參考此處 - https://docs.openshift.com/enterprise/3.0/install_config/install/deploy_router.html
爲什麼您需要首先將hostnetwork設置爲true?即使在不同的節點上,同一項目中的任何窗格都應該能夠與同一項目中的任何其他窗格進行交談。這是因爲每個吊艙都有自己的IP地址,訪問將被設置爲允許連接。 –
您真的不應該使用節點IP作爲其他Pod的尋址機制。使用pod的名稱作爲主機名,或者更好地使用服務名稱作爲主機名,並相信內部路由將其發送到該服務的其中一個窗格。 IOW,無論如何都不需要使用IP,因爲有一個內部DNS將pod名稱和服務名稱映射到您的IP。 –
@Graham Dumpleton我需要使用hostnetwork進行REDIS集羣設置。 REDIS需要它才能在Docker上工作。那就是他們在官方REDIS集羣文檔中說的。 – dplesa