创建 NodePort 类型的 Service

一、Kubernetes Service 的核心作用

Service 是 Kubernetes 中实现服务发现与负载均衡的核心资源,它为一组后端 Pod 提供一个稳定的访问入口(ClusterIP/NodePort/LoadBalancer),让前端客户端无需关心后端 Pod 的 IP 变化,就能稳定访问服务。


二、两种主流代理模式对比

表格

代理模式 实现方式 负载均衡策略 性能特点 适用场景
iptables 模式 基于 Linux netfilter,在节点上配置 iptables 规则 默认随机选择后端 Pod 系统开销低,流量在内核空间处理 小规模集群、对性能要求不高的场景
IPVS 模式 基于 netfilter 钩子,使用哈希表作为数据结构,在内核空间工作 支持更多负载均衡算法(如轮询、最小连接等) 延迟更低、规则同步性能更好、吞吐量更高 大规模集群、高并发服务场景

三、实操步骤拆解(基于图片中的示例)

1. 准备后端 Deployment

创建一个包含 3 个 Nginx Pod 的 Deployment,作为服务的后端:

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-servicetest
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

执行创建:

复制代码
kubectl create -f deployment-service.yml
2. 创建 NodePort 类型的 Service

通过 kubectl expose 命令为 Deployment 创建一个 NodePort 服务,将容器端口 80 映射到节点端口 9000:

复制代码
kubectl expose deployment nginx-deployment-servicetest \
  --port=9000 --name=myservice --target-port=80 --type=NodePort
3. 验证服务与端点

查看 Service 和对应的 Endpoints(后端 Pod 列表):

复制代码
kubectl get service,endpoints

输出示例:

复制代码
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          15d
service/myservice    NodePort    10.110.19.123   <none>        9000:32420/TCP   7s

NAME                 ENDPOINTS                                      AGE
endpoints/kubernetes 192.168.30.130:6443                            15d
endpoints/myservice  172.16.245.19:80,172.16.245.20:80,172.16.93.216:80   7s

可以看到,myservice 的 Endpoints 自动关联了 3 个 Nginx Pod 的 IP 和端口。

4. 访问服务

通过节点 IP + NodePort(32420)访问服务:

复制代码
curl http://192.168.30.130:32420

返回 Nginx 默认页面,说明服务访问正常。

5. 清理资源
复制代码
kubectl delete service myservice

四、关键概念补充

  • ClusterIP:仅在集群内部可访问的虚拟 IP,是 Service 的默认类型。
  • NodePort :在每个节点上开放一个端口,外部可通过 节点IP:NodePort 访问服务。
  • Endpoints:由 Service 的 selector 自动生成,包含所有匹配标签的后端 Pod 的 IP 和端口。
  • kube-proxy:运行在每个节点上的代理,负责维护 Service 的代理规则(iptables/IPVS),实现流量转发。

9000:32420/TCP 是 NodePort 类型 Service 的端口映射关系,我们可以把它拆成三部分来理解:


1. 各部分含义

  • 9000 :Service 在集群内部的端口(port
    • 这是 Service 自身暴露的端口,集群内的其他 Pod 或服务可以通过 Service ClusterIP:9000 来访问这个服务。
  • 32420 :节点上的端口(nodePort
    • 这是 Kubernetes 自动分配的节点端口(范围默认是 30000-32767),外部客户端可以通过 任意节点IP:32420 访问到这个服务。
  • /TCP :协议类型
    • 表示这个端口映射使用的是 TCP 协议(也可以是 UDP)。

2. 完整的访问链路

外部请求 → 节点 IP:32420 → Service ClusterIP:9000 → 后端 Pod IP:80(容器端口)

在你的示例中:

  • 节点 IP 是 192.168.30.130
  • 所以访问地址是 http://192.168.30.130:32420
  • 流量会被转发到 Service 的 9000 端口,再转发到后端 Nginx Pod 的 80 端口。

3. 为什么需要两层端口?

  • 集群内访问 :用 ClusterIP:9000,高效且安全,只在集群内部可见。
  • 外部访问 :用 节点IP:32420,让外部流量可以进入集群,再由 Service 转发到后端。

4. 对应命令参数

这个映射关系来自你之前的 kubectl expose 命令:

复制代码
kubectl expose deployment nginx-deployment-servicetest \
  --port=9000 --target-port=80 --type=NodePort
  • --port=9000 定义了 Service 内部端口 9000
  • --target-port=80 定义了转发到 Pod 的 80 端口
  • --type=NodePort 触发了自动分配节点端口 32420
相关推荐
2601_949146538 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天8 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS9 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师9 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp9 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
Elastic 中国社区官方博客10 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
小锋学长生活大爆炸10 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器
进击切图仔10 小时前
常用 Docker 命令备份
运维·docker·容器
NotStrandedYet11 小时前
《国产系统运维笔记》第8期:挑战国产化流媒体部署——银河麒麟+龙芯架构编译SRS实战全记录
运维·kylin·国产化·银河麒麟·龙芯·信创运维·srs编译安装
默|笙11 小时前
【Linux】fd_重定向本质
linux·运维·服务器