Kubernetes中nodeport,port,targetport對比


  參考:https://blog.csdn.net/yjk13703623757/article/details/79819415

  Kubernetes中容易混淆的幾個port

  1.nodePort

  外部流量訪問k8s集群service入口的一組方式(另一種方式是LoadBalaner),即nodeIP:nodePort是提供給外部流量訪問k8s集群中service的入口。

  比如外部用戶要訪問k8s集群中的一個Web應用,那么我們可以配置對應service的type=NodePortnodePort=30001。其他用戶就可以通過瀏覽器http://node:30001訪問到該web服務。

  而數據庫等服務可能不需要被外界訪問,只需被內部服務訪問即可,那么我們就不必設置service的NodePort。

  2.port

  k8s集群內部服務之間訪問service的入口。即cluseterIP:poer是service保留是clusterIP上的端口

  3.targetPort

  容器的端口(最終流量的端口)。targrtPort是pod上的端口,從port和nodePort上來的流量,經過kube-prosy流入到后端的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

   4.總結

  總的來說,port和nodePort都是service的端口,前者暴露給k8s集群內部服務訪問,后者暴露給k8s集群外部流量訪問。從上兩個端口過來的數據都需要經過反向代理kube-proxy,流入后端pod的targetPort上,最后到達pod內的容器。

  5.舉例說明

#創建示例文件夾
mkdir nginx
cd nginx
#創建nginxdeployment的yaml文件
kubectl create deployment nginx-deployment --image=nginx --dry-run -o yaml>nginx-deployment.yaml 

   修改配置文件

  把副本數修改為2

# cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deployment
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - image: nginx
        name: nginx
        #定義容器暴露端口為80
        #不設置也可以nginx鏡像默認暴露端口就是80
        ports:
        - containerPort: 80

   創建deployment

kubectl apply -f nginx-deployment.yaml 

   查看

 

   為了方便查看分別登錄Pod修改首頁

#修改node01的首頁 
kubectl exec -it nginx-deployment-fc86dcbd-qhdst bash
echo node01>/usr/share/nginx/html/index.html 
#修改node02的首頁
kubectl exec -it nginx-deployment-fc86dcbd-znrtk bash
echo node02>/usr/share/nginx/html/index.html 

   在node節點可以直接使用Pod的IP訪問

[root@localhost ~]# curl 172.17.71.2
node01
[root@localhost ~]# curl 172.17.49.11
node02

   創建Service

#創建service配置文件
kubectl expose deployment nginx-deployment --name=nginx-service --port=81 --target-port=80 --type=NodePort --dry-run -o yaml>nginx-service.yaml
#參數說明
deployment nginx-deployment該service對應的是deployment對應的name是ngin-deployment
 --name=nginx-service 自定義serice名稱,如果不指定service name與對應的deployment同名
--port=81 定義service端口為81,為了區分80定義成81
 --target-port=80 對應的容器端口是80 nginx默認暴露的端口是80,必須對應Pod暴露的端口不能自定義

   修改以后查看

# cat nginx-service.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-deployment
  name: nginx-service
spec:
  ports:
  - port: 81 #service端口
    protocol: TCP
    targetPort: 80 #Pod即容器端口
    nodePort: 30008 #定義NodePort端口如果不定義會隨機生成一個端口
  selector:
    app: nginx-deployment
  type: NodePort #映射模式是NodePort

   應用

kubectl apply -f nginx-service.yaml

   查看創建的Service

 

   集群外部訪問測試nodeIP:nodePort訪問

 

   集群內部訪問測試

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM