剛接觸 k8s 涉及到端口到內容較多,容易混淆,這里整理如下:
nodePort
nodePort 提供了集群外部客戶端訪問 Service 的一種方式,nodePort 提供了集群外部客戶端訪問 Service 的端口,通過 nodeIP:nodePort
提供了外部流量訪問k8s集群中service的入口。
比如外部用戶要訪問k8s集群中的一個Web應用,那么我們可以配置對應service的type=NodePort
,nodePort=30001
。其他用戶就可以通過瀏覽器http://node:30001
訪問到該web服務。
而數據庫等服務可能不需要被外界訪問,只需被內部服務訪問即可,那么我們就不必設置service的NodePort。
port
port是暴露在cluster ip上的端口,:port提供了集群內部客戶端訪問service的入口,即clusterIP:port
。
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 // pod控制器中定義的端口(應用訪問的端口)
nodePort: 30001 // NodePort,外部客戶端訪問的端口
selector:
name: nginx-pod
containerPort
containerPort是在pod控制器中定義的、pod中的容器需要暴露的端口。
例如,mysql 服務需要暴露 3306 端口,redis 暴露 6379 端口
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: kubeguide/redis-master
ports:
- containerPort: 6379 # 此處定義暴露的端口
參考文章
kubernetes中port、target port、node port的對比分析,以及kube-proxy代理
Kubernetes中的nodePort,targetPort,port的區別和意義