Kubernetes 中如何进行 Ingress 的管理

什么是 Ingress

在 Kubernetes 中,Ingress 是一种管理入口流量的 API 对象,它允许对外暴露 HTTP 和 HTTPS 服务,并提供了负载均衡、SSL 终止、路径路由等功能。Ingress 可以将多个服务映射到同一个 IP 地址和端口号上,并且可以根据请求的路径和主机名将流量路由到不同的服务上。

Ingress 的优势

相比于 Service 和 NodePort,Ingress 具有以下优势:

  • 更灵活的路由规则:Ingress 可以根据请求的路径和主机名进行路由,从而将流量转发到不同的服务上,而 Service 和 NodePort 只能根据端口号进行路由。
  • 更好的负载均衡:Ingress 可以将多个服务映射到同一个 IP 地址和端口号上,并且可以根据请求的路径和主机名将流量路由到不同的服务上,从而实现更好的负载均衡。
  • 更好的安全性:Ingress 可以提供 SSL 终止和基于请求路径和主机名的访问控制,从而提高应用程序的安全性。

如何进行 Ingress 的管理

安装 Ingress Controller

在使用 Ingress 之前,需要先安装 Ingress Controller。Ingress Controller 是一个负责处理 Ingress 请求的组件,它会监视 Kubernetes API 中的 Ingress 对象,并根据 Ingress 规则配置负载均衡器(如 Nginx、Traefik 等)。

Kubernetes 官方提供了 Nginx 和 Traefik 两种 Ingress Controller 的实现,可以根据需求选择其中一种进行安装。

安装 Nginx Ingress Controller

# 添加 Nginx Ingress Controller 的 Helm 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# 更新仓库
helm repo update

# 安装 Nginx Ingress Controller
helm install nginx-ingress ingress-nginx/ingress-nginx

安装 Traefik Ingress Controller

# 添加 Traefik Ingress Controller 的 Helm 仓库
helm repo add traefik https://helm.traefik.io/traefik

# 更新仓库
helm repo update

# 安装 Traefik Ingress Controller
helm install traefik traefik/traefik

创建 Ingress 对象

在安装完 Ingress Controller 后,就可以创建 Ingress 对象了。下面是一个简单的 Ingress 配置示例:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /webapp
        backend:
          serviceName: webapp
          servicePort: 80

上述配置会将 example.com/webapp 的请求转发到名为 webapp 的服务的 80 端口上。

Ingress 规则

Ingress 规则包括两个部分:规则(rule)和路径(path)。

规则(rule)定义了 Ingress 对象所负责的主机名或 IP 地址,一个 Ingress 对象可以包含多个规则,每个规则可以对应一个或多个路径。

路径(path)定义了请求的路径和服务的映射关系,一个规则可以包含多个路径,每个路径可以对应一个或多个服务。

下面是一个包含多个规则和多个路径的 Ingress 配置示例:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /webapp
        backend:
          serviceName: webapp
          servicePort: 80
      - path: /api
        backend:
          serviceName: api
          servicePort: 8080
  - host: blog.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: blog
          servicePort: 80

上述配置会将 example.com/webapp 的请求转发到名为 webapp 的服务的 80 端口上,将 example.com/api 的请求转发到名为 api 的服务的 8080 端口上,将 blog.example.com 的请求转发到名为 blog 的服务的 80 端口上。

路径匹配

路径匹配支持三种方式:精确匹配(Exact)、前缀匹配(Prefix)和正则匹配(Regex)。

  • 精确匹配:/webapp 只匹配 /webapp,不匹配 /webapp/
  • 前缀匹配:/webapp/ 匹配以 /webapp/ 开头的所有路径,包括 /webapp
  • 正则匹配:^/webapp/.*$ 匹配以 /webapp/ 开头的所有路径。

Ingress 配置示例

下面是一个完整的 Ingress 配置示例,包括了多个规则和路径的配置:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - example.com
    secretName: tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /webapp
        backend:
          serviceName: webapp
          servicePort: 80
      - path: /api
        backend:
          serviceName: api
          servicePort: 8080
  - host: blog.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: blog
          servicePort: 80

上述配置会将 example.com/webapp 的请求转发到名为 webapp 的服务的 80 端口上,将 example.com/api 的请求转发到名为 api 的服务的 8080 端口上,将 blog.example.com 的请求转发到名为 blog 的服务的 80 端口上,并且会自动将所有非 HTTPS 请求重定向到 HTTPS。

总结

通过本文的介绍,我们了解了 Ingress 的概念和优势,以及如何在 Kubernetes 中进行 Ingress 的管理。在实际应用中,我们可以根据需求选择不同的 Ingress Controller,并根据具体情况配置不同的 Ingress 规则和路径,从而实现更加灵活和高效的流量管理。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c361acadd4f0e0ffda9c15