前面文章写了Service详解和Ingress和Service的区别,这边文章详细写一下Ingress对象资源
1 Ingress概述
1.1 什么是Ingress
Ingress 是 Kubernetes 中用于管理外部 HTTP 和 HTTPS 流量的关键资源类型,它能够将这些流量路由到集群内的服务。在微服务架构中,Ingress 允许你使用单个入口点来管理多个服务,同时支持负载均衡、路径重写、TLS 终止等高级功能。
【温馨提示】Ingress目前官方已停止更新。新的功能正在集成至网关 API
中。但大部分场景还是在用Ingress来代理外部流量。
1.2 Ingress 的作用
统一入口:通过一个或多个域名访问集群内部的多个服务。
路径路由:根据 URL 路径,将流量分发给不同的服务。
支持 HTTPS:通过 TLS 终止,增强通信安全性。
负载均衡:在服务的多个 Pod 之间分发流量。
与外部流量网关集成:通过云负载均衡器(如 AWS ALB、GCP Load Balancer)或自定义 Ingress Controller 管理流量。
2. Ingress 基本架构
在 Kubernetes 中,Ingress 的功能依赖 Ingress Controller 实现。没有 Ingress Controller,仅创建 Ingress 资源是无法工作的。
2.1 Ingress 和 Ingress Controller
Ingress
是定义路由规则的资源。
Ingress Controller
是实现这些规则的组件,负责将流量路由到相应的服务。
常见的 Ingress Controller 类型包括:
Nginx Ingress Controller Traefik HAProxy Envoy
2.2 Ingress 工作流程
客户端发送 HTTP/HTTPS 请求。 请求到达 Ingress Controller。 Ingress Controller 根据 Ingress 规则,将请求路由到集群内部的服务。 服务处理请求,并返回响应。
3 部署Ingress Controller
ingress-nginx项目地址:
https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/index.md
3.1 获取部署yaml文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0-beta.0/deploy/static/provider/cloud/deploy.yaml
我使用的是最新版本
(1)修改镜像地址在每个镜像前面添加docker.m.daocloud.io
(2)将Service发布类型改为NodePort默认是Loadbalancer。
3.2 部署Ingress控制器
kubectl apply -f deploy.yaml
查看pod的情况
kubectl get pod -n ingress-nginx
查看Service情况
kubectl get svc -n ingress-nginx
看到以上信息,说明ingress controller已经安装完成。
4. Ingress 配置结构
Ingress 资源的定义主要包括以下部分:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: liyb.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
tls:
- hosts:
- liyb.com
secretName: tls-secret
5. Ingress 配置详解
5.1 metadata
name:Ingress 资源的名称。 annotations:用于配置特定 Ingress Controller 的行为。 nginx.ingress.kubernetes.io/rewrite-target:路径重写功能。
5.2 spec
ingressClassName:指定使用哪个 Ingress Controller 处理此 Ingress 资源。 rules:定义域名和路径的路由规则。 host:指定域名 http.paths:定义 URL 路径的路由规则。 path:URL 路径(如 /app1)。 pathType: Exact:精确匹配路径。 Prefix:匹配以此路径为前缀的请求。 ImplementationSpecific:由具体 Ingress Controller 决定匹配逻辑。 backend:指定后端服务。 service.name:目标服务名称。 service.port.number:目标服务的端口号。
5.3 tls
hosts:启用 HTTPS 的域名列表。 secretName:存储 TLS 证书和私钥的 Kubernetes Secret 名称。
6. Ingress Annotations
Annotations 用于配置特定的 Ingress Controller 行为。以下是常见的 Nginx Ingress Controller Annotations:
6.1 流量管理
nginx.ingress.kubernetes.io/rewrite-target: 重写 URL 路径。 nginx.ingress.kubernetes.io/force-ssl-redirect: 将 HTTP 请求重定向到 HTTPS。 nginx.ingress.kubernetes.io/use-regex: 启用正则表达式匹配路径。
6.2 负载均衡
nginx.ingress.kubernetes.io/affinity: 配置会话保持。
值:cookie 表示基于 cookie 的会话保持。
nginx.ingress.kubernetes.io/load-balance: 配置负载均衡策略。
值:round_robin、least_conn、ip_hash。
6.3 安全性
nginx.ingress.kubernetes.io/auth-type: 配置基础认证。 nginx.ingress.kubernetes.io/whitelist-source-range: 允许的 IP 地址列表。
6.4 性能优化
nginx.ingress.kubernetes.io/proxy-read-timeout: 设置后端响应超时时间。 nginx.ingress.kubernetes.io/proxy-body-size: 限制请求体大小。
7. Ingress Class
7.1 Ingress Class 简介
IngressClass 是 Kubernetes 1.18 引入的概念,用于支持集群中多种 Ingress Controller。你可以通过 ingressClassName 字段将 Ingress 资源与特定的 Controller 绑定。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
7.2 配置 Ingress 使用特定 Class
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: custom-ingress
spec:
ingressClassName: nginx
rules:
- host: custom.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: custom-service
port:
number: 80
8. Ingress 使用场景
8.1 单域名多路径路由
通过同一个域名,根据路径将请求分发给不同的服务。
spec:
rules:
- host: example.com
http:
paths:
- path: /app1
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
backend:
service:
name: app2-service
port:
number: 80
8.2 多域名支持
支持多个域名的流量路由。
spec:
rules:
- host: app1.example.com
http:
paths:
- path: /
backend:
service:
name: app1-service
port:
number: 80
- host: app2.example.com
http:
paths:
- path: /
backend:
service:
name: app2-service
port:
number: 80
8.3 启用 HTTPS
配置 Ingress 使用 HTTPS 提供安全访问。
spec:
tls:
- hosts:
- example.com
secretName: tls-secret
9 常见问题
9.1 Ingress 无法访问
原因:未正确配置 Ingress Controller。
解决:检查 Ingress Controller 是否运行,确保正确绑定 Ingress 资源。
9.2 TLS 证书无效
原因:TLS Secret 配置错误。
解决:确保 Secret 包含有效的证书和私钥。
9.3 外部 IP 无法获取
原因:LoadBalancer 类型的 Service 在本地环境无效。
解决:使用 NodePort 类型或本地开发工具(如 Minikube)分配 IP。
本篇文章主要是侧重详细介绍Ingress对象资源,缺少实战操作,后面的文章会对Ingress的使用实战进行讲解。
END
往期推荐
1 | |
2 | |
3 |
4 | |
5 | |
6 |