如何配置 Kubernetes 入口以实现高级路由

KubernetesKubernetesBeginner
立即练习

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

简介

本全面教程将探讨 Kubernetes 入口(Ingress),为开发者和系统管理员提供有关管理外部网络访问的深入见解。通过研究核心概念、配置策略和实际实现技术,读者将全面了解如何在 Kubernetes 集群中有效地控制和路由流量。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/proxy("Proxy") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("Label") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/get -.-> lab-392839{{"如何配置 Kubernetes 入口以实现高级路由"}} kubernetes/describe -.-> lab-392839{{"如何配置 Kubernetes 入口以实现高级路由"}} kubernetes/proxy -.-> lab-392839{{"如何配置 Kubernetes 入口以实现高级路由"}} kubernetes/label -.-> lab-392839{{"如何配置 Kubernetes 入口以实现高级路由"}} kubernetes/config -.-> lab-392839{{"如何配置 Kubernetes 入口以实现高级路由"}} end

入口(Ingress)基础

什么是Kubernetes入口(Ingress)?

Kubernetes入口(Ingress)是一个强大的网络路由资源,用于管理对Kubernetes集群内服务的外部访问。与传统的负载均衡器或节点端口(NodePort)服务不同,入口(Ingress)为暴露HTTP和HTTPS服务提供了一种更灵活、更复杂的机制。

入口(Ingress)的核心概念

入口(Ingress)支持复杂的路由规则、SSL终止和基于名称的虚拟主机。它充当外部流量的入口点,允许对服务的暴露和访问方式进行精确控制。

graph LR A[外部流量] --> B[入口控制器] B --> C{路由规则} C --> D[服务1] C --> E[服务2]

入口(Ingress)组件

组件 描述
入口资源 定义路由规则的Kubernetes对象
入口控制器 实现实际的路由逻辑
主机规则 定义基于域名的路由
路径规则 指定基于URL路径的路由

实际示例:入口(Ingress)配置

以下是Ubuntu 22.04的基本入口(Ingress)配置:

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

关键特性

入口(Ingress)为网络路由提供了几个优点:

  • 集中式流量管理
  • 高级路由功能
  • SSL/TLS终止
  • 经济高效的服务暴露
  • 简化的外部访问配置

入口(Ingress)配置

定义入口(Ingress)规则

入口(Ingress)配置涉及创建精确的路由规则,以控制外部流量如何导向Kubernetes服务。配置过程需要理解关键参数并使用特定的kubectl命令。

入口(Ingress)规则结构

graph TD A[入口资源] --> B[主机规则] A --> C[路径规则] A --> D[后端服务]

配置参数

参数 描述 示例
主机(Host) 域名路由 myapp.example.com
路径(Path) URL路径匹配 /api, /web
后端服务(Backend Service) 目标Kubernetes服务 web-service
路径类型(Path Type) 匹配策略 前缀(Prefix)、精确(Exact)

完整的入口(Ingress)配置示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: complex-routing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: services.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 8080
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

Kubectl配置命令

部署入口(Ingress)配置需要特定的kubectl命令:

## 创建入口资源
kubectl apply -f ingress.yaml

## 列出入口资源
kubectl get ingress

## 描述入口配置
kubectl describe ingress complex-routing

流量管理策略

入口(Ingress)通过以下方式实现复杂的流量路由:

  • 支持多个后端服务
  • 实现基于路径的路由
  • 启用基于主机的虚拟主机
  • 提供灵活的服务映射

高级入口(Ingress)技术

SSL终止和TLS配置

SSL终止是保障Kubernetes服务通信安全的一项关键技术。通过在入口(Ingress)资源中直接配置TLS证书,你可以集中管理加密。

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

负载均衡策略

graph LR A[入口控制器] --> B{负载均衡} B --> C[服务1] B --> D[服务2] B --> E[服务3]

高级路由技术

技术 描述 用例
金丝雀部署(Canary Deployment) 流量分割 渐进式推出
基于头部的路由(Header-based Routing) 自定义请求路由 A/B测试
基于权重的分配(Weight-based Distribution) 按百分比分配流量 可控推出

入口(Ingress)故障排除命令

## 检查入口控制器日志
kubectl logs -n ingress-nginx ingress-nginx-controller-xxx

## 验证入口资源配置
kubectl describe ingress my-ingress

## 检查服务端点
kubectl get endpoints

复杂路由配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
spec:
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: new-version
                port:
                  number: 80

Kubernetes网络注意事项

高级入口(Ingress)技术关注于:

  • 安全的流量管理
  • 灵活的路由能力
  • 高效的服务暴露
  • 精细的流量控制机制

总结

Kubernetes入口(Ingress)是一种用于管理外部服务访问的复杂方法,它提供了灵活的路由功能、集中式流量控制和增强的网络配置。通过掌握入口(Ingress)资源、控制器和配置技术,专业人员可以利用精确的网络路由策略创建更具弹性、可扩展性且管理高效的Kubernetes部署。