Ingress-nginx-controller原理
ingress Controller 连接到其中一个 Pod 的流程,客户端首先对nginx.frps.cn执行DNS 解析,得到Ingress Controller 所在节点的 IP,然后客户端向Ingress Controller 发送 HTTP请求,然后根据 Ingress对象里面的描述匹配域名,找到对应的Service对象,并获取关联的Endpoints列表,将客户端的请求转发给其中一个 Pod

其它Ingress-controller
- AKS 应用程序网关入口控制器是一个配置Azure 应用程序网关的入口控制器。
- 阿里云 MSE Ingress是配置阿里云原生网关的入口控制器,也是Higress的商业版本。
- Apache APISIX 入口控制器是一个基于Apache APISIX的入口控制器。
- Avi Kubernetes Operator使用VMware NSX Advanced Load Balancer提供 L4-L7 负载平衡。
- BFE Ingress Controller是一个基于BFE的入口控制器。
- Cilium Ingress Controller是一个由Cilium提供支持的入口控制器。
- Citrix 入口控制器与Citrix 应用程序交付控制器配合使用。
- Contour是一个基于Envoy的入口控制器。
- Emissary-Ingress API Gateway 是一个基于Envoy的入口控制器。
- EnRoute是一个基于Envoy的 API 网关,可以作为入口控制器运行。
- Easegress IngressController是一个基于Easegress的 API 网关,可以作为入口控制器运行。
- 适用于 Kubernetes 的F5 BIG-IP容器入口服务 让您可以使用入口来配置 F5 BIG-IP 虚拟服务器。
- FortiADC Ingress Controller支持 Kubernetes Ingress 资源,并允许您从 Kubernetes 管理FortiADC 对象
- Gloo是一个基于Envoy 的开源入口控制器,提供 API 网关功能。
- HAProxy Ingress是HAProxy的入口控制器 。
- Higress是一个基于Envoy的 API 网关,可以作为入口控制器运行。
- Kubernetes 的 HAProxy Ingress Controller也是 HAProxy 的入口控制器。
- Istio Ingress 是一个基于Istio的入口控制器。
- Kubernetes 的 Kong Ingress Controller是一个驱动Kong Gateway 的 入口控制器。
- Kusk Gateway是一个基于Envoy的 OpenAPI 驱动的入口控制器。
- Kubernetes 的 NGINX Ingress Controller与NGINX Web 服务器(作为代理) 协同工作。
- ngrok Kubernetes Ingress Controller是一个开源控制器,用于使用ngrok 平台为您的 K8s 服务添加安全的公共访问。
- OCI Native Ingress Controller是 Oracle 云基础设施的 Ingress 控制器,可让您管理OCI 负载均衡器。
- OpenNJet Ingress Controller是一个基于OpenNJet的入口控制器。
- Pomerium Ingress Controller基于Pomerium,提供上下文感知的访问策略。
- Skipper HTTP 路由器和反向代理用于服务组合,包括 Kubernetes Ingress 等用例,设计为构建自定义代理的库。
- Traefik Kubernetes Ingress 提供程序是Traefik代理的入口控制器。
- Tyk Operator通过自定义资源扩展了 Ingress,为 Ingress 带来了 API 管理功能。Tyk Operator 可与开源 Tyk Gateway 和 Tyk Cloud 控制平面配合使用。
- Voyager是HAProxy的入口控制器 。
- Wallarm Ingress Controller是一个提供 WAAP(WAF)和 API 安全功能的 Ingress Controller。
如果需要其它Ingress-Controller,可以通过创建Ingress下面参数调整
spec:
ingressClassName: nginx
Ingress-nginx 环境部署
创建Ingress命名空间,存放Ingress-nginx控制器
Ingress控制器可以创建多个用于不同项目使用,默认官方使用ingress-nginx命名空间
kubectl create ns ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.0/deploy/static/provider/cloud/deploy.yaml -n ingress-nginx
#代理地址下载
kubectl apply -f https://d.frps.cn/file/kubernetes/ingress/v1.13.0/deploy.yaml -n ingress-nginx
#建议下载到本地,后续方便修改
由于网络问题
可以使用我保存的镜像导入,只针对v1.13.0
wget https://d.frps.cn/file/kubernetes/ingress/v1.13.0/ingress_v1.13.0.tar && docker load -i ingress_v1.13.0.tar
Ingress-nginx 镜像及参数说明
root@k8s-master-01:~/ingress# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-fdfph 0/1 Completed 0 3m28s
ingress-nginx-admission-patch-xpm6c 0/1 Completed 0 3m28s
ingress-nginx-controller-6b4d45d6f4-zpgg9 1/1 Running 0 3m28s
上面Deploy镜像包含3个Pod,作用如下
- ingress-nginx-admission-create-fdfph
- ingress-nginx-admission-patch-xpm6c
- ingress-nginx-controller-6b4d45d6f4-zpgg9
ingress-nginx-controller-admission 是为准入控制器提供服务的,当我们创建不合要求的 Ingress 对象后就会直接被拒绝了,另外一个 ingress-nginx-controller 就是 ingress 控制器对外暴露的服务,我们可以看到默认是一个 LoadBalancer 类型的 Service
root@k8s-master-01:~/ingress# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.2.123 <pending> 80:32399/TCP,443:30223/TCP 47m
ingress-nginx-controller-admission ClusterIP 10.96.1.160 <none> 443/TCP 47m
root@k8s-master-01:~/ingress# kubectl get sa -n ingress-nginx
NAME SECRETS AGE
default 0 42m
ingress-nginx 0 42m
ingress-nginx-admission 0 42m
检查服务状态
root@k8s-master-01:~/ingress# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.2.123 <pending> 80:32399/TCP,443:30223/TCP 10m
ingress-nginx-controller-admission ClusterIP 10.96.1.160 <none> 443/TCP 10m
root@k8s-master-01:~/ingress#
root@k8s-master-01:~/ingress# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-5c59dc64d9-kkcgg 1/1 Running 0 11m
Ingress-Nginx会创建一个Ingressclass,如果我们需要使用多个Ingress代理,这里可以创建多个Ingressclass
root@k8s-master-01:~/ingress# kubectl get ingressclass
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 51m

