K8s易混點辨析:nodePort、port、targetPort(轉載)

  1. nodePort

    外部流量訪問k8s集羣中service入口的一種方式(另一種方式是LoadBalancer),即nodeIP:nodePort是提供給外部流量訪問k8s集羣中
    service的入口。
    比如外部用戶要訪問k8s集羣中的一個Web應用,那麼我們可以配置對應service的type=NodePort,nodePort=30001。其他用戶就可以通
    過瀏覽器http://node:30001訪問到該web服務。
    而數據庫等服務可能不需要被外界訪問,只需被內部服務訪問即可,那麼我們就不必設置service的NodePort。

  2. port

    k8s集羣內部服務之間訪問service的入口。即clusterIP:port是service暴露在clusterIP上的端口。

    mysql容器暴露了3306端口(參考DockerFile),集羣內其他容器通過33306端口訪問mysql服務,但是外部流量不能訪問mysql服務,因
    爲mysql服務沒有配置NodePort。對應的service.yaml如下:

    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-service
    spec:
    ports:
    - port: 33306
    targetPort: 3306
    selector:
    name: mysql-pod

  3. targetPort

    容器的端口(最終的流量端口)。targetPort是pod上的端口,從port和nodePort上來的流量,經過kube-proxy流入到後端pod的
    targetPort上,最後進入容器。

    與製作容器時暴露的端口一致(使用DockerFile中的EXPOSE),例如官方的nginx(參考DockerFile)暴露80端口。 對應的
    service.yaml如下:

    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-service
    spec:
    type: NodePort // 有配置NodePort,外部流量可訪問k8s中的服務
    ports:

    • port: 30080 // 服務訪問端口
      targetPort: 80 // 容器端口
      nodePort: 30001 // NodePort
      selector:
      name: nginx-pod
  4. 總結:

總的來說,port和nodePort都是service的端口,前者暴露給k8s集羣內部服務訪問,後者暴露給k8s集羣外部流量訪問。從上兩個端口過來的數據都需要經過反向代理kube-proxy,流入後端pod的targetPort上,最後到達pod內的容器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章