如何管理 Kubernetes 入口路由和负载均衡

KubernetesKubernetesBeginner
立即练习

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

简介

本教程将引导你了解 Kubernetes Ingress 的基本原理,实现高级 Ingress 路由,并在生产环境中部署和管理 Ingress。Kubernetes Ingress 是一项强大的功能,它简化了 Kubernetes 集群中外部流量到服务的管理和路由,充当第 7 层负载均衡器,并支持基于名称的虚拟主机、基于路径的路由、SSL/TLS 终止和负载均衡等功能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/CoreConceptsGroup(["Core Concepts"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/CoreConceptsGroup -.-> kubernetes/architecture("Architecture") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/create -.-> lab-419317{{"如何管理 Kubernetes 入口路由和负载均衡"}} kubernetes/expose -.-> lab-419317{{"如何管理 Kubernetes 入口路由和负载均衡"}} kubernetes/apply -.-> lab-419317{{"如何管理 Kubernetes 入口路由和负载均衡"}} kubernetes/architecture -.-> lab-419317{{"如何管理 Kubernetes 入口路由和负载均衡"}} kubernetes/describe -.-> lab-419317{{"如何管理 Kubernetes 入口路由和负载均衡"}} kubernetes/config -.-> lab-419317{{"如何管理 Kubernetes 入口路由和负载均衡"}} end

理解 Kubernetes Ingress 基础

Kubernetes Ingress 是一项强大的功能,它简化了 Kubernetes 集群中外部流量到服务的管理和路由。它充当第 7 层负载均衡器,使你能够配置高级路由规则、SSL/TLS 终止和基于名称的虚拟主机。

什么是 Kubernetes Ingress?

Kubernetes Ingress 是一个 API 对象,用于定义将外部 HTTP(S) 流量路由到 Kubernetes 集群中服务的规则。它提供了一种灵活且可扩展的方式来管理传入流量,支持以下功能:

  • 基于名称的虚拟主机:根据请求的主机名将流量路由到不同的服务。
  • 基于路径的路由:根据请求的 URL 路径将流量路由到不同的服务。
  • SSL/TLS 终止:在 Ingress 级别终止 SSL/TLS 连接,简化服务配置。
  • 负载均衡:将传入流量分布到服务的多个实例上。

Ingress 组件

Kubernetes Ingress 涉及的主要组件有:

  1. Ingress 资源:定义传入流量的路由规则和配置。
  2. Ingress 控制器:负责实现 Ingress 规则并管理流量的负载均衡。
  3. 服务:Ingress 将流量路由到的 Kubernetes 服务。
graph LR Client --> Ingress Ingress --> Service Service --> Pods

Ingress 配置

Ingress 资源使用 YAML 清单进行定义。以下是一个 Ingress 配置示例:

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

此 Ingress 配置将来自 example.com 的流量路由到端口 80 上的 web-service Kubernetes 服务。

Kubernetes Ingress 的优势

使用 Kubernetes Ingress 有以下几个优势:

  • 简化流量管理:Ingress 允许你通过单个入口点管理所有传入流量,简化集群内的整体流量管理。
  • 高级路由功能:Ingress 支持基于名称的虚拟主机、基于路径的路由和 SSL/TLS 终止等功能,实现更复杂的路由场景。
  • 可扩展性和高可用性:Ingress 控制器可以扩展并实现高可用性,确保你的流量能够处理增加的负载并保持弹性。
  • 集中式配置:Ingress 资源以声明方式定义,使你能够以版本控制和一致的方式管理流量路由配置。

实现高级 Ingress 路由

虽然基本的 Ingress 配置涵盖了许多常见用例,但 Kubernetes Ingress 还支持更高级的路由功能,以处理复杂的流量管理场景。这些功能使你能够创建复杂的路由规则,并增强 Ingress 设置的灵活性。

基于路径的路由

Ingress 支持基于路径的路由,这使你能够根据请求的 URL 路径将流量路由到不同的服务。当你的集群中有多个服务运行,并且希望通过单个 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: /static
            pathType: Prefix
            backend:
              service:
                name: static-service
                port:
                  number: 80

在此示例中,Ingress 将对 /api 的请求路由到 api-service,将对 /static 的请求路由到 static-service

基于主机的路由

Ingress 还支持基于主机的路由,这使你能够根据请求的主机名将流量路由到不同的服务。当你希望通过单个 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: www.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

在此示例中,Ingress 将对 api.example.com 的请求路由到 api-service,将对 www.example.com 的请求路由到 web-service

SSL/TLS 终止

Ingress 可以处理 SSL/TLS 终止,简化你的服务配置。你可以指定包含 SSL/TLS 证书和密钥的 TLS 机密,Ingress 将处理流量的加密和解密。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
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 机密来终止 SSL/TLS 连接。

通过实现这些高级 Ingress 路由功能,你可以在 Kubernetes 集群中创建更复杂的流量管理解决方案,处理复杂的路由场景,并增强应用程序部署的整体灵活性。

在生产环境中部署和管理 Ingress

在生产环境中部署和管理 Ingress 需要仔细规划和考量,以确保 Kubernetes 集群内流量路由的可靠性、可扩展性和安全性。本节将介绍在生产环境中部署和管理 Ingress 的关键要点。

Ingress 控制器安装

在生产环境中部署 Ingress 的第一步是安装 Ingress 控制器。Kubernetes 没有提供内置的 Ingress 控制器,因此你需要选择并安装第三方 Ingress 控制器。一些流行的选项包括:

  • NGINX Ingress 控制器
  • Traefik Ingress 控制器
  • HAProxy Ingress 控制器
  • Istio Ingress 网关

这些 Ingress 控制器的安装过程各不相同,但通常包括创建一个运行 Ingress 控制器 Pod 的 Kubernetes 部署或守护进程集资源。

Ingress 部署最佳实践

在生产环境中部署 Ingress 时,请考虑以下最佳实践:

  1. 高可用性:通过运行多个副本并将它们分布在不同的节点或可用区来确保 Ingress 控制器具有高可用性。
  2. 资源请求和限制:为 Ingress 控制器 Pod 设置适当的资源请求和限制,以确保它们拥有处理预期流量负载所需的 CPU 和内存资源。
  3. 监控和可观测性:实施监控和可观测性解决方案,以跟踪 Ingress 控制器及其处理的流量的健康状况和性能。
  4. 日志记录和故障排除:为 Ingress 控制器配置日志记录和错误报告,以帮助进行故障排除和问题解决。
  5. Ingress 资源验证:对 Ingress 资源定义实施验证检查,以确保它们配置正确并避免潜在问题。

Ingress 监控和故障排除

监控和排查 Ingress 部署对于维护可靠且响应迅速的流量路由系统至关重要。考虑以下方法:

  1. 指标和仪表板:使用 Prometheus 和 Grafana 等工具收集并可视化与 Ingress 相关的指标,如请求量、响应时间和错误率。
  2. 日志记录和日志分析:确保 Ingress 控制器日志配置正确,并与集中式日志记录解决方案(如 Elasticsearch 或 Fluentd)集成,以帮助进行故障排除。
  3. Ingress 控制器调试:利用 Ingress 控制器的内置调试功能,如 NGINX Ingress 控制器的 nginx-debug 模式,来调查问题并收集更详细的信息。
  4. Ingress 资源验证:定期验证 Ingress 资源定义,以确保它们配置正确且是最新的。

通过遵循这些最佳实践并实施强大的监控和故障排除策略,你可以确保生产环境中的 Ingress 部署可靠、可扩展且易于管理。

总结

在本全面教程中,你将学习如何利用 Kubernetes Ingress 的强大功能来管理外部流量并将其路由到你的服务。你将探索 Ingress 的核心组件,了解配置过程,并实现高级路由技术。最后,你将发现生产环境中部署和管理 Ingress 的最佳实践,确保基于 Kubernetes 的应用程序的可靠性和可扩展性。