2017-10-13 139 views
5

我已經部署了兩個POD-s,hostnetwork設置爲true。當POD-s部署在同一個OpenShfit節點上時,一切正常,因爲它們可以使用節點IP發現彼此。OpenShift和hostnetwork = true

當POD-s部署在不同的OpenShift節點上時,它們不能互相發現,如果我想使用節點IP將一個POD指向另一個POD,我就無法訪問主機。如何解決這個問題?

+0

爲什麼您需要首先將hostnetwork設置爲true?即使在不同的節點上,同一項目中的任何窗格都應該能夠與同一項目中的任何其他窗格進行交談。這是因爲每個吊艙都有自己的IP地址,訪問將被設置爲允許連接。 –

+0

您真的不應該使用節點IP作爲其他Pod的尋址機制。使用pod的名稱作爲主機名,或者更好地使用服務名稱作爲主機名,並相信內部路由將其發送到該服務的其中一個窗格。 IOW,無論如何都不需要使用IP,因爲有一個內部DNS將pod名稱和服務名稱映射到您的IP。 –

+0

@Graham Dumpleton我需要使用hostnetwork進行REDIS集羣設置。 REDIS需要它才能在Docker上工作。那就是他們在官方REDIS集羣文檔中說的。 – dplesa

回答

0

如果您希望兩個容器共享相同的物理機器並利用回送進行快速通信,那麼最好將它們定義爲具有兩個容器的單個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)管理網絡。

+0

不幸的是,正如我在上面的評論中所解釋的,我必須使用主機網絡。這是我在OpenShift上部署的應用程序的限制。 – dplesa

+0

我不知道應用程序是什麼(顯然),但是如果它需要hostnetwork = true,那麼在Kubernetes/OpenShift中部署可能是一個糟糕的選擇。他們支持一個抽象,用兩個容器緊密耦合(網絡和存儲智能)與「每個Pod的N容器」概念,但除此之外,期望網絡被抽象得比應用程序允許的更多。 – heckj