创建 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
相关推荐
档案宝档案管理2 小时前
权限分级管控,全程可追溯,筑牢会计档案安全防线
运维·网络·人工智能
倔强的石头1063 小时前
【Linux指南】基础IO系列(八):实战衔接 —— 给微型 Shell 添加完整重定向功能
linux·运维·服务器
观北海4 小时前
AiScan-N:AI全自动化渗透测试工具的深度技术解析
运维·自动化
Ujimatsu4 小时前
虚拟机安装Ubuntu 26.04.x及其常用软件(2026.4)
linux·运维·ubuntu
Agent产品评测局7 小时前
制造业生产调度自动化落地,完整步骤与避坑指南:2026企业级智能体选型与实战全景
运维·人工智能·ai·chatgpt·自动化
狂奔的sherry7 小时前
一次由 mount 引发的 Linux 文件系统“错觉”
linux·运维·服务器
志栋智能7 小时前
超自动化巡检:让合规与审计变得轻松简单
运维·网络·人工智能·自动化
小黑要努力7 小时前
智能音箱遇到的问题(一)
linux·运维·git
好度7 小时前
自动化教程-封装浏览器驱动
运维·自动化
ch3nyuyu7 小时前
静态库和动态库的制作
linux·运维·开发语言