簡體   English   中英

2 個容器在 Kubernetes pod 中使用相同的端口

[英]2 containers using the same port in Kubernetes pod

我有以下相同的問題: 一個 Kubernetes 吊艙中的雙 nginx

在我的 Kubernetes Deployment模板中,我有 2 個使用相同端口 80 的容器。我知道Pod中的容器實際上位於同一個網絡命名空間下,這使得可以使用localhost127.0.0.1訪問Pod中的另一個容器。 這意味着容器不能使用相同的端口。

借助docker rundocker-compose很容易實現這一點,第一個容器使用8001:80 ,第二個容器使用8002:80

在 Kubernetes Pod 中是否有類似或更好的解決方案? 無需將這 2 個容器分成不同的 Pod。

我相信您需要做的是為 pod 中的每個容器指定不同的容器端口 Kubernetes 允許您在 pod 定義文件中使用此參數指定每個容器公開的端口。 然后,您可以創建指向相同 pod 但不同端口的服務。

基本上我完全同意@David@Patric 的評論,但我決定在其中添加更多內容,將其擴展為答案。

我有以下相同的問題: 一個 Kubernetes 吊艙中的雙 nginx

並且在提到的線程中已經有一個很好的答案來解決這個問題。 從技術角度來看,它為您的特定用例提供了現成的解決方案,但它並不質疑這個想法本身。

在 docker run 或 docker-compose 的幫助下,第一個容器使用 8001:80,第二個容器使用 8002:80,很容易實現這一點。

Kubernetes中也很容易實現。 只需將兩個容器放在不同的 Pod 中,您就不必使用Pods配置來使其偵聽不同於80的端口。 請注意,您提到的這兩個 docker 容器不共享單個網絡命名空間,這就是為什么它們都可以偵聽映射到主機系統上不同端口( 80018002 )的端口80的原因。 Kubernetes Pods不是這種情況。 閱讀更多關於微服務架構的信息,特別是它是如何在k8s上實現的,你會注意到在一個Pod中放置幾個容器是非常罕見的用例,絕對不應該在像你這樣的情況下應用。 應該有充分的理由將 2 個或更多容器放在一個Pod中。 通常第二個容器與主容器有一些互補的 function。

多容器 Pod 有 3 種設計模式,常用在Kubernetes:sidecar、ambassador 和 adapter。 很多時候,它們都被簡單地稱為邊車容器

請注意,在上述所有用例中,在單個Pod中耦合在一起的 2 個或多個容器具有完全不同的 function 即使您在單個Pod中放置了多個容器(這是最常見的),實際上它也絕不會是同一類型的容器(例如在您的情況下偵聽不同端口的兩個 nginx 服務器)。 它們應該是互補的,並且應該有充分的理由將它們放在一起,為什么它們應該同時啟動和關閉並共享相同的網絡命名空間。 Sidecar 容器中運行着一個監控代理,它對主容器有免費的 function,例如 nginx 網絡服務器。 您可以在本文中閱讀有關容器設計模式的更多信息。

我沒有一個非常確定的用例,因為我對 Kubernetes 和集群的概念還很陌生。

因此,如果您對這種架構沒有特別的理由,那么絕對不要以這種方式使用 go。

我對集群的初步規划是將系統的所有容器放入一個 pod。 這樣我就可以根據需要復制這個 pod。

您不需要單個Pod來復制它。 您的集群中可以有很多replicaSets (通常由Deployments管理),每個副本都負責運行某種Pod的聲明數量的副本。

但根據我現在得到的所有反饋,似乎我走錯了方向。

是的,這絕對是錯誤的方向,但實際上已經說過了。 我只想強調為什么這個方向是錯誤的。 這種方法完全違背了微服務架構的理念,而這正是Kubernetes的設計目的。 將所有基礎設施放在一個巨大的Pod中並將所有容器緊密綁定在一起是沒有意義的。 請記住, PodKubernetes中最小的可部署單元,當其中一個容器崩潰時,整個Pod都會崩潰。 您無法手動重啟Pod中的一個容器。

我將審查我的結構並嘗試使用你們提供的建議。 謝謝大家! =)

這是一個好主意:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM