Kubernetes ClusterIP 端口深度解析:虚拟服务与流量转发机制

事情的起因是创建了一个 NodePort 类型 Service,其端口映射关系为 8000:30948/TCP。既然30948是在每个node开的端口,那8000是开在哪的呢?出于好奇回顾了一下K8s的Cluster IP和Service


端口映射关系解析

在 Kubernetes 的 NodePort Service 中,端口配置遵循以下格式:

<ClusterIP 端口>:<NodePort 端口>/<协议>
  • 8000:Service 的 ClusterIP 端口(集群内部访问端口)
  • 30948:NodePort 端口(节点外部访问端口)
外部用户
节点IP:30948
集群内部Pod
Service IP:8000
Service
后端Pod

访问测试结果

1. 在宿主机上访问 IP:8000
curl http://<节点IP>:8000

结果:连接失败
原因:

  • 8000 端口仅在集群内部监听(通过 Service 的 ClusterIP)
  • 节点操作系统没有在 8000 端口监听请求
2. 在宿主机上访问 IP:30948
curl http://<节点IP>:30948

结果:成功访问服务
原因:

  • kube-proxy 在所有节点上监听了 30948 端口
  • 流量会被转发到 Service 的后端 Pod

技术原理详解

1. NodePort 工作原理

当创建 NodePort Service 时:

  1. kube-proxy 在所有节点上打开指定端口(30948)

  2. 创建 iptables/IPVS 规则:

    -A KUBE-NODEPORTS -p tcp --dport 30948 -j KUBE-SVC-XXXXXX
    
  3. 流量转发路径:

    外部用户 → 节点IP:30948 → kube-proxy → Service → Pod
    
2. ClusterIP 端口用途
  • 集群内部访问入口:

    # 在集群内部Pod中访问
    curl http://my-dep.default.svc.cluster.local:8000
    
  • 服务发现的基础端口


实际验证步骤

1. 查看 Service 完整定义
kubectl describe svc my-dep

输出关键部分:

Port:             8000/TCP
TargetPort:       80/TCP  # 后端Pod实际端口
NodePort:         30948/TCP
Endpoints:        10.244.1.2:80,10.244.2.3:80 # 后端Pod IP
2. 测试端口访问
# 1. 访问NodePort (应成功)
curl http://<任一节点IP>:30948# 2. 访问ClusterIP端口 (应失败)
curl http://<节点IP>:8000# 3. 在集群内部访问 (在Pod中执行)
kubectl run test --image=busybox -it --rm --restart=Never -- \wget -qO- http://my-dep:8000
3. 检查节点端口监听
# 在K8s节点上执行
sudo netstat -tuln | grep 30948
# 应输出: tcp6  0  0 :::30948  :::*  LISTEN

那么回到最开始的问题,8000端口开在哪呢?

如果你采用的是原生搭建k8s,那么你一定会记得初始化的时候有这样一个命令

kubeadm init \
--apiserver-advertise-address=172.31.0.4 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

在这里就指定了创建svc和pod的网段

集群内部访问端口的本质

ClusterIP 端口是 Kubernetes 服务抽象层的核心设计。

请求 10.96.91.238:8000
Client Pod
Service ClusterIP
iptables/IPVS 规则
Pod 1:80
Pod 2:80
Pod 3:80

ClusterIP 端口的三层抽象

1. 虚拟 IP 层 (Service ClusterIP)

  • 非真实接口:ClusterIP (如 10.96.91.238) 是 kube-proxy 创建的虚拟 IP
  • 无端口监听:节点操作系统上没有进程真正监听 8000 端口
  • 内核级拦截:通过 Linux 内核的 netfilter 框架实现流量拦截

2. 规则转发层 (kube-proxy)

kube-proxy 创建转发规则(以 iptables 为例):

# 查看 Service 规则链
sudo iptables -t nat -L KUBE-SERVICES# 示例输出
KUBE-SVC-XYZ  tcp  --  anywhere  10.96.91.238  tcp dpt:8000

