创建 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
相关推荐
~|Bernard|37 分钟前
Linux 定时任务(Cron)完整教程
linux·运维·服务器
小周学学学1 小时前
vmware-horizon第一章:horizon服务器安装
运维·服务器·vmware
gsls2008082 小时前
Penpot Docker 部署与 MCP 服务配置文档
运维·docker·容器·原型·penpot
天蓝不会忘记022 小时前
k8s集群部署的方法原理
云原生·容器·kubernetes
九硕智慧建筑一体化厂家2 小时前
直流智能照明|全场景节能升级!打造安全低碳的智慧建筑光环境
运维·笔记·安全·智慧城市
蓝速科技2 小时前
蓝速科技丨数智人终端选型指南:后台运维如何决定长期运营成本
运维·科技
奇树谦2 小时前
HDD 为什么适合顺序大文件读写:从 RAID 5 到 RAID 50 的原理与性能分析
linux·运维·网络
hi_ro_a3 小时前
Linux基础开发工具详解
linux·运维·服务器
嵌入式阿蔡3 小时前
Linux_01:交叉编译与开发环境实战——从单片机跨到 Linux 的第一道坎
linux·运维·网络·单片机·嵌入式硬件·嵌入式实时数据库
红球yyds3 小时前
用anisble搭建k8s集群及原理
云原生·容器·kubernetes