Nginx测试
编辑nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-demo
spec:
selector:
matchLabels:
app: ingress-nginx-demo
template:
metadata:
labels:
app: ingress-nginx-demo
spec:
containers:
- name: ingress-nginx-demo
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-demo
labels:
app: ingress-nginx-demo
spec:
ports:
- port: 80
protocol: TCP
name: http
selector:
app: ingress-nginx-demo
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-demo
namespace: default
spec:
ingressClassName: nginx #使用nginx的IngressClass(关联的 ingress-nginx 控制器)这里也可以关联其它控制器
rules:
- host: nginx.frps.cn #将域名映射到ingress-nginx-demo服务
http:
paths:
- path: /
pathType: Prefix
backend:
service: #将所有请求发送到ingress-nginx-demo服务的80端口
name: ingress-nginx-demo
port:
number: 80
Ingress控制器通过Service来获取后端的Endpoints列表,直接转发到Pod
创建测试NGINX
root@k8s-master-01:~/ingress# kubectl apply -f nginx-test.yaml
deployment.apps/ingress-nginx-demo created
service/ingress-nginx-demo created
ingress.networking.k8s.io/ingress-nginx-demo created
上面创建了deployment、svc、Ingress,接下来检查状态
root@k8s-master-01:~/ingress# kubectl get pod |grep nginx
ingress-nginx-demo-65d68f5484-qszqx 1/1 Running 0 92s
root@k8s-master-01:~/ingress# kubectl get svc |grep nginx
ingress-nginx-demo ClusterIP 10.96.3.76 <none> 80/TCP 100s
root@k8s-master-01:~/ingress# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-nginx-demo nginx nginx.frps.cn 80 107s
- Mac 添加host解析
➜ ~ sudo vim /etc/hosts
192.168.21.14 nginx.frps.cn
访问测试
ingress-nginx svc端口为32399,需要访问添加32399端口
root@k8s-master-01:~# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.2.123 <pending> 80:32399/TCP,443:30223/TCP 125m
ingress-nginx-controller-admission ClusterIP 10.96.1.160 <none> 443/TCP 125m
内部访问测试
在集群内部使用nodeport方式访问
curl -H "Host: nginx.frps.cn" http://192.168.21.13:32399
>集群内部所有网络均可以正常访问

