簡體   English   中英

配置 nodeport 但 kubernetes 仍然給出端口范圍

[英]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服務。

-- Kubernetes.io:服務

nodePort端口范圍從3000032767

你在這里看到的:

當我在 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 上的答案在本主題中更深入:

請查看有關在GKE集群上公開應用程序的官方文檔:Cloud.google.com: Kubernetes 引擎:公開應用程序

如果您對此有任何疑問,請告訴我。

暫無
暫無

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

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