具体规则细节:

# DNAT 规则
-A KUBE-SVC-XYZ -m statistic --mode random --probability 0.333 -j KUBE-SEP-111
-A KUBE-SVC-XYZ -m statistic --mode random --probability 0.5 -j KUBE-SEP-222
-A KUBE-SVC-XYZ -j KUBE-SEP-333# 终结点规则
-A KUBE-SEP-111 -p tcp -m tcp -j DNAT --to-destination 10.244.1.2:80
-A KUBE-SEP-222 -p tcp -m tcp -j DNAT --to-destination 10.244.1.3:80
-A KUBE-SEP-333 -p tcp -m tcp -j DNAT --to-destination 10.244.2.4:80

3. 真实端点层 (Pod)

  • 实际端口监听:在 Pod 内部的容器端口(如配置的 80 端口)

  • Endpoint 对象管理

    apiVersion: v1
    kind: Endpoints
    metadata:name: my-dep
    subsets:
    - addresses:- ip: 10.244.1.2- ip: 10.244.1.3- ip: 10.244.2.4ports:- port: 80protocol: TCP
    

流量转发全路径

当集群内部客户端访问 10.96.91.238:8000 时:

  1. 客户端发起请求

    resp, err := http.Get("http://10.96.91.238:8000")
    
  2. 内核网络栈拦截

    • 目标 IP 匹配 Service CIDR (如 10.96.0.0/16)
    • 进入 KUBE-SERVICES
  3. DNAT 转换

    • 根据 iptables 规则
    • 目标 IP:Port 被替换为 Pod IP:Port (如 10.244.1.2:80)
  4. 路由到目标 Pod

    • 通过 CNI 插件创建的网络路由
    • 流量进入 Pod 网络命名空间
  5. 容器接收请求

    • 容器内进程监听 80 端口
    • 处理请求并返回响应

与 NodePort 的关键区别

特性ClusterIP 端口 (8000)NodePort 端口 (30948)
可见性仅集群内部可见可从集群外部访问
实现层级内核网络栈 (L3/L4)用户空间监听 (L4)
监听位置无真实监听,仅规则kube-proxy 进程真实监听
访问控制受网络策略控制受节点防火墙控制
性能开销低(内核转发)中(用户态转发)
数据包变化目标地址被修改目标地址不变

查看内核规则

在任意节点执行:

# 查看NAT表规则
sudo iptables -t nat -L KUBE-SERVICES -n --line-numbers# 查找Service规则
sudo iptables -t nat -L KUBE-SVC-$(kubectl get svc my-dep -o jsonpath='{.spec.ports[0].name}') -n

为什么需要 ClusterIP

  1. 稳定访问端点
    Pod 可能随时重建,但 Service IP 保持不变

  2. 负载均衡
    自动将流量分发到多个后端 Pod

  3. 服务发现
    通过 DNS 名称解耦服务位置

  4. 流量策略
    支持会话保持、流量权重等高级特性

  5. 安全隔离
    默认仅集群内部可访问,减少攻击面

生产环境实践

  1. 避免直接使用 NodePort 配合 Ingress 或 LoadBalancer 使用:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:name: my-ingress
    spec:rules:- http:paths:- path: /pathType: Prefixbackend:service:name: my-depport:number: 8000  # 使用ClusterIP端口
    
  2. 自定义 NodePort 范围 修改 apiserver 配置:

    apiServer:extraArgs:service-node-port-range: "30000-35000"
    
  3. 防火墙规则 仅开放必要的 NodePort 端口:

    sudo ufw allow 30948/tcp
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++左值与右值及引用的总结

前言 在C中&#xff0c;理解左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是掌握现代C核心特性的关键。左值通常指代具名的、持久存在的对象&#xff0c;可以取地址&#xff1b;而右值则是临时的、即将销毁的值&#xff0c;如字面量或表达式结果。…