浏览器访问
浏览器需要使用Pod所在节点的nodeport访问
查看Ingress所在pod节点
通常清空下,Ingress只会在边缘节点进行部署安装,如果我们需要在所有节点上都开启Ingress访问,只需要在配置文件中添加
hostNetwork=true
#或者我们将Pod设置为6个,平均分布在每一台节点
这里我采用边缘节点访问
root@k8s-master-01:~/ingress# kubectl get pod -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-controller-5c59dc64d9-t9vgd 1/1 Running 0 25m 10.0.2.253 k8s-master-02 <none> <none>
访问k8s-master-02


Ingress-Nginx 配置说明
如果想多Ingress新增额外的配置,可以在全局配置文件,或者Ingress配置添加
- 全局修改
全局修改通过configmap定义
root@k8s-master-01:~/ingress# kubectl edit cm -n ingress-nginx ingress-nginx-controller
#新增下方配置
data:
access-log-path: /var/log/nginx/nginx_access.log
error-log-path: /var/log/nginx/nginx_error.log
log-format-upstream: $remote_addr - $remote_user [$time_iso8601] $msec "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] [$upstream_addr] [$upstream_response_length] [$upstream_response_time] [$upstream_status] $req_id
keep-alive-requests: "10000"
max-worker-connections: "65536"
upstream-keepalive-connections: "200"
检查生效情况
root@k8s-master-01:~/ingress# kubectl get cm -n ingress-nginx ingress-nginx-controller -o yaml
apiVersion: v1
data:
access-log-path: /var/log/nginx/nginx_access.log
error-log-path: /var/log/nginx/nginx_error.log
keep-alive-requests: "10000"
log-format-upstream: $remote_addr - $remote_user [$time_iso8601] $msec "$request"
$status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time
[$proxy_upstream_name] [$proxy_alternative_upstream_name] [$upstream_addr] [$upstream_response_length]
[$upstream_response_time] [$upstream_status] $req_id
max-worker-connections: "65536"
upstream-keepalive-connections: "200"
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":null,"kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/part-of":"ingress-nginx","app.kubernetes.io/version":"1.13.0"},"name":"ingress-nginx-controller","namespace":"ingress-nginx"}}
creationTimestamp: "2025-08-04T01:35:15Z"
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.13.0
name: ingress-nginx-controller
namespace: ingress-nginx
resourceVersion: "11044446"
uid: 7e6ed62f-d861-491e-b9a5-dd12f1d967a9
到Ingress-nginx-controller中,已经可以看到配置生效
进入到Ingress-nginx-controller下面/var/log/nginx已经可以看到我们引用的配置文件

- Ingress 独立域名配置
如果不想全局生效,可以针对独立Ingress新增配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-demo
namespace: default
annotations:
nginx.ingress.kubernetes.io/use-regex: "true" ##指定后面rules定义的path可以使用正则表达式
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" ##连接超时时间,默认为5s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600" ##后端服务器回转数据超时时间,默认为60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600" ##后端服务器响应超时时间,默认为60s
nginx.ingress.kubernetes.io/proxy-body-size: "50m" ##客户端上传文件,最大大小,默认为20m
spec:
ingressClassName: nginx #使用nginx的IngressClass(关联的 ingress-nginx 控制器)
rules:
- host: nginx.frps.cn #将域名映射到ingress-nginx-demo服务
http:
paths:
- path: /
pathType: Prefix
backend:
service: #将所有请求发送到ingress-nginx-demo服务的80端口
name: ingress-nginx-demo
port:
number: 80
检查是否生效
root@k8s-master-01:~/ingress# kubectl describe ingress ingress-nginx-demo
Name: ingress-nginx-demo
Labels: <none>
Namespace: default
Address:
Ingress Class: nginx
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
nginx.frps.cn
/ ingress-nginx-demo:80 (10.0.3.69:80)
Annotations: nginx.ingress.kubernetes.io/proxy-body-size: 50m
nginx.ingress.kubernetes.io/proxy-connect-timeout: 600
nginx.ingress.kubernetes.io/proxy-read-timeout: 600
nginx.ingress.kubernetes.io/proxy-send-timeout: 600
nginx.ingress.kubernetes.io/use-regex: true
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 47m nginx-ingress-controller Scheduled for sync
Normal Sync 47m nginx-ingress-controller Scheduled for sync
Normal Sync 47m nginx-ingress-controller Scheduled for sync
Normal Sync 47m nginx-ingress-controller Scheduled for sync
Normal Sync 94s (x2 over 47m) nginx-ingress-controller Scheduled for sync


[…] https://i4t.com/25699.html […]