k8s 辨析 port、NodePort、targetPort、containerPort 區別
- 2020 年 8 月 22 日
- 筆記
- Kubernetes
剛接觸 k8s 涉及到埠到內容較多,容易混淆,這裡整理如下:
nodePort
nodePort 提供了集群外部客戶端訪問 Service 的一種方式,nodePort 提供了集群外部客戶端訪問 Service 的埠,通過 nodeIP:nodePort
提供了外部流量訪問k8s集群中service的入口。
比如外部用戶要訪問k8s集群中的一個Web應用,那麼我們可以配置對應service的type=NodePort
,nodePort=30001
。其他用戶就可以通過瀏覽器//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的區別和意義