当前位置: 首页 > news >正文

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的工作流程可概括为以下四步,实现规则的动态更新与流量转发:

  1. Ingress Controller持续与APIServer交互,实时感知Ingress规则的变化;
  2. 当规则更新时,Controller根据自定义模板生成对应的Nginx配置
  3. 将生成的配置写入ingress-nginx-controller Pod内Nginx服务的/etc/nginx.conf文件;
  4. 执行配置重载(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,解决方案:

  1. 按YAML中的nodeSelector给节点加标签:kubectl label nodes <node_name> kubernetes.io/os=linux
  2. 或直接删除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规则中的hostpathType、Service名称和端口是否正确,查看Controller日志(kubectl logs <pod> -n ingress-nginx)。

总结

Ingress作为Kubernetes集群的七层入口网关,通过Ingress资源对象与Ingress Controller的协同,实现了多服务的统一暴露、域名路由、SSL加密、访问控制等核心能力。本文从基础概念出发,详细解析了Ingress的组成与工作原理,并通过实战案例演示了三种主流暴露方式(LoadBalancer、DaemonSet+HostNetworkNodePort)及高级配置(虚拟主机、HTTPS、认证、重写)。

在生产环境中,建议根据实际场景选择部署方案:公有云优先考虑LoadBalancer方式(便捷托管)私有云或高性能需求场景推荐DaemonSet+HostNetwork(低延迟)。同时,需配合多节点部署、前置负载均衡(如LVS/keepalived)、监控告警(通过10254端口采集指标)及安全加固(TLS、认证、WAF),确保Ingress服务的高可用与安全性。

通过掌握Ingress的配置与运维,可有效简化Kubernetes集群的外部访问管理,为微服务架构提供灵活、安全的流量入口解决方案。

http://www.dtcms.com/a/492333.html

相关文章:

  • 宁波网站关键词排名提升天津百度推广开户
  • 【数学分析】拓扑学-度量空间
  • 免费的ai绘图网站有哪些南京网站优化方案
  • 广平企业做网站推广找人做的网站怎么
  • 广州 电商网站建设南宁建设局
  • 网站最新一次改版时间什么意思做同城网站
  • 个人网站建设咨询电话景区网站开发
  • 官方网站建设情况重庆网站供奉战犯
  • 合肥企业网站制作公司可视化网页设计在线
  • 【python】第六章:python-GUI编程-PyQt5
  • 在线制作网页网站搭建网站 网页
  • 网站加水印传媒公司总裁
  • 网站开发不提供源代码手工制作代加工接单网
  • 鸿蒙:使用断点和媒体查询实现响应式布局
  • 个人网站备案可以做博客吗网站开发工作室 建设 方案
  • MySQL实战篇08:MySQL主从复制环境修复记录---3个真实问题的排查过程
  • asp.net mvc 5网站开发之美wordpress迁移到本地
  • 建站系统源码黑龙江交通系统网站建设
  • 万网网站制作学软件开发需要多少钱
  • RHCSA复习练习题
  • SEO vs AI 优化(GEO):跨境电商谁能带来更高流量增长?
  • 网站文件下载系统wordpress 优秀网站
  • 石家庄网站建设排名沈阳网页建站模板
  • 做智慧教室的网站家用电脑进行网站建设
  • 双分布函数热 LBM 模拟二维封闭方腔自然对流
  • 网站搭建 里短信asp wordpress
  • 做公司网站需注意什么装修设计装饰
  • 如何做好接口测试
  • 谈谈你对 Activity.runOnUiThread 的理解?
  • Bootstrap 5 响应式网站首页模板