參考:https://blog.csdn.net/yjk13703623757/article/details/79819415
Kubernetes中容易混淆的幾個port
1.nodePort
外部流量訪問k8s集群service入口的一組方式(另一種方式是LoadBalaner),即nodeIP:nodePort是提供給外部流量訪問k8s集群中service的入口。
比如外部用戶要訪問k8s集群中的一個Web應用,那么我們可以配置對應service的type=NodePort
,nodePort=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訪問
集群內部訪問測試