[英]configuration nodeport but kubernetes still give port range
我在nodePort模式下聲明了一個服務。 但有一點我不明白。 也許我感到困惑。 nodePort ,轉發到服務的port ,並由 pod 在targetPort上接收。
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: {{ .Release.Name }}
product: {{ .Values.product }}
environment: {{ .Values.environment }}
version: {{ .Values.version }}
component: frontend
spec:
type: NodePort
ports:
- port: 6001
targetPort: 6001
protocol: TCP
selector:
app: countly-frontend
當我在 kubernetes 上列出服務時,我看到了這個:
service/countly-frontend NodePort 10.xx.xx.12 <none> 6001:31145/TCP 110s
通常我應該看到6001:6001而不是6001:31145 ? 正如您可能已經猜到的那樣,該應用程序正在偵聽端口 6001。
不確定這是否可行:
ports:
- protocol: TCP
port: 6001
targetPort: 6001
或者,如果您可以嘗試在原始版本中將nodePort
更改為targetPort
這就是 kubernetes 服務節點端口的工作方式。 NodePort 服務綁定在 30000-32767 范圍內的隨機端口上。 如果要指定綁定端口,請添加nodePort屬性來設置它( docs ),但它必須在所需的范圍內。 例如,我選擇 30007:
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: {{ .Release.Name }}
product: {{ .Values.product }}
environment: {{ .Values.environment }}
version: {{ .Values.version }}
component: frontend
spec:
type: NodePort
ports:
- port: 6001
targetPort: 6001
protocol: TCP
nodePort: 30007
selector:
app: countly-frontend
讓我澄清一些誤解:
您不能更改托管 Kubernetes 集群(如GKE
)的nodePort
端口范圍。
官方 Kubernetes 文檔中關於nodePort
的一句話:
NodePort
:在 static 端口(NodePort
)上公開每個節點的 IP 上的服務。 自動創建NodePort
服務路由到的ClusterIP
服務。 您可以通過請求<NodeIP>:<NodePort>
從集群外部聯系NodePort
服務。
nodePort
端口范圍從30000
到32767
。
你在這里看到的:
當我在 kubernetes 上列出服務時,我看到了這個:
service/countly-frontend NodePort 10.xx.xx.12 ><none> 6001:31145/TCP 110s
具體來說: 6001:31145/TCP
是正確的。
假設有一個 pod,其應用程序在端口50001
上運行。
這是上述應用程序的service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
ports:
- name: hello-port
port: 5678 # CLUSTER-IP PORT
targetPort: 50001 # PORT WHICH YOUR APPLICATION IS RUNNING ON
nodePort: 30051 # NODEPORT PORT
type: NodePort
$ kubectl get services
的 Output :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-service NodePort 10.86.1.195 <none> 5678:30051/TCP 25h
您將可以通過以下方式訪問您的應用程序:
NodeIP:NodePort(30051)
(外部訪問)ClusterIP:port(5678)
(內部訪問)PodIP:targetPort(50001)
(內部訪問) 如果您想在端口6001
上公開您的應用程序以供外部使用,您可以嘗試使用LoadBalancer
服務類型。
StackOverflow 上的答案在本主題中更深入:
NodePort
類型的服務 object 時究竟發生了什么。請查看有關在GKE
集群上公開應用程序的官方文檔:Cloud.google.com: Kubernetes 引擎:公開應用程序
如果您對此有任何疑問,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.