27. Service——Ingress
本章讲解知识点
- Ingress 7层路由机制
我们之前讲了 Service 的类型。除了 clusterIP 以外,另外三种方式都不推荐,因为这相当于将集群给暴露出去了,不安全,也不符合隔离的思想。
所以在 clusterIP 的基础上结合 Ingress 就可以做到安全将服务开放给外部。
这一节我们着重讲解 Ingress 。
1. Ingress 7层路由机制
1.1 背景
根据前面对 Service 概念的说明,我们知道 Service 的表现形式为 IP 地址和端口号(ClusterIP:IP),即工作在 TCP/IP 层。而对于基于 HTTP(S) 的服务来说,不同的 URL 地址经常对应到不同的后端服务或者虚拟服务器,这些应用层的转发机制仅通过 Kubernetes 的 Service 机制是无法实现的。Kubernetes 引入 Ingress 资源对象,用于将集群外的客户端请求路由到集群内部的服务上,同时提供 7 层(HTTP 和 HTTPS)路由功能。
1.2 基本概念
Ingress 是 Kubernetes 中的一种资源对象,用于实现 HTTP(S) 服务的外部访问控制和负载均衡。它提供了一种在集群外部公开 HTTP(S) 服务的方法,同时支持基于主机名和 URL 路径的多个服务路由。
Ingress 通过在 Kubernetes 集群中部署一个负载均衡器(通常是一个反向代理,如 Nginx),来将外部流量路由到不同的 Service 中。通过 Ingress,可以在同一个 IP 地址和端口上映射多个 Service,通过 URL 路径或主机名将请求路由到不同的 Service 上。
Ingress 采用的是七层(应用层)路由机制,可以实现以下功能:
- 主机名(hostname)路由:根据 HTTP 请求中的主机名将请求路由到对应的 Service 上。
- URL 路径(path)路由:根据 HTTP 请求中的 URL 路径将请求路由到对应的 Service 上。
- SSL/TLS 终止:支持 SSL/TLS 协议,可以在 Ingress 中配置 TLS 证书,从而在负载均衡器和后端 Service 之间加密流量。
- 默认后端(default backend):可以配置一个默认后端,将所有无法匹配到路由规则的请求转发到该后端。
Ingress 是一种比较高级的 Kubernetes 资源对象,需要使用 Ingress Controller 实现。常见的 Ingress Controller 包括 Nginx、Traefik、HAProxy 等,可以根据实际情况选择合适的 Ingress Controller 来实现对集群内服务的外部访问控制和负载均衡。
需要注意的是,Ingress 只能以 HTTP 和 HTTPS 提供服务,对于使用其他网络协议的服务,可以通过设置 Service 的 type 为 NodePort 或 LoadBalancer 对集群外部的客户端提供服务。
使用 Ingress 进行服务路由时,Ingress Controller 基于 Ingress 规则将客户端请求直接转发到 Service 对应的后端 Endpoint 上,这样会跳过 kube-proxy 设置的路由转发规则,以提高网络转发效率。
来看一个典型的 HTTP 层路由的例子:
可以看到,不用的 URL 路径的访问将被路由到不同的后端 Service 上。
1.3 Ingress 定义文件
以下是一个简单的 Ingress 配置文件的例子,它定义了一个基于主机名和路径的路由规则,将来自不同域名和路径的请求路由到不同的后端 Service:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: foo.example.com http: paths: - path: /foo pathType: Prefix backend: service: name: foo-service port: name: http - host: bar.example.com http: paths: - path: /bar pathType: Prefix backend: service: name: bar-service port: name: http
这个例子定义了两个路由规则,一个是将来自 foo.example.com/foo
的请求路由到名为 foo-service 的 Service 上,另一个是将来自 bar.example.com/bar
的请求路由到名为 bar-service 的 Service 上。其中,pathType 表示路径匹配类型,支持两种类型:Prefix 和 Exact。如果使用 Prefix,则请求的路径必须以指定的路径前缀开始;如果使用 Exact,则请求的路径必须与指定的路径完全匹配。
1.规则相关设置
在 Ingress 中,可以通过 rules 字段来定义请求路由规则。rules 字段是一个列表,每个元素都是一个路由规则。每个路由规则都包含以下字段:
- host:指定了应该匹配的请求的主机名,可以使用正则表达式来进行匹配。
- http:指定了当请求的 HTTP 头部中包含了特定的标头时,要对这个请求进行转发的规则。它包含以下字段:paths:指定了针对此规则的请求路径的列表。每个元素都包含以下字段: path:请求的 URL 路径,可以使用正则表达式来进行匹配。pathType:可以是 Exact 或 Prefix,分别表示请求路径必须精确匹配或是以指定的路径前缀开头。
2.后端设置
在 Ingress 的 backend 部分,可以定义一个后端服务,用于请求转发。具体可以设置以下内容:
- serviceName:后端服务的名称,必填项。
- servicePort:后端服务的端口号,必填项。
- resource:后端服务的资源类型,支持 Pod、Service 和扩展资源(如 StatefulSet)。如果同时存在多种资源类型,则优先选择更具体的资源类型,如 Pod。
- resourceName:后端服务的资源名称,用于资源类型为 Pod 和扩展资源时指定。
- subdomain:如果要将请求转发到子域名下的后端服务,可以在此处指定子域名。
- path:如果要将请求转发到路径下的后端服务,可以在此处指定路径。
以下是一个 backend 部分的示例:
backend: serviceName: backend-service servicePort: 80 resource: Pod resourceName: backend-pod-1 subdomain: backend.example.com path: /api
这个示例定义了一个后端服务,使用 Pod 类型的资源 backend-pod-1,端口号为 80,并将请求转发到 backend.example.com 子域名下的 /api
路径。
3.host 通配符设置
在 Kubernetes 的 Ingress 资源对象定义中,可以使用 host 字段来指定 Ingress 的规
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总