Kubernetes之Ingress详解

发布时间:2023年12月28日

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 版本比较低的话,那么使用的是以下写法

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。

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

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

kubectl get ingress test-ingress

输出如下

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 路径转发到不同的服务上:

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规则即可

示例:

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上,如下所示

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 将会对所有的主机名生效,并且根据路径来进行转发。

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 路径将被转发到不同的服务上,而不考虑请求的主机名是什么。

文章来源:https://blog.csdn.net/qq_36551991/article/details/135272881
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。