创建 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
相关推荐
梦想很大很大3 小时前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
Sinclair4 小时前
内网服务器离线安装 Nginx+PHP+MySQL 的方法
运维
叶落阁主4 小时前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
可观测性用观测云1 天前
云原生网关 Ingress-Nginx 链路追踪实战:OpenTelemetry 采集与观测云集成方案
nginx·kubernetes
甲鱼9291 天前
MySQL 实战手记:日志管理与主从复制搭建全指南
运维
蝎子莱莱爱打怪3 天前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
碳基沙盒3 天前
OpenClaw 多 Agent 配置实战指南
运维
蝎子莱莱爱打怪6 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
DianSan_ERP7 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅7 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