Kubernetes之Ingress详解

目录

Ingress

Ingress 是 Kubernetes 中的一种 API 对象,用于管理和配置集群中的 HTTP 和 HTTPS 服务路由。

Ingress 可以在 Kubernetes 集群外公开服务,并提供负载均衡、SSL 终止和基于主机名或 URL 路径的路由等功能。

简单来说,Ingress 允许你将多个服务(Service)暴露给集群外部,通过不同的路径或主机名将请求路由到不同的服务上。这样可以避免在集群外部使用 NodePort 或 LoadBalancer 服务类型来访问应用程序,从而更加灵活和可控地管理应用程序的网络流量。

在 Kubernetes 中,Ingress 对象用 YAML 文件进行定义,并使用 Ingress Controller 进行处理和实现。Ingress Controller 是一个独立的组件,它会监视 Ingress 对象的变化,并根据定义的规则动态地更新反向代理服务器的配置,从而实现流量转发和负载均衡。

常见的 Ingress Controller 包括 Nginx Ingress Controller、Traefik、HAProxy 等。你可以根据自己的需求选择适合自己的 Ingress Controller,并将其部署到 Kubernetes 集群中。

注:要使用Ingress ,必须先将Ingress Controller部署到Kubernetes 并可用

Ingress配置

Ingress策略可以按多种方式进行配置,下面对几种常见的Ingress转发策略进行说明。

配置写法

下面Ingress 的配置写法是在 Kubernetes 1.19 版本开始引入,如果你的Kubernetes 版本比较低的话,那么使用的是以下写法

powershell 复制代码
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /path1
            backend:
              serviceName: service1
              servicePort: 80
          - path: /path2
            backend:
              serviceName: service2
              servicePort: 80

最主要区别是serviceName和servicePort、path

转发到单个后端服务

基于这种设置,客户端到Ingress Controller的访问请求都将被转发到后端的唯一Service上,在这种情况下Ingress无须定义任何rule。

powershell 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  defaultBackend:
    service:
      name: test
      port:
        number: 80

使用 kubectl apply -f 创建此 Ingress,使用以下命令就可以查看Ingress 的状态:

powershell 复制代码
kubectl get ingress test-ingress

输出如下

powershell 复制代码
NAME           CLASS         HOSTS   ADDRESS         PORTS   AGE
test-ingress   external-lb   *       203.0.113.123   80      59s

其中 203.0.113.123 是由 Ingress 控制器分配以满足该 Ingress 的 IP。

不同的URL路径被转发到不同的服务上

要将不同的 URL 路径转发到不同的服务上,你可以在 Ingress 配置文件中定义多个路径映射规则。每个路径映射规则都指定了一个特定的路径和对应的后端服务。以下是一个示例的 Ingress 配置文件,将不同的 URL 路径转发到不同的服务上:

powershell 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /service1
            pathType: Prefix
            backend:
              service:
                name: service1
                port:
                  number: 80
          - path: /service2
            pathType: Prefix
            backend:
              service:
                name: service2
                port:
                  number: 80

在这个示例中,Ingress 对象将主机名为 example.com 的请求路径为 /service1 的请求转发到名为 service1 的后端服务上,而请求路径为 /service2 的请求则转发到名为 service2 的后端服务上。

你可以根据需要在 paths 部分添加更多的路径映射规则,以将请求转发到不同的服务上。只需定义相应的路径和后端服务即可。

不同的域名转发到不同的服务上

想要将不同的域名转发到不同的服务上,我们只需要配置多个对应的host规则即可

示例:

powershell 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: service1.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service1
                port:
                  number: 80
    - host: service2.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service2
                port:
                  number: 80

在这个示例中,Ingress 对象将主机名为 service1.example.com 的所有请求转发到名为 service1 的后端服务上,而主机名为 service2.example.com 的所有请求则转发到名为 service2 的后端服务上。

需要注意的是,在实际使用时,你还需要将 DNS 记录配置为将不同的主机名指向你的 Kubernetes 集群中运行的 Ingress Controller。只有这样,请求才能正确地路由到对应的 Ingress 对象上。

我们还可以配置一个默认的路由,所有其他流量都会被路由到 一个service上,如下所示

powershell 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: name-virtual-host-ingress-no-third-host
spec:
  rules:
  - host: first.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: second.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service2
            port:
              number: 80
  - http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service3
            port:
              number: 80

Ingress 会将 first.bar.com 的请求路由到 service1,将 second.bar.com 的请求路由到 service2,而所有其他请求都会被路由到 service3。

不使用域名的转发规则

如果你不想使用域名的转发规则,而是希望根据路径来进行转发,可以将 Ingress 配置中的 host 字段移除,这样 Ingress 将会对所有的主机名生效,并且根据路径来进行转发。

powershell 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - http:
        paths:
          - path: /service1
            pathType: Prefix
            backend:
              service:
                name: service1
                port:
                  number: 80
          - path: /service2
            pathType: Prefix
            backend:
              service:
                name: service2
                port:
                  number: 80

在这个示例中,我们去掉了 host 字段,这意味着这个 Ingress 对象将对所有主机名生效。然后,根据不同的路径将请求转发到不同的后端服务上。通过这样的配置,不同的 URL 路径将被转发到不同的服务上,而不考虑请求的主机名是什么。

相关推荐
Lumbrologist3 小时前
【零基础部署】Docker 部署 CrewAI 多 Agent 编排框架保姆级教程
运维·docker·容器
for_ever_love__3 小时前
UI学习:UISearchController基础了解和应用
学习·ui·ios·objective-c
红尘散仙3 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
心中有国也有家3 小时前
GE图引擎深度解析——CANN的计算图优化与执行引擎
人工智能·pytorch·python·学习·numpy
卷毛的技术笔记5 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆5 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
GHL2842710905 小时前
换脸工作流学习
学习·ai
喵个咪5 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
_李小白5 小时前
【android opencv学习笔记】Day 28: 滤波算法之中值滤波器
android·opencv·学习
basketball6166 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang