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=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如下:
1 2 3 4 5 6 7 8 9 10 11 12 | 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.举例说明
1 2 3 4 5 | #创建示例文件夹 mkdir nginx cd nginx #创建nginxdeployment的yaml文件 kubectl create deployment nginx-deployment --image=nginx --dry-run -o yaml>nginx-deployment.yaml |
修改配置文件
把副本数修改为2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 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
1 | kubectl apply -f nginx-deployment.yaml |
查看
为了方便查看分别登录Pod修改首页
1 2 3 4 5 6 | #修改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访问
1 2 3 4 | [root@localhost ~] # curl 172.17.71.2 node01 [root@localhost ~] # curl 172.17.49.11 node02 |
创建Service
1 2 3 4 5 6 7 | #创建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暴露的端口不能自定义 |
修改以后查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 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 |
应用
1 | kubectl apply -f nginx-service.yaml |
查看创建的Service
集群外部访问测试nodeIP:nodePort访问
集群内部访问测试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2018-03-19 Zabbix监控主动模式