剛接觸 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的區別和意義