如何使用 Ingress 进行流量路由

KubernetesBeginner
立即练习

简介

本教程将指导你了解 Kubernetes Ingress,配置 Ingress 路由和流量管理,并在你的 Kubernetes 集群中实现 Ingress。Kubernetes Ingress 是一项强大的功能,它简化了对 Kubernetes 集群内服务的外部访问管理,充当第 7 层负载均衡器,并为入站流量提供统一的入口点。

理解 Kubernetes Ingress

Kubernetes Ingress 是一项强大的功能,它简化了对 Kubernetes 集群内服务的外部访问管理。它充当第 7 层负载均衡器,为入站流量提供统一的入口点,并处理路由、负载均衡和 SSL/TLS 终止。

Kubernetes 中的 Ingress 资源定义了将传入的 HTTP 和 HTTPS 流量路由到集群内不同服务的规则。这使你能够通过单个 IP 地址或主机名公开多个服务,而无需为每个服务配置单独的负载均衡器。

Ingress 控制器是负责实现 Ingress 资源的 Kubernetes 组件。它监视 Kubernetes API 以获取 Ingress 资源更新,并相应地配置底层负载均衡基础设施。有几种可用的 Ingress 控制器实现,例如 NGINX Ingress 控制器、Traefik 和 Istio Ingress 网关。

使用 Kubernetes Ingress 有几个好处:

graph TD A[简化路由] --> B[负载均衡] B --> C[SSL/TLS 终止] C --> D[集中访问控制]
  1. 简化路由:Ingress 为管理对集群内服务的外部访问提供了统一的入口点,降低了配置单个服务的复杂性。
  2. 负载均衡:Ingress 控制器处理负载均衡,将传入流量分布到多个服务副本。
  3. SSL/TLS 终止:可以配置 Ingress 来终止 SSL/TLS 连接,将加密/解密过程从服务中卸载。
  4. 集中访问控制:Ingress 允许你在入口点应用安全策略,如身份验证和授权,简化访问管理。

要使用 Kubernetes Ingress,你需要定义一个 Ingress 资源,该资源指定将流量路由到你的服务的规则。以下是一个 Ingress 配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

在此示例中,Ingress 资源根据传入的 URL 路径将流量路由到两个不同的服务:api-serviceweb-service。发往 example.com/api 的流量被转发到 api-service,而发往 example.com/web 的流量被转发到 web-service

配置 Ingress 路由和流量管理

Kubernetes Ingress 提供了灵活的路由功能来管理发往你的服务的入站流量。Ingress 支持两种主要的路由类型:基于路径的路由和基于主机的路由。

基于路径的路由
基于路径的路由允许你根据传入的 URL 路径将流量路由到不同的服务。当你在同一域名下的不同 URL 路径下公开多个服务时,这很有用。以下是一个基于路径的路由的 Ingress 配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

基于主机的路由
基于主机的路由允许你根据传入的主机名将流量路由到不同的服务。当你有多个域名或子域名指向你的 Kubernetes 集群时,这很有用。以下是一个基于主机的路由的 Ingress 配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - host: api.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
    - host: web.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

除了路由,Ingress 还可以处理 SSL/TLS 终止,将加密/解密过程从你的服务中卸载。这是通过在 Ingress 资源中配置 TLS 设置来完成的:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  tls:
    - hosts:
        - example.com
      secretName: tls-secret
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

在此示例中,Ingress 资源被配置为使用名为 tls-secret 的 TLS 密钥来终止 SSL/TLS 连接。tls-secret 应包含 TLS 证书和私钥。

通过利用 Ingress 路由和流量管理功能,你可以简化 Kubernetes 服务的公开,并在集群的入口点应用高级路由和安全策略。

在 Kubernetes 集群中实现 Ingress

在 Kubernetes 集群中实现 Ingress 涉及几个步骤,包括安装 Ingress 控制器、创建 Ingress 资源以及配置相关资源。

安装 Ingress 控制器
Kubernetes 没有提供默认的 Ingress 控制器。你需要安装并配置一个 Ingress 控制器实现,例如 NGINX Ingress 控制器、Traefik 或 Istio Ingress 网关。安装过程因你选择的 Ingress 控制器而异。例如,要在运行 Ubuntu 22.04 的 Kubernetes 集群上安装 NGINX Ingress 控制器,你可以使用以下命令:

## 添加 Ingress 控制器仓库
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/nginx-ingress-controller.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-ingress-controller.gpg]  jammy nginx" | sudo tee /etc/apt/sources.list.d/nginx-ingress-controller.list
sudo apt-get update

## 安装 NGINX Ingress 控制器
sudo apt-get install -y nginx-ingress-controller

创建 Ingress 资源
安装好 Ingress 控制器后,你可以创建 Ingress 资源来定义服务的路由规则。以下是一个 Ingress 配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

此 Ingress 资源根据传入的 URL 路径将流量路由到 api-serviceweb-service

配置相关资源
除了 Ingress 资源外,你可能还需要配置其他 Kubernetes 资源,例如服务(Services)、部署(Deployments)和密钥(Secrets,用于 SSL/TLS 终止),以确保 Ingress 设置正常运行。

排查 Ingress 故障
如果你在 Ingress 实现过程中遇到问题,可以使用以下技术进行排查:

  1. 检查 Ingress 控制器日志,查看是否有任何错误消息或警告。
  2. 验证 Ingress 资源配置,确保路径、服务名称和端口正确。
  3. 确保底层的服务和部署配置正确且可访问。
  4. 检查 Kubernetes 事件,获取有关 Ingress 资源的任何相关信息。
  5. 使用 kubectl describe ingresskubectl get ingress -o yaml 等工具来检查 Ingress 资源及其状态。

通过遵循最佳实践和排查技术,你可以在 Kubernetes 集群中有效地实现 Ingress,以管理对服务的外部访问。

总结

在本教程中,你已经了解了使用 Kubernetes Ingress 的主要好处,包括简化路由、负载均衡、SSL/TLS 终止和集中访问控制。你还了解了如何定义 Ingress 资源来配置路由规则并管理对 Kubernetes 集群内服务的外部访问。通过理解和利用 Kubernetes Ingress,你可以简化应用程序流量的管理并改善整体用户体验。