k8s 辨析 port、NodePort、targetPort、containerPort 區別

南風sa發表於2020-08-22

剛接觸 k8s 涉及到埠到內容較多,容易混淆,這裡整理如下:

nodePort

nodePort 提供了叢集外部客戶端訪問 Service 的一種方式,nodePort 提供了叢集外部客戶端訪問 Service 的埠,通過 nodeIP:nodePort 提供了外部流量訪問k8s叢集中service的入口。

比如外部使用者要訪問k8s叢集中的一個Web應用,那麼我們可以配置對應service的type=NodePortnodePort=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的區別和意義

相關文章