2-Ingress
ingressclass用于在集群内有多个ingress controller时候,区分ingress由谁处理
ingress概述
通常情况下, Service和Pod仅可在集群内部网络中通过IP地址访问,Ingress是建立在Service之上的7层访问入口,它支持通过URL的方式将Service暴露到k8s集群外
Ingress应用场景
作为集群的单一入口点,实现负载均衡和路由
假设有一个 Kubernetes 集群运行着多个微服务,包括前端 Web 应用、API 服务和后端数据库。通过创建一个 Ingress 资源,可以统一管理这些服务的外部访问,将所有流量路由到适当的后端服务。
对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务或者虚拟服务器(Virtual Host),这些应用层的转发机制仅通过Kubernetes的Service机制是无法实现的。从Kubernetes 1.1版本开始新增Ingress资源对象,用于将不同URL的请求转发到后端不同的Service,以实现HTTP层的业务路由机制。
在实际生产中,一个网站的服务往往是由不同的Service提供服务的。而每个Service通常又采用LoadBalance的方式提供服务,这就需要为每个Service提供自己的负载均衡器,以及独有的公网IP。使用Ingress只需要一个公网IP就能为许多服务提供访问,当客户端向Ingress发送请求时,Ingress会根据请求的主机名和路径决定请求转发到的Service
实现ingress
使用Ingress实现一个完整的七层负载均衡器,需要两步:
(1)安装Ingress Controller。
(2)定义一个Ingress资源对象,用来关联需要暴露出去的Pod的Service。
- 必须有一个Ingress Controller才能满足Ingress的要求。仅创建Ingress资源本身没有任何效果。
- ingress controller:使用ingress resources提供的规则将客户端请求转发。默认是nginx
- ingress resources:Ingress资源对象,用来关联需要暴露出去的Pod的Service
Ingress规则
kubectl explain ingress.spec.rules(每个rules都包含以下信息)
* host:
* 未指定host:适用于通过指定IP地址的所有HTTP的请求。
* 指定host:
* 如果Host是精确的,则http的Host头等于Host,则匹配该规则。
* 如果Host是一个通配符,那么如果http主机报头等于通配符规则的后缀(删除第一个标签),则请求匹配该规则。
* http:
* paths:
* backend:定义将请求转发到哪个Service。
* path:与请求的路径相匹配。路径必须以“/”开头。当未指定时,将匹配来自传入请求的所有路径。
* pathType:决定对Path匹配的解释。可选值有Exact和Prefix。
* Exact:精确匹配URL路径。
* Prefix:匹配基于URL路径前缀分割'/'。如果Prefix的值是请求路径的前缀子串,就匹配。
* 与host和path匹配的对Ingress的HTTP(和HTTPS)请求将会被发送到backend。
Ingress默认后端
kubectl explain ingress.spec.defaultBackend
* resource:是Ingress对象名称空间中另一个Kubernetes资源对象。与“Service”互斥。
* apiGroup:是被引用资源的组。如果不指定APIGroup,则指定的Kind必须在核心API组中。对于任何其他第三方类型,都需要指定APIGroup。
* kind:是被引用的资源的类型。
* name:是被引用的资源的名称。
* service:引用一个Service作为后端。与“Resource”互斥。
* name:被引用的Service。该Service必须与Ingress对象在同一个名称空间中。
* port:被引用Service的端口。IngressServiceBackend需要一个端口名称或端口号。
* 一个没有设置rules的Ingress会将所有的请求发送到defaultbackend定义的默认后端。
* defaultBackend通常是Ingress控制器的一个配置选项,不会在Ingress资源中指定。
* 如果没有指定.spec.rules,则必须指定.spec.defaultbackend。如果defaultBackend没有设置,不匹配任何规则的请求的处理将由入口控制器。
* 如果所有主机或路径都不匹配Ingress对象中的HTTP请求,流量将被路由到默认后端。
安装ingress controller
-
在定义Ingress策略之前,需要先部署Ingress Controller,以实现为所有后端Service都提供一个统一的入口。
1. Ingress Controller需要实现基于不同HTTP URL向后转发请求,并可以灵活设置7层负载分发策略。
2. 如果公有云服务商能够提供该类型的HTTP路由LoadBalancer,则也可设置其为Ingress Controller。 -
在Kubernetes中,Ingress Controller将以Pod的形式运行,监控API Server的/ingress接口后端的backend services,如果Service发生变化,则Ingress Controller应自动更新其转发规则。
-
ingress controller就是一个或一组拥有七层代理能力或调度能力的应用程序的pod。
要安装的Ingress Controller是ingress-nginx-controller。
1、下载ingress-nginx-controller
官网:https://github.com/kubernetes/ingress-nginx
下载并解压 ingress-nginx-controller-v1.0.4.zip ,获取yaml文件
ingress-nginx-controller-v1.0.4\deploy\static\provider\baremetal\deploy.yaml
修改相应配置,省略
2、安装ingress-nginx-controller
kubectl apply -f ingress-nginx-controller-v1.0.4.yaml
kubectl get pods -o wide -A
kubectl get svc -o wide -A
3、访问ingress-nginx-controller
# 四个请求的返回值是一样的,都是404,因为还没有后端服务。
# 通过serviceIP访问
curl http://10.20.234.166:80
curl -k https://10.20.234.166:443
# 通过nodeIP访问
curl http://10.1.1.11:32080
curl -k https://10.1.1.11:32443
Ingress 工作原理
ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,然后读取它,按照ingress中自定义的规则,规则写明了哪个域名对应哪个service,生成一段nginx配置,再写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。
创建Ingress
创建一个单一规则的Ingress
vim my-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: ingress.example.com # 将该域名映射到目标service
http:
paths:
- path: /
backend: # 将所有请求发送到该service上
serviceName: my-service # 与上边映射的svc名称一致
servicePort: 80
通过http://ingress.example.com访问服务,需要确保域名解析为Ingress控制器的IP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
# 启用日志记录
nginx.ingress.kubernetes.io/enable-access-log: "true"
nginx.ingress.kubernetes.io/access-log-path: /var/log/nginx/access.log
# 配置CORS允许的来源
nginx.ingress.kubernetes.io/cors-allow-origin: "http://example.com"
# 配置自定义错误页面
nginx.ingress.kubernetes.io/custom-http-errors: "404,503"
nginx.ingress.kubernetes.io/custom-http-errors-404: /errors/404.html
nginx.ingress.kubernetes.io/custom-http-errors-503: /errors/503.html
spec:
# 定义Ingress规则
rules:
# 单一入口点
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
# 路径和域名路由
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
# 负载均衡
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 80
# 配置TLS/SSL终结
tls:
- hosts:
- example.com
secretName: tls-secret
# 配置自定义错误页面
- http:
paths:
- path: /oldpath
pathType: Prefix
backend:
service:
name: redirect-service
port:
number: 80
# 基于主机名的虚拟主机
- host: subdomain.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: subdomain-service
port:
number: 80
# 认证和授权
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: auth-service
port:
number: 80
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南