我在 Kubernetes 中的印象是,您為應用程式公開埠的方式是首先使用 將其公開在 Dockerfile 中EXPOSE,然后containerPort在部署 yaml 檔案中設定設定,最后targetPort在服務 yaml 檔案中設定 。我認為這些都必須是相同的值,例如7214.
但是,我剛剛注意到,我的一個應用程式 Dockerfile 中公開了不正確的埠7124(但在其他兩個檔案中具有正確的埠),如下所示:
檔案
expose 7124 #This is incorrect
部署.yaml
ports:
- containerPort: 7214
服務.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
ports:
- port: 7214
targetPort: 7214
但是,我的其他應用程式運行良好,請求被轉發到埠上的應用程式,7214沒有問題。
為什么這是有效的?我根本不需要在 Dockerfile 中公開埠嗎?是containerPort優先還是什么?該用戶在類似問題上的回答說暴露的埠不必匹配,但沒有解釋原因。
uj5u.com熱心網友回復:
行程正在偵聽的埠只有行程的開發人員知道,因為埠系結發生在代碼中。EXPOSE并且containerPort是將其傳達給外部世界的方式。
EXPOSEDockerfile 中的指令除了充當閱讀 dockerfile 的人的檔案以了解容器中的行程可能正在偵聽的埠以及運行docker ps命令時用于某些 UI 目的之外,不會做任何其他事情。這就像 dockerfile 的作者和另一個可能正在使用您的影像或修改您的 dockerfile 的人之間的交流。
甚至containerPort您的 deployment.yaml 中的部分對任何內容都沒有影響。它還可以作為檔案,讓人們閱讀您的清單以了解您的 pod 中的行程可能正在偵聽哪些埠。另一個用途是您可以使用該name欄位為埠命名,然后您可以在其他地方(如服務物件)通過名稱參考該埠。
唯一重要的是您的行程在容器中偵聽的實際埠,并確保targetPort在服務埠的欄位中使用該埠。
uj5u.com熱心網友回復:
EXPOSEDockerfile 中的選項僅用作檔案,它不會像官方檔案中所說的那樣公開埠:
EXPOSE 指令實際上并不發布埠。它充當構建鏡像的人和運行容器的人之間的一種檔案,關于打算發布哪些埠。
在Kubernetes相當于EXPOSE是spec.containers.ports.containerPort。您可以將這兩個值設定為您想要的任何值,它根本不會改變任何內容。把它想象成一個評論。
對于一個Service物件,它有點不同,值確實很重要。AService取spec.ports.port和spec.ports.targetPort。如果您不指定targetPortKubernetes 將其值設定為與指定的相同port(這是必需的)。
但是,targetPort和 `port不必相同,實際上它們確實有不同的用途:
port指定埠ServicetargetPort指定埠Pod
所以一般流程看起來像這樣:
call to <service-name>:port-> 轉發到帶有標簽的 Pod foo: bar-> Pod 接收呼叫targetPort
下面是一個例子:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 12345
導致:
curl my-service:80-> 轉發到帶有標簽的 Pod app: MyApp-> Pod 在 上接收請求12345。
在您的情況下,您在 port 上與您的 Service 進行通信,7214它將請求轉發到 Pod 也轉發到 port 7214,這就是為什么無論您為EXPOSE或設定什么它都會繼續作業的原因containerPort。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317625.html
標籤:码头工人 Kubernetes
