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等一系列知识点的讲解,并且最后总

全部评论

相关推荐

12-07 16:16
已编辑
四川大学 Java
点赞 评论 收藏
分享
12-09 12:21
门头沟学院 C++
l11hy:今早刚开,已满足
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务