-
nodePort
外部流量訪問k8s集羣中service入口的一種方式(另一種方式是LoadBalancer),即nodeIP:nodePort是提供給外部流量訪問k8s集羣中
service的入口。
比如外部用戶要訪問k8s集羣中的一個Web應用,那麼我們可以配置對應service的type=NodePort,nodePort=30001。其他用戶就可以通
過瀏覽器http://node:30001訪問到該web服務。
而數據庫等服務可能不需要被外界訪問,只需被內部服務訪問即可,那麼我們就不必設置service的NodePort。 -
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 -
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
- port: 30080 // 服務訪問端口
-
總結:
總的來說,port和nodePort都是service的端口,前者暴露給k8s集羣內部服務訪問,後者暴露給k8s集羣外部流量訪問。從上兩個端口過來的數據都需要經過反向代理kube-proxy,流入後端pod的targetPort上,最後到達pod內的容器。