K8S(十一)—— Kubernetes Ingress详解与实战:从原理到安全机制部署
文章目录
- 前言
- 一、Kubernetes Ingress基础认知
- 1.1 Service简介
- 1.2 Ingress的组成
- 1.2.1 Ingress(规则定义)
- 1.2.2 Ingress Controller(转发器)
- 1.3 Ingress工作原理
- 二、Ingress Controller部署实战(ingress-nginx为例)
- 2.1 部署准备与清单获取
- 2.2 修改ClusterRole资源配置
- 三、Ingress暴露服务的三种方式
- 3.1 方式一:Deployment + Service(type=LoadBalancer)
- 3.1.1 适用场景
- 3.1.2 原理说明
- 3.2 方式二:DaemonSet + HostNetwork + nodeSelector(生产推荐)
- 3.2.1 适用场景
- 3.2.2 原理说明
- 3.2.3 实施步骤
- 步骤1:为节点打标签(指定运行Controller的节点)
- 步骤2:修改mandatory.yaml配置
- 步骤3:加载镜像(Node02节点)
- 步骤4:启动Controller并验证
- 步骤5:创建测试服务(Deployment+Service)
- 步骤6:创建Ingress规则(两种API版本)
- 步骤7:测试访问
- 3.3 方式三:Deployment + Service(type=NodePort)
- 3.3.1 适用场景
- 3.3.2 原理说明
- 3.3.3 实施步骤
- 步骤1:获取配置清单并加载镜像
- 步骤2:部署Controller与NodePort Service
- 步骤3:HTTP代理访问示例
- 四、Ingress高级配置示例
- 4.1 虚拟主机配置(多域名转发)
- 4.2 HTTPS代理配置(TLS加密)
- 步骤1:生成自签证书
- 步骤2:创建TLS Secret
- 步骤3:创建Ingress规则(HTTPS)
- 4.3 基础认证(BasicAuth)
- 步骤1:生成认证文件(文件名需为 auth)
- 步骤2:创建认证Secret
- 步骤3:创建带认证的Ingress规则
- 4.4 路径重写(Rewrite)
- 五、Ingress常见问题与排错
- 5.1 基础状态检查:**查看 Controller 运行与端口**
- 5.2 配置验证:**进入 Pod 检查 Nginx 配置**
- 5.3 常见错误解决
- 总结
前言
在Kubernetes集群中,如何高效、安全地将内部服务暴露给外部访问是核心需求之一。Service虽然解决了集群内部的服务发现与负载均衡问题,但在外部访问场景下,NodePort存在端口管理混乱、LoadBalancer依赖云厂商且成本较高等局限。
而Ingress作为Kubernetes的七层反向代理机制,通过统一的入口和灵活的规则配置,完美解决了多服务外部暴露的难题。本文将从Ingress的基本概念出发,深入解析其组成、工作原理,并通过实战案例演示不同部署方式,帮助读者快速掌握Ingress的应用与安全配置。
一、Kubernetes Ingress基础认知
1.1 Service简介
在Kubernetes生态中,Service的核心作用体现在两方面:对内,通过跟踪Pod变化动态更新Endpoint,实现Pod的服务发现;对外,扮演负载均衡器角色,支持集群内外对Pod的访问。但在外部访问场景中,Pod IP
和Service的ClusterIP
仅能在集群内部可见,为满足外部应用访问需求,Kubernetes提供了多种方案:
- NodePort:通过kube-proxy将Service暴露在节点网络,端口范围固定为
30000-32767
。适合测试场景,但服务数量增多时会面临端口管理困难问题。 - LoadBalancer:依赖云厂商支持,Kubernetes通过CloudProvider在公有云创建负载均衡器,后端指向Pod IP。通常需额外费用,更适合公有云环境。
- externalIPs:为Service分配外部IP,当该IP路由到集群节点时,流量会被转发至Service的Endpoints。
- Ingress(七层反向代理):通过少量公网IP或负载均衡器,即可暴露多个HTTP/HTTPS服务,基于域名或URL路径将请求转发至对应Service,可理解为“Service的Service”。
关键小结:Ingress负责规则定义,而Ingress Controller负责按规则转发,并提供负载均衡、SSL/TLS等增强能力。
1.2 Ingress的组成
Ingress的功能实现依赖两个核心组件:Ingress 和 Ingress Controller,二者协同工作完成外部流量的路由与管理:
1.2.1 Ingress(规则定义)
Ingress是一个通过YAML
配置的API对象
,用于定义请求转发到Service的规则。其核心能力包括:
- 配置外部访问URL
- 实现负载均衡策略
- 管理SSL/TLS证书
- 基于域名的反向代理
需注意,Ingress的具体功能需依赖Ingress Controller实现,仅定义Ingress规则而无Controller时,规则无法生效。
1.2.2 Ingress Controller(转发器)
Ingress Controller是解析Ingress规则并实现反向代理与负载均衡的组件,并非Kubernetes自带,而是一类实现的统称:
- 官方维护:GCE、ingress-nginx
- 第三方实现:如Traefik、HAProxy等(可参考Kubernetes官网)
其典型形态是在一个Pod中同时运行守护进程(监控集群Ingress规则变化并生成配置)和反向代理程序(如Nginx)。以ingress-nginx为例,它会动态生成Nginx配置、更新upstream,并在必要时重载配置。
参考网站:
- GitHub:https://github.com/kubernetes/ingress-nginx
- 官方网站:https://kubernetes.github.io/ingress-nginx/
核心结论:Ingress Controller是真正的流量入口,而Ingress对象仅用于告诉Controller如何转发(域名/路径与Service的映射关系)。
1.3 Ingress工作原理
Ingress的工作流程可概括为以下四步,实现规则的动态更新与流量转发:
- Ingress Controller持续与
APIServer
交互,实时感知Ingress规则的变化; - 当规则更新时,Controller根据自定义模板生成对应的
Nginx配置
; - 将生成的配置写入ingress-nginx-controller Pod内Nginx服务的
/etc/nginx.conf
文件; - 执行配置重载(
reload
)使新配置生效,从而实现基于域名的流量分流与动态更新。
二、Ingress Controller部署实战(ingress-nginx为例)
2.1 部署准备与清单获取
以ingress-nginx为例,部署前需先获取相关配置清单。执行以下命令创建目录并下载清单文件:
mkdir -p /opt/ingress && cd /opt/ingress
# 官方地址(需科学上网)
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml
# 国内镜像地址(推荐)
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
说明:
mandatory.yaml
包含部署ingress-controller所需的所有资源,如namespace、ConfigMap、Role、ServiceAccount等。
2.2 修改ClusterRole资源配置
从0.25版本开始,Ingress资源权限需加入networking.k8s.io
API组(适配Kubernetes新版本API)。编辑mandatory.yaml
文件,修改ClusterRole配置:
vim mandatory.yaml
......
apiVersion: rbac.authorization.k8s.io/v1beta1
# 注意:RBAC资源从1.17版本开始推荐使用rbac.authorization.k8s.io/v1,v1beta1在1.22版本后弃用
kind: ClusterRole
metadata:name: nginx-ingress-clusterrolelabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secretsverbs:- list- watch- apiGroups:- ""resources:- nodesverbs:- get- apiGroups:- ""resources:- servicesverbs:- get- list- watch- apiGroups:- "extensions"- "networking.k8s.io" # (0.25版本新增)添加networking.k8s.io组的Ingress资源权限resources:- ingressesverbs:- get- list- watch- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- "extensions"- "networking.k8s.io" # (0.25版本新增)添加networking.k8s.io组的Ingress状态更新权限resources:- ingresses/statusverbs:- update
三、Ingress暴露服务的三种方式
根据集群环境(公有云/私有云)和业务需求(性能/便捷性),Ingress提供三种主流暴露方式,以下分别详解:
3.1 方式一:Deployment + Service(type=LoadBalancer)
3.1.1 适用场景
适合公有云:LB 自动创建并绑定公网;将域名解析指向该地址即可对外暴露。
3.1.2 原理说明
通过Deployment部署ingress-controller,同时创建type=LoadBalancer的Service关联该Deployment。大部分公有云会为该Service自动创建负载均衡器并绑定公网IP,只需将域名解析指向该IP即可对外暴露服务。
3.2 方式二:DaemonSet + HostNetwork + nodeSelector(生产推荐)
3.2.1 适用场景
-
适合私有云或需要高性能的生产环境,通过直接占用宿主机端口减少网络转发开销。
-
在特定节点以 DaemonSet 方式部署 Controller,并使用 HostNetwork 与宿主机网络打通;
-
直接占用宿主机 80/443;
-
链路最短、性能最好;一个 node 仅能运行一个 Controller Pod;适合大并发生产。
3.2.2 原理说明
- 用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,确保每个节点仅运行一个实例;
- 启用HostNetwork与宿主机网络打通,直接使用宿主机的80/443端口;
- 链路最短、性能最优,适合大并发场景。
3.2.3 实施步骤
步骤1:为节点打标签(指定运行Controller的节点)
# 假设在node02节点部署,打标签ingress=true
kubectl label node node02 ingress=true
# 验证标签
kubectl get nodes --show-labels
步骤2:修改mandatory.yaml配置
将Deployment改为DaemonSet,启用HostNetwork并指定节点选择器:
vim mandatory.yaml
...
apiVersion: apps/v1
# 修改资源类型:从Deployment改为DaemonSet
# kind: Deployment
kind: DaemonSet
metadata:name: nginx-ingress-controllernamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:
# 删除replicas(DaemonSet无需指定副本数,由节点数量决定)
# replicas: 1selector:matchLabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxtemplate:metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxannotations:prometheus.io/port: "10254"prometheus.io/scrape: "true"spec:# 启用主机网络hostNetwork: true# 仅在打了ingress=true标签的节点运行nodeSelector:ingress: "true"serviceAccountName: nginx-ingress-serviceaccount
......
步骤3:加载镜像(Node02节点)
cd /opt/ingress
# 假设镜像包为ingree.contro.tar.gz
tar zxvf ingree.contro.tar.gz
docker load -i ingree.contro.tar
步骤4:启动Controller并验证
# 部署Controller
kubectl apply -f mandatory.yaml# 查看Pod运行状态(确保在node02上)
kubectl get pod -n ingress-nginx -o wide
# 示例输出
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-ingress-controller-nz7vr 1/1 Running 0 19s 192.168.10.16 node02 <none> <none>
# 查看ConfigMap和DaemonSet状态
kubectl get cm,daemonset -n ingress-nginx -o wide
# 示例输出
NAME DATA AGE
configmap/ingress-controller-leader-nginx 0 6m29s
configmap/kube-root-ca.crt 1 6m33s
configmap/nginx-configuration 0 6m33s
configmap/tcp-services 0 6m33s
configmap/udp-services 0 6m33sNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
daemonset.apps/nginx-ingress-controller 1 1 1 1 1 ingress=true 6m33s nginx-ingress-controller quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0 app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx# 在node02上验证端口监听(期望80/443/8181/10254)
netstat -lntp | grep nginx
# 示例输出:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 61596/nginx: master
tcp 0 0 0.0.0.0:8181 0.0.0.0:* LISTEN 61596/nginx: master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 61596/nginx: master
tcp6 0 0 :::10254 :::* LISTEN 61575/nginx-ingress
说明:8181为默认backend端口(未匹配到规则的流量将进入此处)。如需高可用,可在多节点部署,并前置LVS+keepalived实现负载均衡。
步骤5:创建测试服务(Deployment+Service)
vim service-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc
spec:type: ClusterIPports:- protocol: TCPport: 80targetPort: 80selector:app: nginx
步骤6:创建Ingress规则(两种API版本)
- 方法一:extensions/v1beta1(1.22版本后弃用,不推荐)
vim ingress-app.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.simon.comhttp:paths:- path: /backend:serviceName: nginx-app-svcservicePort: 80
- 方法二:networking.k8s.io/v1(推荐,适配新版本)
vim ingress-app.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.simon.comhttp:paths:- path: /pathType: Prefix # 也可使用 Exactbackend:service:name: nginx-app-svcport:number: 80
路径匹配说明:
- Prefix:基于前缀匹配,例如
/ky37
可匹配/ky37
、/ky37/xyk
、/ky37/xyk/xz
;- Exact:精确匹配,例如
/ky39
仅匹配/ky39
。
步骤7:测试访问
# 部署服务和Ingress规则
kubectl apply -f service-nginx.yaml
kubectl apply -f ingress-app.yaml# 查看Ingress规则
kubectl get ingress
# 示例输出
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-app-ingress <none> www.simon.com 80 8s# 配置本地hosts(将域名解析指向node02的IP)
# 例如:192.168.10.16 www.simon.com# 测试访问
curl www.simon.com
验证技巧:进入Controller Pod查看生成的Nginx配置,确认
server www.simon.com
段落是否正确:kubectl exec -it <controller-pod-name> -n ingress-nginx -- /bin/bash more /etc/nginx/nginx.conf
3.3 方式三:Deployment + Service(type=NodePort)
3.3.1 适用场景
开发或测试环境
,需通过NodePort暴露Ingress Controller,适合无负载均衡器的场景。
3.3.2 原理说明
- 以Deployment部署Controller,通过type=NodePort的Service暴露端口;
- 由于NodePort端口随机(30000-32767),生产环境通常需前置负载均衡器;
- 网络链路多一层NAT,大流量场景可能影响性能。
3.3.3 实施步骤
步骤1:获取配置清单并加载镜像
mkdir -p /opt/ingress-nodeport && cd /opt/ingress-nodeport# 下载清单文件(mandatory.yaml为Controller配置,service-nodeport.yaml为NodePort服务)
# 官方地址
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
# 国内镜像地址
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml# 在所有 node 节点上传镜像包 ingress-controller-0.30.0.tar 到 /opt/ingress-nodeport 目录,并加载镜像
docker load -i ingress-controller-0.30.0.tar
步骤2:部署Controller与NodePort Service
# 部署Controller
kubectl apply -f mandatory.yaml
# 部署NodePort Service
kubectl apply -f service-nodeport.yaml# 查看部署状态
kubectl get pod,svc -n ingress-nginx
常见问题:若Pod调度失败,提示
didn't match node selector
,解决方案:
- 按YAML中的nodeSelector给节点加标签:
kubectl label nodes <node_name> kubernetes.io/os=linux
;- 或直接删除YAML中的nodeSelector配置。
步骤3:HTTP代理访问示例
创建包含Deployment、Service和Ingress的配置文件:
vim ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:name: nginxtemplate:metadata:labels:name: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-test
spec:rules:- host: www.simon.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80
部署并测试:
# 部署资源
kubectl apply -f ingress-nginx.yaml# 查看NodePort端口(假设80对应32719)
kubectl get svc -n ingress-nginx# 配置hosts:192.168.10.16 www.simon.com
# 测试访问
curl http://www.simon.com:32719
扩展测试:可在两个Pod中修改
/usr/share/nginx/html/index.html
内容(如分别改为“this is web1”和“this is web2”),验证负载均衡效果。
四、Ingress高级配置示例
4.1 虚拟主机配置(多域名转发)
通过Ingress可实现基于不同域名的流量转发,示例如下:
mkdir /opt/ingress-nodeport/vhost && cd /opt/ingress-nodeport/vhost
- 部署第一个服务(v1版本):
vim deployment1.yaml
# deployment1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment1
spec:replicas: 2selector:matchLabels:name: nginx1template:metadata:labels:name: nginx1spec:containers:- name: nginx1image: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-1
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx1
- 部署第二个服务(v2版本):
vim deployment2.yaml
# deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment2
spec:replicas: 2selector:matchLabels:name: nginx2template:metadata:labels:name: nginx2spec:containers:- name: nginx2image: soscscs/myapp:v2imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-2
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx2
- 创建Ingress规则(多域名映射):
vim ingress-nginx.yaml
# ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress1
spec:rules:- host: www1.simon.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-1port:number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress2
spec:rules:- host: www2.simon.comhttp:paths:- path: /pathType: Prefixbackend:service:name: svc-2port:number: 80
测试:
# 部署资源
kubectl apply -f deployment1.yaml
kubectl apply -f deployment2.yaml
kubectl apply -f ingress-nginx.yaml
# 获取NodePort
kubectl get svc -n ingress-nginx
#示例输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.96.111.20 <none> 80:32719/TCP,443:30698/TCP 19m# 假设NodePort为32719,配置hosts:192.168.10.16 www1.simon.com www2.simon.com
curl www1.simon.com:32719 # 应返回v1版本内容
curl www2.simon.com:32719 # 应返回v2版本内容
4.2 HTTPS代理配置(TLS加密)
通过Ingress配置SSL/TLS加密,确保流量传输安全:
mkdir -p /opt/ingress-nodeport/https && cd /opt/ingress-nodeport/https
步骤1:生成自签证书
openssl req -x509 -sha256 -nodes -days 365 \-newkey rsa:2048 -keyout tls.key -out tls.crt \-subj "/CN=nginxsvc/O=nginxsvc"
步骤2:创建TLS Secret
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
# 验证Secret
kubectl get secret tls-secret
步骤3:创建Ingress规则(HTTPS)
vim ingress-https.yaml
# ingress-https.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:name: nginxtemplate:metadata:labels:name: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-https
spec:tls:- hosts:- www3.simon.com # 需与证书CN匹配secretName: tls-secret # 引用创建的TLS Secretrules:- host: www3.simon.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport:number: 80
部署并测试:
kubectl apply -f ingress-https.yaml# 查看HTTPS对应的NodePort(假设443对应30698)
kubectl get svc -n ingress-nginx
# 示例输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.96.111.20 <none> 80:32719/TCP,443:30698/TCP 27m# 配置hosts:192.168.10.16 www3.simon.com
# 浏览器访问:https://www3.simon.com:30698(忽略证书警告)
# 或者执行
curl -k https://www3.simon.com:30698
4.3 基础认证(BasicAuth)
为Ingress添加用户名密码认证,限制未授权访问:
mkdir -p /opt/ingress-nodeport/basic-auth && cd /opt/ingress-nodeport/basic-auth
步骤1:生成认证文件(文件名需为 auth)
# 安装httpd工具(提供htpasswd)
yum -y install httpd# 创建认证文件(用户名为simon,会提示输入密码)
htpasswd -c auth simon
步骤2:创建认证Secret
kubectl create secret generic basic-auth --from-file=auth
步骤3:创建带认证的Ingress规则
vim ingress-auth.yaml
# ingress-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-authannotations:# 认证类型:basicnginx.ingress.kubernetes.io/auth-type: basic# 引用认证Secretnginx.ingress.kubernetes.io/auth-secret: basic-auth# 认证提示信息nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - simon'
spec:rules:- host: auth.simon.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svc # 引用已存在的Serviceport:number: 80
参考:https://kubernetes.github.io/ingress-nginx/examples/auth/basic/
部署并测试:
kubectl apply -f ingress-auth.yaml# 配置hosts:192.168.10.16 auth.simon.com
# 访问时需输入用户名simon和密码
curl -u simon:your_password http://auth.simon.com:32719
4.4 路径重写(Rewrite)
通过注解实现URL路径重写,满足复杂路由需求:
常用注解说明:
nginx.ingress.kubernetes.io/rewrite-target: <目标URI>
:重定向目标URL(必填)nginx.ingress.kubernetes.io/ssl-redirect: <bool>
:是否仅允许SSL(有证书时默认true)nginx.ingress.kubernetes.io/force-ssl-redirect: <bool>
:强制跳转HTTPS(即使无TLS)nginx.ingress.kubernetes.io/app-root: <路径>
:应用根路径重定向nginx.ingress.kubernetes.io/use-regex: <bool>
:路径是否启用正则
示例配置:
vim ingress-rewrite.yaml
# ingress-rewrite.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-rewriteannotations:# 将访问re.simon.com的流量重定向到www1.simon.com:32383nginx.ingress.kubernetes.io/rewrite-target: http://www1.simon.com:32719
spec:rules:- host: re.simon.comhttp:paths:- path: /pathType: Prefixbackend:# 此处Service仅为占位,实际跳转由rewrite-target决定service:name: nginx-svcport:number: 80
测试:
kubectl apply -f ingress-rewrite.yaml# 配置hosts:192.168.10.16 re.simon.com
# 访问re.simon.com会自动跳转到www1.simon.com
curl -I http://re.simon.com:32719 # 看到重定向的Location
curl -L http://re.simon.com:32719 # 看到重定向的页面
五、Ingress常见问题与排错
5.1 基础状态检查:查看 Controller 运行与端口
# 查看Controller Pod运行状态
kubectl get pod -n ingress-nginx -o wide# 查看ConfigMap和DaemonSet/Deployment状态
kubectl get cm,daemonset,deployment -n ingress-nginx -o wide# 检查宿主机端口监听(确认80/443等端口正常)
netstat -lntp | grep nginx
5.2 配置验证:进入 Pod 检查 Nginx 配置
# 进入Controller Pod查看Nginx配置
kubectl exec -it <controller-pod-name> -n ingress-nginx -- /bin/bash
more /etc/nginx/nginx.conf
# 重点查找:start server <host> ... end server <host> 段落,确认规则是否生效
5.3 常见错误解决
-
Pod调度失败:提示
didn't match node selector
解决:为节点添加对应标签(如kubectl label nodes <node> ingress=true
),或删除YAML中的nodeSelector
。 -
Ingress规则不生效
解决:检查Ingress Controller是否正常运行,确认Ingress规则中的host
、pathType
、Service名称和端口是否正确,查看Controller日志(kubectl logs <pod> -n ingress-nginx
)。
总结
Ingress作为Kubernetes集群的七层入口网关,通过Ingress资源对象与Ingress Controller的协同,实现了多服务的统一暴露、域名路由、SSL加密、访问控制等核心能力。本文从基础概念出发,详细解析了Ingress的组成与工作原理,并通过实战案例演示了三种主流暴露方式(LoadBalancer、DaemonSet+HostNetwork、NodePort)及高级配置(虚拟主机、HTTPS、认证、重写)。
在生产环境中,建议根据实际场景选择部署方案:公有云优先考虑LoadBalancer方式(便捷托管),私有云或高性能需求场景推荐DaemonSet+HostNetwork(低延迟)。同时,需配合多节点部署、前置负载均衡(如LVS/keepalived)、监控告警(通过10254端口采集指标)及安全加固(TLS、认证、WAF),确保Ingress服务的高可用与安全性。
通过掌握Ingress的配置与运维,可有效简化Kubernetes集群的外部访问管理,为微服务架构提供灵活、安全的流量入口解决方案。