Ingress 是 Kubernetes 中一种用于控制流量进入集群的资源。它可以为集群内的服务提供统一的访问入口,并提供一些额外的功能,例如:
-
路由流量到不同的服务
-
提供基于路径的路由
-
提供基于主机的路由
-
提供 TLS 加密
-
使用身份验证和授权
Ingress 的基本概念
Ingress 由以下几个部分组成:
-
Ingress 规则: 定义如何将流量路由到不同的服务。
-
Backend: 代表一个或多个 Pod 的服务。
-
TLS 配置: 用于配置 Ingress 的 TLS 加密。
-
身份验证和授权: 用于控制哪些用户可以访问哪些服务。
Ingress 的作用
Ingress 可以提供以下作用:
-
简化服务访问: Ingress 可以为集群内的服务提供统一的访问入口,无需为每个服务都配置单独的域名和端口号。
-
提高安全性: Ingress 可以提供 TLS 加密和身份验证和授权,提高服务安全性。
-
提供负载均衡: Ingress 可以将流量分散到多个服务实例上,实现负载均衡。
使用 Ingress 进行服务发现
可以使用 Ingress 进行服务发现。
示例:将 www.example.com 域名下的所有流量路由到名为 my-service 的服务上的 80 端口,将 api.example.com 域名下的所有流量路由到名为 my-api 的服务上的 8080 端口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
- host: api.example.com
http:
paths:
- path: /
backend:
serviceName: my-api
servicePort: 8080
使用 Ingress 进行负载均衡
可以使用 Ingress 进行负载均衡。
示例:将 www.example.com 域名下的所有流量路由到名为 my-service 的服务上的 80 端口和 8081 端口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
servicePort: 8081
Ingress 类型
根据 Ingress Spec 配置的不同,Ingress 可以分为以下几种类型:
1. 单服务
单服务类型的 Ingress 仅用于暴露单个服务。
示例:将 https://www.example.com 域名下的所有流量路由到名为 my-service 的服务上的 80 端口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
2. 多服务
多服务类型的 Ingress 可以用于暴露多个服务。
示例:将 https://www.example.com 域名下的所有流量路由到名为 my-service 的服务上的 80 端口,将 api.example.com 域名下的所有流量路由到名为 my-api 的服务上的 8080 端口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
- host: api.example.com
http:
paths:
- path: /
backend:
serviceName: my-api
servicePort: 8080
3.虚拟主机
虚拟主机类型的 Ingress 可以用于为不同的域名或路径提供不同的服务。
示例:将 https://www.example.com 域名下的所有流量路由到名为 my-service 的服务上的 80 端口,将 api.example.com 域名下的所有流量路由到名为 my-api 的服务上的 8080 端口,将 blog.example.com 域名下的所有流量路由到名为 my-blog 的服务上的 8081 端口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
- host: api.example.com
http:
paths:
- path: /
backend:
serviceName: my-api
servicePort: 8080
- host: blog.example.com
http:
paths:
- path: /
backend:
serviceName: my-blog
servicePort: 8081
Ingress 工作原理详解
1. 请求处理流程
-
外部客户端向 Ingress 发送请求,请求包含域名、路径、主机头等信息。
-
Ingress Controller 监听来自外部的请求。
-
Ingress Controller 根据请求的域名、路径、主机头等信息,匹配相应的 Ingress 规则。
-
Ingress Controller 将请求转发到匹配的 Backend 服务。
-
Backend 服务处理请求并返回响应。
-
Ingress Controller 将 Backend 服务的响应返回给外部客户端。
2. 匹配规则
Ingress 规则用于匹配请求,并将其路由到相应的 Backend 服务。Ingress 规则可以根据以下条件进行匹配:
-
域名: 请求的域名必须与 Ingress 规则中的域名匹配。
-
路径: 请求的路径必须与 Ingress 规则中的路径匹配。
-
主机头: 请求的主机头必须与 Ingress 规则中的主机头匹配。
3. 路由策略
Ingress 可以使用以下路由策略:
-
基于路径的路由: 根据请求的路径将流量路由到不同的 Backend 服务。
-
基于主机的路由: 根据请求的主机头将流量路由到不同的 Backend 服务。
-
负载均衡: 将流量分散到多个 Backend 服务实例上。
4. TLS 加密
Ingress 可以配置 TLS 加密,为 Ingress 和 Backend 服务之间的通信提供安全性。
-
-
Ingress TLS 加密配置
-
可以使用 kubectl 命令配置 Ingress 的 TLS 加密。
示例:将为 https://www.example.com 域名下的所有流量启用 TLS 加密。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
tls:
- hosts:
- www.example.com
secretName: my-tls-secret
-
-
Ingress TLS 加密工作原理
-
-
-
-
外部客户端向 Ingress 发送请求。
-
Ingress Controller 监听来自外部的请求。
-
Ingress Controller 使用 TLS 加密与外部客户端进行通信。
-
Ingress Controller 将请求转发到 Backend 服务。
-
Backend 服务使用 TLS 加密与 Ingress Controller 进行通信。
-
Backend 服务处理请求并返回响应。
-
Ingress Controller 使用 TLS 加密将 Backend 服务的响应返回给外部客户端。
-
-
-
-
Ingress TLS 加密注意事项
-
需要为 Ingress 配置 TLS 证书和密钥。
-
需要为 Backend 服务配置 TLS 证书和密钥。
-
需要确保 Ingress Controller 和 Backend 服务都支持 TLS 加密。
-
-
5. Ingress 身份验证和授权
Ingress 可以使用身份验证和授权来控制哪些用户可以访问哪些服务。
-
身份验证
身份验证用于确定用户身份。常用的身份验证方法有:
-
-
基本身份验证: 使用用户名和密码进行身份验证。
-
OIDC: 使用 OpenID Connect 进行身份验证。
-
LDAP: 使用 LDAP 进行身份验证。
-
-
授权
授权用于确定用户可以访问哪些资源。常用的授权方法有:
-
-
RBAC: 使用 Kubernetes RBAC 进行授权。
-
ABAC: 使用 Attribute-Based Access Control 进行授权。
-
-
Ingress 身份验证和授权配置
可以使用 kubectl 命令配置 Ingress 的身份验证和授权。
示例:将使用基本身份验证来控制对服务的访问。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
auth:
- type: basic
basic:
realm: my-realm
secretName: my-auth-secret
-
-
Ingress 身份验证和授权工作原理
-
-
-
-
外部客户端向 Ingress 发送请求。
-
Ingress Controller 根据 Ingress 规则中的配置,对请求进行身份验证和授权。
-
如果身份验证和授权成功,Ingress Controller 将请求转发到 Backend 服务。
-
如果身份验证或授权失败,Ingress Controller 将返回错误响应。
-
-
-
-
Ingress 身份验证和授权注意事项
-
需要为 Ingress 配置身份验证和授权策略。
-
需要为 Backend 服务配置身份验证和授权策略。
-
需要确保 Ingress Controller 和 Backend 服务都支持身份验证和授权。
-
-
6.Ingress Controller 实现原理
Ingress Controller 是负责处理 Ingress 规则并将其付诸实践的组件。常用的 Ingress Controller 有 Nginx Ingress Controller、HAProxy Ingress Controller 等。
-
Nginx Ingress Controller 实现原理
Nginx Ingress Controller 是使用 Nginx 作为 Ingress Controller 的实现。
-
Nginx Ingress Controller 工作原理
-
Nginx Ingress Controller 监听来自外部的请求。
-
Nginx Ingress Controller 根据 Ingress 规则中的配置,将请求路由到相应的 Backend 服务。
-
Nginx Ingress Controller 可以提供以下功能:
-
基于路径的路由
-
基于主机的路由
-
负载均衡
-
TLS 加密
-
身份验证和授权
-
-
HAProxy Ingress Controller 实现原理
HAProxy Ingress Controller 是使用 HAProxy 作为 Ingress Controller 的实现。
-
HAProxy Ingress Controller 工作原理
-
HAProxy Ingress Controller 监听来自外部的请求。
-
HAProxy Ingress Controller 根据 Ingress 规则中的配置,将请求路由到相应的 Backend 服务。
-
HAProxy Ingress Controller 可以提供以下功能:
-
基于路径的路由
-
基于主机的路由
-
负载均衡
-
TLS 加密
-
身份验证和授权
-
7. Ingress 的优势
-
简化服务访问: Ingress 可以为集群内的服务提供统一的访问入口,无需为每个服务都配置单独的域名和端口号。
-
提高安全性: Ingress 可以提供 TLS 加密和身份验证和授权,提高服务安全性。
-
提供负载均衡: Ingress 可以将流量分散到多个服务实例上,实现负载均衡。
-
提高灵活性: Ingress 可以根据需要进行灵活配置,满足不同的需求。
8. Ingress 的局限性
-
Ingress 只能路由 HTTP 和 HTTPS 流量。
-
Ingress 无法控制服务之间的流量。
-
Ingress 可能增加服务的复杂性。
欢迎关注公众号:职谷智享,获取更多 Kubernetes 相关技术文章和资讯。
希望本文能够帮助您深入理解 Ingress,并将其应用到您的实际工作中。
相信通过您的学习和实践,您一定能够成为 Kubernetes 的高手!
关注我,我们一起学习更多知识,带你了解更多职场信息内容.
想要了解更多技术文章请关注公众号“职谷智享”,关注后回复关键字【秒杀】可以领取秒杀系统学习资料