创建 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
相关推荐
OpsEye33 分钟前
系统负载高一定是CPU问题吗?
运维·cpu·it
张忠琳1 小时前
【client-go v0.36.1】(DeltaFIFO Part 1)DeltaFIFO 超深度分析 — 模块定位、类结构、接口层次、构造与初始化
云原生·kubernetes·deltafifo·informer·client-go
AOwhisky2 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算
赵民勇2 小时前
Linux file命令详解
linux·运维
li-xun2 小时前
LINUX DO 社区注册机制调整与公益 AI 服务动态
linux·运维·人工智能
j_xxx404_2 小时前
MySQL表操作硬核解析:从 CREATE TABLE 到磁盘文件、ALTER TABLE 与 DDL 风险
运维·服务器·数据库·c++·mysql·adb·ai
ba_pi2 小时前
k8s删除pod
linux·容器·kubernetes
前端程序猿i2 小时前
Nginx 教程:从入门到能上线
运维·nginx
木雷坞2 小时前
Qdrant Docker 部署教程:数据卷、API Key 和集合初始化
运维·docker·容器·知识图谱
团象科技3 小时前
外贸站选海外服务器 拆解跨境运营中常被忽略的核心性能细节
运维·服务器