如何使用 Kubernetes Ingress 管理外部流量

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程全面介绍了Kubernetes Ingress,这一强大功能可简化服务暴露和管理。你将学习如何配置Ingress注解和设置,以及如何在实际场景中应用Ingress来优化你的Kubernetes基础设施。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/BasicCommandsGroup -.-> kubernetes/annotate("Annotate") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") subgraph Lab Skills kubernetes/get -.-> lab-419312{{"如何使用 Kubernetes Ingress 管理外部流量"}} kubernetes/create -.-> lab-419312{{"如何使用 Kubernetes Ingress 管理外部流量"}} kubernetes/expose -.-> lab-419312{{"如何使用 Kubernetes Ingress 管理外部流量"}} kubernetes/annotate -.-> lab-419312{{"如何使用 Kubernetes Ingress 管理外部流量"}} kubernetes/apply -.-> lab-419312{{"如何使用 Kubernetes Ingress 管理外部流量"}} kubernetes/describe -.-> lab-419312{{"如何使用 Kubernetes Ingress 管理外部流量"}} end

理解 Kubernetes Ingress

Kubernetes Ingress 是一项强大的功能,为你的 Kubernetes 服务提供高级路由和负载均衡能力。它充当网关,管理对内部服务的外部访问,并允许你根据各种标准(如 URL 路径、主机名和 HTTP 标头)配置复杂的路由规则。

在核心层面,Kubernetes 中的 Ingress 资源负责定义管理外部流量如何路由到内部服务的规则。它与 Ingress 控制器协同工作,Ingress 控制器是一个专门的 Kubernetes 组件,用于实现 Ingress 规则并管理底层的负载均衡基础设施。

Kubernetes Ingress 的主要优势之一在于它能够简化服务暴露和管理。你无需将每个单独的服务直接暴露到互联网,而是可以使用 Ingress 通过单个入口点整合和管理所有外部流量。这不仅降低了基础设施的复杂性,还提供了诸如 SSL/TLS 终止、基于 URL 的路由和负载均衡等附加功能。

graph LR A[客户端] --> B[Ingress 控制器] B --> C[服务 1] B --> D[服务 2] B --> E[服务 3]

在你有多个需要暴露到互联网的服务的场景中,或者当你想为应用程序提供统一入口点时,Kubernetes Ingress 会特别有用。通过利用 Ingress,你可以轻松地从单个资源管理和配置路由规则、负载均衡以及 SSL/TLS 终止。

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 资源定义了两条路由规则:一条用于将 /api 路径的流量路由到 api-service,另一条用于将 /web 路径的流量路由到 web-service。这使你能够通过单个 Ingress 入口点暴露多个服务,简化 Kubernetes 应用程序的管理和配置。

配置 Ingress 注解和设置

Kubernetes Ingress 提供了广泛的注解和设置,使你能够自定义和微调 Ingress 资源的行为。这些注解和设置可用于配置 Ingress 的各个方面,如负载均衡、SSL/TLS 终止和路由规则。

Ingress 注解的一个常见用例是配置负载均衡。例如,你可以使用 nginx.ingress.kubernetes.io/load-balance 注解来指定负载均衡算法,如 round-robin(轮询)或 least-conn(最少连接):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/load-balance: round-robin
spec:
  #...

另一个有用的注解是 nginx.ingress.kubernetes.io/ssl-redirect,可用于自动将 HTTP 流量重定向到 HTTPS:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  #...

Ingress 还支持使用 TLS/SSL 证书。你可以使用 Ingress 规范中的 tls 字段配置 Ingress 来终止 SSL/TLS 流量:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  tls:
    - hosts:
        - example.com
      secretName: tls-secret
  #...

在上面的示例中,Ingress 被配置为使用存储在 tls-secret Kubernetes 密钥中的 TLS 密钥来终止 example.com 主机的 SSL/TLS 流量。

Ingress 还提供了许多其他注解和设置,例如:

注解 描述
nginx.ingress.kubernetes.io/rewrite-target 在将请求转发到后端服务之前重写 URL 路径
nginx.ingress.kubernetes.io/force-ssl-redirect 将所有 HTTP 流量重定向到 HTTPS
nginx.ingress.kubernetes.io/proxy-body-size 设置客户端请求体的最大大小

通过利用这些注解和设置,你可以创建高度定制化和复杂的 Ingress 配置,以满足 Kubernetes 应用程序的特定要求。

在实际场景中应用 Ingress

Kubernetes Ingress 可应用于广泛的实际场景,有助于简化服务管理并提升整体用户体验。让我们探讨一些 Ingress 在实际中如何发挥作用的示例。

多租户应用部署

在多租户环境中,多个应用程序或团队共享同一个 Kubernetes 集群,Ingress 可用于提供统一的入口点和路由机制。通过基于主机名或 URL 路径配置 Ingress 规则,你可以将流量路由到相应的服务,确保每个租户的应用程序相互隔离且安全。

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

蓝绿部署

Ingress 还可用于促进蓝绿部署,这是一种以最少停机时间推出应用更新的流行策略。通过配置 Ingress 根据特定标准(如 HTTP 标头、URL 参数)将流量路由到不同的服务版本,你可以在不中断用户访问的情况下无缝切换应用程序的旧版本和新版本。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: blue-green-ingress
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: blue-service
                port:
                  number: 80
            ## 使用自定义标头将流量路由到 “绿色” 版本
            nginx.ingress.kubernetes.io/service-match: 'green: header("X-Version", "green")'
          - path: /
            pathType: Prefix
            backend:
              service:
                name: green-service
                port:
                  number: 80
            nginx.ingress.kubernetes.io/service-match: 'blue: header("X-Version", "blue")'

金丝雀部署

Ingress 也可用于金丝雀部署,这一策略允许你在向整个用户群体推出更改之前,先逐步向一小部分用户推出更改。通过配置 Ingress 将一定百分比的流量路由到应用程序的新版本,你可以在完全提交更新之前监控其性能和用户反馈。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: canary-ingress
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: stable-service
                port:
                  number: 80
            ## 将 10% 的流量路由到金丝雀版本
            nginx.ingress.kubernetes.io/canary: "true"
            nginx.ingress.kubernetes.io/canary-weight: "10"
          - path: /
            pathType: Prefix
            backend:
              service:
                name: canary-service
                port:
                  number: 80
            nginx.ingress.kubernetes.io/canary: "true"

这些只是 Kubernetes Ingress 在实际场景中应用的几个示例。通过利用 Ingress 提供的灵活性和定制选项,你可以创建复杂的路由和流量管理解决方案,以满足基于 Kubernetes 的应用程序的独特需求。

总结

Kubernetes Ingress 是一个关键组件,可为你的服务实现高级路由和负载均衡。通过利用 Ingress,你可以通过单个入口点整合和管理所有外部流量,简化你的基础设施,并提供诸如 SSL/TLS 终止、基于 URL 的路由和负载均衡等附加功能。本教程为你提供了配置 Ingress 注解和设置的知识,以及在各种实际场景中应用 Ingress 的能力,使你能够优化 Kubernetes 应用程序的性能和安全性。