学习记录:DAY31

Java课设&#xff1a;数字水印处理与解析器开发 前言 想养成写日记的习惯真不容易。最近比较懒散&#xff0c;复习不想复&#xff0c;项目又做完了&#xff0c;处于一种能干些什么&#xff0c;但是不太想干&#xff0c;但是不干些什么又浑身难受的处境。其实完全就不是匀不出…

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…

系统模块与功能设计框架

系统模块与功能设计框架&#xff0c;严格遵循专业架构设计原则&#xff0c;基于行业标准&#xff08;如微服务架构、DDD领域驱动设计&#xff09;构建。设计采用分层解耦模式&#xff0c;确保可扩展性和可维护性&#xff0c;适用于电商、企业服务、数字平台等中大型系统。 系统…

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …

Prompt工程学习之自我一致性

自我一致性 &#xff08;Self-consistency&#xff09; 概念&#xff1a;该技术通过对同一问题采样不同的推理路径&#xff0c;并通过多数投票选择最一致的答案&#xff0c;来解决大语言模型&#xff08;LLM&#xff09;输出的可变性问题。通过使用不同的温度&#xff08;temp…

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…

数据集-目标检测系列- 口红嘴唇 数据集 lips >> DataBall

贵在坚持&#xff01; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相关项目&#xff1a;GitHub - XIAN-HHappy/ultralytics-yolo-webui: ultralytics-yo…

[论文阅读] 人工智能+项目管理 | 当 PMBOK 遇见 AI:传统项目管理框架的破局之路

当PMBOK遇见AI&#xff1a;传统项目管理框架的“AI适配指南” 论文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …

CentOS7关闭防火墙、Linux开启关闭防火墙

文章目录 一、firewalld开启、关闭防火墙1、查看防火墙状态 一、firewalld开启、关闭防火墙 以下命令在linux系统CentOS7中操作开启关闭防火墙 # 查询防火墙状态 systemctl status firewalld.service # 开启防火墙 systemctl start firewalld.service # 开机自启动防火墙 syste…

Spring是如何实现无代理对象的循环依赖

无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见&#xff1a;mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中&#xff0c;两个或多个对象相互依赖&#xff0c;导致创建过程陷入死循环。以下通过一个简…

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…

基于 Spring Boot 策略模式的短信服务提供商动态切换实现

一、整体设计思路 为了实现在短信服务提供商变更时,不修改现有代码就能无缝切换到新服务实现,可采用策略模式结合依赖注入以及配置中心化管理的方式来设计软件系统。 二、 具体实现步骤 1. 定义统一接口(以短信服务为例,接口命名为 SmsService) 创建一个抽象的接口,用…

解决SQL Server SQL语句性能问题(9)——SQL语句改写(1)

9.4. SQL语句改写 目前主流关系库的高版本中,特别是作为主流商业关系库的SQL Server来讲,大部分场景中,同一语义和结果集的SQL语句,其不同写法并不会影响CBO为SQL语句生成和选择最合适、最高效的查询计划。但少数情况下,不同写法的同一语义和结果集的SQL语句,CBO也许会为…

设计模式复习小结

1.容易忘得设计原则 接口隔离&#xff1a;指接口中的功能太杂则可以拆分一下。防止实现类实现了接口后自动依赖了一些不需要的功能。不同功能拆分成不同的接口。 里氏代换&#xff1a;强调父类能出现的地方&#xff0c;子类一定能正常跑。 迪米特法则&#xff1a;又称最少知…

昇腾CANN集合通信技术解读——细粒度分级流水算法

随着AI技术的演进&#xff0c;模型的计算复杂度和参数量呈现几何级数增长&#xff0c;这使得传统单机单卡部署在算力供给与显存容量方面显得力不从心&#xff0c;从而直接推动了分布式训练/推理技术的快速发展。今年年初爆火的DeepSeek在训练及推理Prefill阶段采用了分级流水Al…

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…