当前位置:首页 > 技术 > 正文内容

Kubernetes 服务暴露技术:NodePort 与 Ingress 实践指南

访客 技术 2026年6月24日 1

DevOpsTech

引言

在 Kubernetes 生态系统中,将内部服务安全且高效地暴露给外部网络是架构设计的重要环节。NodePortIngress 作为两种核心的服务暴露机制,各自具备独特的优势和适用场景。本文将深入探讨这两种技术的工作原理、配置方法及 YAML 实现方案,帮助开发者根据实际需求选择合适的服务暴露策略。

NodePort 服务暴露机制

NodePort 工作原理

NodePort 是 Kubernetes 内置的基础服务暴露模式。该机制在每个集群节点上预留统一端口(默认范围 30000-32767),将外部流量定向至对应服务的 Pod 实例。此方案的显著优势在于实现简单,无需额外组件支持,但同时也存在端口资源有限、直接暴露节点端口等局限性。

NodePort 配置实践

假设我们需将一个内部 Web 服务通过 NodePort 方式对外提供访问能力,以下是具体实现步骤:

  1. 应用部署配置 首先,创建 Deployment 资源以托管应用实例。以下为示例配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: company-frontend
  labels:
    tier: frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: web-container
        image: org/frontend-app:v2.3
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"

此 Deployment 定义了一个名为 company-frontend 的前端应用,使用 org/frontend-app:v2.3 镜像,每个 Pod 在容器内部监听 8080 端口,并设置了资源限制。 2. 服务暴露配置 接下来,创建 Service 资源以暴露上述应用。以下是 NodePort 类型的 Service 配置:

apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 31000
    protocol: TCP
  selector:
    tier: frontend

此配置中:

  • type: NodePort 明确指定服务类型为 NodePort
  • port: 80 定义集群内部访问端口
  • targetPort: 8080 指向后端 Pod 的容器端口
  • nodePort: 31000 设置节点暴露端口(在 30000-32767 范围内)
  • selector 用于关联匹配的 Pod 实例
  1. 服务访问方式 配置生效后,可通过任意节点的 IP 地址与指定端口访问服务。例如,若集群节点 IP 为 10.0.0.50,则可通过 http://10.0.0.50:31000 访问前端应用。

Ingress 高级服务暴露

Ingress 工作原理

Ingress 是 Kubernetes 提供的更高级服务暴露方案,通过统一的入口点(Ingress Controller)集中管理多个服务的访问规则。它支持基于域名、路径等复杂路由策略,并提供负载均衡、SSL 终端等企业级功能。使用 Ingress 需要部署相应的控制器组件,如 Nginx Ingress Controller 或 HAProxy Ingress Controller。

Ingress 配置实践

假设需要暴露多个微服务,并通过域名和路径进行精细化路由控制,以下是实现方案:

  1. 部署 Ingress Controller 以 Nginx Ingress Controller 为例,可通过 Helm 方式部署:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install nginx-ingress ingress-nginx/ingress-nginx

部署完成后,Ingress Controller 将监听集群中的 Ingress 资源并执行相应的路由转发规则。 2. 后端服务配置 假设有两个微服务:user-serviceproduct-service,分别运行在 9000 和 9001 端口。以下是它们的 Service 配置:

apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9000
---
apiVersion: v1
kind: Service
metadata:
  name: product-service
spec:
  selector:
    app: product-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9001

此处将两个服务的 Service 端口统一设置为 80,便于后续通过 Ingress 进行路由区分。 3. Ingress 路由规则配置 创建 Ingress 资源定义访问规则。以下示例配置基于域名和路径的路由规则:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: microservice-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - api.example.com
    secretName: example-tls
  rules:
  - host: user-api.example.com
    http:
      paths:
      - path: /users
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 80
  - host: product-api.example.com
    http:
      paths:
      - path: /products
        pathType: Prefix
        backend:
          service:
            name: product-service
            port:
              number: 80

此配置中:

  • 定义了两个域名路由规则:user-api.example.comproduct-api.example.com
  • 通过路径前缀区分不同服务:/users 路由到 user-service,/products 路由到 product-service
  • 添加了 SSL 重定向注解,强制 HTTPS 访问
  • 配置了 TLS 证书支持
  1. 服务访问方式 配置完成后,可通过域名访问对应服务。例如,若 Ingress Controller 的外部 IP 为 203.0.113.10,且已将域名解析到此 IP,则可通过以下方式访问:
  • 访问 https://user-api.example.com/users 将请求路由到 user-service
  • 访问 https://product-api.example.com/products 将请求路由到 product-service

NodePort 与 Ingress 对比分析

特性维度 NodePort Ingress
配置复杂度 低,仅需 Service 资源 高,需部署 Controller 并配置 Ingress 资源
端口资源 受限(30000-32767) 无限制,通过域名路由
路由能力 基础,仅支持端口转发 高级,支持域名、路径、权重等复杂规则
扩展功能 有限 丰富,支持 SSL、限流、重定向等
适用场景 简单应用开发测试 生产环境多服务、复杂路由需求
标签: Kubernetes

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。