Ingress——它是 Kubernetes 集群统一的七层HTTP/HTTPS流量入口专门解决 Service 暴露服务的痛点。本节用最通俗的电商场景带你吃透 Ingress 的核心作用、增删改查CRUD全用法。一、先搞懂Ingress 是干嘛的对比 Service 秒懂你已经会用 Service先回忆它的短板ClusterIP只能集群内部访问外网进不来NodePort给每个服务开一个节点端口30000服务多了端口混乱、难管理LoadBalancer需要云厂商负载均衡成本高多服务要多个实例。Ingress 核心作用Ingress 集群的统一大门只需要一个公网入口就能代理集群内所有 HTTP/HTTPS 服务基于域名、URL路径把流量自动转发到对应的 Service支持 HTTPS 证书、路径重写、负载均衡、访问控制等高级功能无需给每个服务开端口统一管理、干净简洁。通俗比喻Service 小区里的单元门内部服务只能内部访问Ingress 小区的正门唯一外网入口外网用户不用找每个单元门走正门 → 正门根据地址域名/路径→ 引导到对应单元Service。二、前置必备安装 Ingress Controller关键知识点Ingress 只是「流量规则」Ingress Controller 才是真正执行规则的组件比如 Nginx-Ingress没有它Ingress 规则完全不生效我们用最常用的Nginx Ingress Controller一键安装# 官方一键部署适用于标准K8s集群Docker Desktop/Minikube也兼容kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml验证安装成功# 查看命名空间 ingress-nginx 下的Pod状态为Running 即成功kubectl get pods-ningress-nginx安装 ingress-nginx 时这个命名空间ingress-nginx是自动创建的完全不需要手动敲 kubectl create namespace ingress-nginx 这种命令三、准备测试环境电商3个服务我们模拟一个电商项目创建3个基础服务前端Web、订单服务、用户服务以及对应的 ClusterIP ServiceIngress 只需要 ClusterIP无需 NodePort。直接复制以下代码创建 Deployment Service# 文件名shop-services.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:web-deploy# 前端服务spec:replicas:1selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-name:webimage:nginx:alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:web-svcspec:selector:app:webports:-port:80type:ClusterIP# 仅内部访问---# 订单服务apiVersion:apps/v1kind:Deploymentmetadata:name:order-deployspec:replicas:1selector:matchLabels:app:ordertemplate:metadata:labels:app:orderspec:containers:-name:orderimage:nginx:alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:order-svcspec:selector:app:orderports:-port:80type:ClusterIP---# 用户服务apiVersion:apps/v1kind:Deploymentmetadata:name:user-deployspec:replicas:1selector:matchLabels:app:usertemplate:metadata:labels:app:userspec:containers:-name:userimage:nginx:alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:user-svcspec:selector:app:userports:-port:80type:ClusterIP执行创建kubectl apply-fshop-services.yaml验证服务kubectl get svc# 能看到3个ClusterIP服务四、Ingress 增删改查CRUD实战我们用电商场景做两个最常用的 Ingress 规则路径路由同一个域名不同路径 → 不同服务域名路由不同子域名 → 不同服务通用本地测试配置本地测试需要把域名映射到 Ingress 入口IP查看 Ingress 入口IPkubectl get svc-ningress-nginx ingress-nginx-controller命令片段含义类型kubectl get svc查询 Service 资源固定指令-n ingress-nginx指定在哪个命名空间里查命名空间ingress-nginx-controller只查叫这个名字的那一个 ServiceService 名称ingress-nginx-controller 公网入口 Service 安装 Nginx Ingress 时 和 命名空间 ingress-nginx 一样 都是自动创建不用管。记录EXTERNAL-IP本地集群如果是pending用节点IP也可以。修改本地hosts文件WindowsC:\Windows\System32\drivers\etc\hostsMac/Linux/etc/hosts添加一行192.168.x.x shop.com web.shop.com order.shop.com user.shop.com1. 增Create创建 Ingress 规则示例1路径路由最常用需求shop.com→ 前端服务web-svcshop.com/order→ 订单服务order-svcshop.com/user→ 用户服务user-svc创建 Ingress YAML# 文件名ingress-path.yamlapiVersion:networking.k8s.io/v1# K8s 1.19 标准版本必须用这个kind:Ingressmetadata:name:shop-ingress-path# Ingress名称annotations:# 声明使用 Nginx Ingress Controllerkubernetes.io/ingress.class:nginxspec:rules:-host:shop.com# 统一域名http:paths:# 根路径 → 前端服务-path:/pathType:Prefix# 前缀匹配backend:service:name:web-svc# 目标Service名称port:number:80# /order 路径 → 订单服务-path:/orderpathType:Prefixbackend:service:name:order-svcport:number:80# /user 路径 → 用户服务-path:/userpathType:Prefixbackend:service:name:user-svcport:number:80为什么上面 apiVersion 是 networking.k8s.io/v1 而别的资源的创建就是 v1 Ingress 属于网络扩展功能所以必须带分组前缀而能使 apiVersion: v1 都是 K8s 核心基础资源天生就有、最底层Ingress 不是 K8s 天生就有的是后来为了解决「外网统一入口」加的功能。它专门管 HTTP/HTTPS 网络路由所以归到 networking网络分组K8s 1.19 之后Ingress 正式稳定版固定为networking.k8s.io/v1。执行创建命令kubectl apply-fingress-path.yaml示例2域名路由子域名区分服务需求web.shop.com→ 前端order.shop.com→ 订单user.shop.com→ 用户# 文件名ingress-host.yamlapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:shop-ingress-hostannotations:kubernetes.io/ingress.class:nginxspec:rules:-host:web.shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:web-svcport:number:80-host:order.shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:order-svcport:number:80-host:user.shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:user-svcport:number:802. 查Read查看 Ingress 信息① 基础查看列表kubectl get ingress# 简写kubectl get ing输出字段解释NAMEIngress 名称CLASS使用的 ControllernginxHOSTS绑定的域名ADDRESS入口IPPORTS端口80/443② 详细查看规则、事件kubectl describe ing shop-ingress-path可以看到完整路由规则、关联的 Service、运行状态、报错信息排错神器。③ 测试访问# 测试路径路由curlshop.comcurlshop.com/ordercurlshop.com/user# 测试域名路由curlweb.shop.comcurlorder.shop.com3. 改Update修改 Ingress 规则两种修改方式推荐用 YAML 重新 apply可追溯、规范。方式1修改YAML 重新应用编辑ingress-path.yaml比如新增/pay路径重新执行kubectl apply-fingress-path.yamlK8s 会自动增量更新无需删除重建。方式2命令行直接编辑临时修改kubectl edit ing shop-ingress-path会打开编辑器直接修改配置保存后自动生效。4. 删Delete删除 Ingress 规则方式1按YAML文件删除kubectl delete-fingress-path.yaml方式2按名称删除# 删除单个Ingresskubectl delete ing shop-ingress-path# 删除所有Ingresskubectl delete ing--all五、进阶Ingress 配置 HTTPS加密访问生产环境必须用 HTTPSIngress 支持一键配置证书创建证书 Secretkubectl create secret tls shop-tls--certssl.crt--keyssl.keyIngress 开启 HTTPSapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:shop-ingress-sslspec:tls:-hosts:-shop.comsecretName:shop-tls# 绑定证书rules:-host:shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:web-svcport:number:80六、核心命令总结速记操作命令创建Ingresskubectl apply -f xxx.yaml查看所有Ingresskubectl get ing查看Ingress详情kubectl describe ing 名称修改Ingresskubectl apply -f xxx.yaml/kubectl edit ing 名称删除Ingresskubectl delete ing 名称/kubectl delete -f xxx.yaml总结Ingress 核心定位K8s七层统一流量入口解决 Service 多端口暴露的混乱问题核心依赖必须安装Ingress ControllerNginx 最常用核心能力基于域名/路径路由流量到 Service支持 HTTPS、重写等CRUD 极简用 YAML 定义规则apply创建/更新get/describe查看delete删除。Service Ingress这就是 K8s 暴露服务的标准最佳实践
K8s 之 ingress
Ingress——它是 Kubernetes 集群统一的七层HTTP/HTTPS流量入口专门解决 Service 暴露服务的痛点。本节用最通俗的电商场景带你吃透 Ingress 的核心作用、增删改查CRUD全用法。一、先搞懂Ingress 是干嘛的对比 Service 秒懂你已经会用 Service先回忆它的短板ClusterIP只能集群内部访问外网进不来NodePort给每个服务开一个节点端口30000服务多了端口混乱、难管理LoadBalancer需要云厂商负载均衡成本高多服务要多个实例。Ingress 核心作用Ingress 集群的统一大门只需要一个公网入口就能代理集群内所有 HTTP/HTTPS 服务基于域名、URL路径把流量自动转发到对应的 Service支持 HTTPS 证书、路径重写、负载均衡、访问控制等高级功能无需给每个服务开端口统一管理、干净简洁。通俗比喻Service 小区里的单元门内部服务只能内部访问Ingress 小区的正门唯一外网入口外网用户不用找每个单元门走正门 → 正门根据地址域名/路径→ 引导到对应单元Service。二、前置必备安装 Ingress Controller关键知识点Ingress 只是「流量规则」Ingress Controller 才是真正执行规则的组件比如 Nginx-Ingress没有它Ingress 规则完全不生效我们用最常用的Nginx Ingress Controller一键安装# 官方一键部署适用于标准K8s集群Docker Desktop/Minikube也兼容kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml验证安装成功# 查看命名空间 ingress-nginx 下的Pod状态为Running 即成功kubectl get pods-ningress-nginx安装 ingress-nginx 时这个命名空间ingress-nginx是自动创建的完全不需要手动敲 kubectl create namespace ingress-nginx 这种命令三、准备测试环境电商3个服务我们模拟一个电商项目创建3个基础服务前端Web、订单服务、用户服务以及对应的 ClusterIP ServiceIngress 只需要 ClusterIP无需 NodePort。直接复制以下代码创建 Deployment Service# 文件名shop-services.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:web-deploy# 前端服务spec:replicas:1selector:matchLabels:app:webtemplate:metadata:labels:app:webspec:containers:-name:webimage:nginx:alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:web-svcspec:selector:app:webports:-port:80type:ClusterIP# 仅内部访问---# 订单服务apiVersion:apps/v1kind:Deploymentmetadata:name:order-deployspec:replicas:1selector:matchLabels:app:ordertemplate:metadata:labels:app:orderspec:containers:-name:orderimage:nginx:alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:order-svcspec:selector:app:orderports:-port:80type:ClusterIP---# 用户服务apiVersion:apps/v1kind:Deploymentmetadata:name:user-deployspec:replicas:1selector:matchLabels:app:usertemplate:metadata:labels:app:userspec:containers:-name:userimage:nginx:alpineports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:user-svcspec:selector:app:userports:-port:80type:ClusterIP执行创建kubectl apply-fshop-services.yaml验证服务kubectl get svc# 能看到3个ClusterIP服务四、Ingress 增删改查CRUD实战我们用电商场景做两个最常用的 Ingress 规则路径路由同一个域名不同路径 → 不同服务域名路由不同子域名 → 不同服务通用本地测试配置本地测试需要把域名映射到 Ingress 入口IP查看 Ingress 入口IPkubectl get svc-ningress-nginx ingress-nginx-controller命令片段含义类型kubectl get svc查询 Service 资源固定指令-n ingress-nginx指定在哪个命名空间里查命名空间ingress-nginx-controller只查叫这个名字的那一个 ServiceService 名称ingress-nginx-controller 公网入口 Service 安装 Nginx Ingress 时 和 命名空间 ingress-nginx 一样 都是自动创建不用管。记录EXTERNAL-IP本地集群如果是pending用节点IP也可以。修改本地hosts文件WindowsC:\Windows\System32\drivers\etc\hostsMac/Linux/etc/hosts添加一行192.168.x.x shop.com web.shop.com order.shop.com user.shop.com1. 增Create创建 Ingress 规则示例1路径路由最常用需求shop.com→ 前端服务web-svcshop.com/order→ 订单服务order-svcshop.com/user→ 用户服务user-svc创建 Ingress YAML# 文件名ingress-path.yamlapiVersion:networking.k8s.io/v1# K8s 1.19 标准版本必须用这个kind:Ingressmetadata:name:shop-ingress-path# Ingress名称annotations:# 声明使用 Nginx Ingress Controllerkubernetes.io/ingress.class:nginxspec:rules:-host:shop.com# 统一域名http:paths:# 根路径 → 前端服务-path:/pathType:Prefix# 前缀匹配backend:service:name:web-svc# 目标Service名称port:number:80# /order 路径 → 订单服务-path:/orderpathType:Prefixbackend:service:name:order-svcport:number:80# /user 路径 → 用户服务-path:/userpathType:Prefixbackend:service:name:user-svcport:number:80为什么上面 apiVersion 是 networking.k8s.io/v1 而别的资源的创建就是 v1 Ingress 属于网络扩展功能所以必须带分组前缀而能使 apiVersion: v1 都是 K8s 核心基础资源天生就有、最底层Ingress 不是 K8s 天生就有的是后来为了解决「外网统一入口」加的功能。它专门管 HTTP/HTTPS 网络路由所以归到 networking网络分组K8s 1.19 之后Ingress 正式稳定版固定为networking.k8s.io/v1。执行创建命令kubectl apply-fingress-path.yaml示例2域名路由子域名区分服务需求web.shop.com→ 前端order.shop.com→ 订单user.shop.com→ 用户# 文件名ingress-host.yamlapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:shop-ingress-hostannotations:kubernetes.io/ingress.class:nginxspec:rules:-host:web.shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:web-svcport:number:80-host:order.shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:order-svcport:number:80-host:user.shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:user-svcport:number:802. 查Read查看 Ingress 信息① 基础查看列表kubectl get ingress# 简写kubectl get ing输出字段解释NAMEIngress 名称CLASS使用的 ControllernginxHOSTS绑定的域名ADDRESS入口IPPORTS端口80/443② 详细查看规则、事件kubectl describe ing shop-ingress-path可以看到完整路由规则、关联的 Service、运行状态、报错信息排错神器。③ 测试访问# 测试路径路由curlshop.comcurlshop.com/ordercurlshop.com/user# 测试域名路由curlweb.shop.comcurlorder.shop.com3. 改Update修改 Ingress 规则两种修改方式推荐用 YAML 重新 apply可追溯、规范。方式1修改YAML 重新应用编辑ingress-path.yaml比如新增/pay路径重新执行kubectl apply-fingress-path.yamlK8s 会自动增量更新无需删除重建。方式2命令行直接编辑临时修改kubectl edit ing shop-ingress-path会打开编辑器直接修改配置保存后自动生效。4. 删Delete删除 Ingress 规则方式1按YAML文件删除kubectl delete-fingress-path.yaml方式2按名称删除# 删除单个Ingresskubectl delete ing shop-ingress-path# 删除所有Ingresskubectl delete ing--all五、进阶Ingress 配置 HTTPS加密访问生产环境必须用 HTTPSIngress 支持一键配置证书创建证书 Secretkubectl create secret tls shop-tls--certssl.crt--keyssl.keyIngress 开启 HTTPSapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:shop-ingress-sslspec:tls:-hosts:-shop.comsecretName:shop-tls# 绑定证书rules:-host:shop.comhttp:paths:-path:/pathType:Prefixbackend:service:name:web-svcport:number:80六、核心命令总结速记操作命令创建Ingresskubectl apply -f xxx.yaml查看所有Ingresskubectl get ing查看Ingress详情kubectl describe ing 名称修改Ingresskubectl apply -f xxx.yaml/kubectl edit ing 名称删除Ingresskubectl delete ing 名称/kubectl delete -f xxx.yaml总结Ingress 核心定位K8s七层统一流量入口解决 Service 多端口暴露的混乱问题核心依赖必须安装Ingress ControllerNginx 最常用核心能力基于域名/路径路由流量到 Service支持 HTTPS、重写等CRUD 极简用 YAML 定义规则apply创建/更新get/describe查看delete删除。Service Ingress这就是 K8s 暴露服务的标准最佳实践