跳转到内容

Kubernetes Ingress

来自代码酷


Kubernetes Ingress 是 Kubernetes 中用于管理外部访问集群内服务的 API 对象,它提供 HTTP/HTTPS 路由规则,允许用户通过统一的入口点访问多个服务。与 Service 不同,Ingress 不直接暴露服务,而是通过配置规则将外部请求路由到集群内的服务。

概述[编辑 | 编辑源代码]

Ingress 的主要功能包括:

  • 提供基于主机名(Host)或路径(Path)的路由规则。
  • 支持 TLS 终止,允许 HTTPS 访问。
  • 充当集群的入口控制器(Ingress Controller),由第三方实现(如 Nginx、Traefik、HAProxy 等)。

核心组件[编辑 | 编辑源代码]

  • Ingress Resource:定义路由规则的 Kubernetes 资源对象。
  • Ingress Controller:实际执行路由规则的组件,通常以 Pod 形式运行在集群中。

工作原理[编辑 | 编辑源代码]

Ingress 通过以下步骤工作: 1. 用户创建 Ingress 资源,定义路由规则。 2. Ingress Controller 监听 Ingress 资源的变化。 3. Ingress Controller 根据规则配置负载均衡器(如 Nginx)。 4. 外部请求到达 Ingress Controller,按照规则路由到对应的 Service。

graph LR A[Client] --> B[Ingress Controller] B --> C{Ingress Rules} C -->|Host: app.example.com| D[Service A] C -->|Host: api.example.com| E[Service B]

配置示例[编辑 | 编辑源代码]

以下是一个基本的 Ingress 资源配置示例:

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

代码解释[编辑 | 编辑源代码]

  • host:定义域名规则,如 `app.example.com`。
  • path:定义路径规则,如 `/web`。
  • backend:指定后端服务(Service)及其端口。

TLS 配置[编辑 | 编辑源代码]

Ingress 支持 HTTPS,需配置 TLS 证书:

spec:
  tls:
  - hosts:
    - app.example.com
    secretName: example-tls
  rules:
  - host: app.example.com
    http:
      paths:
      - backend:
          service:
            name: web-service
            port:
              number: 80

证书需预先存储在 Kubernetes Secret 中:

kubectl create secret tls example-tls --cert=path/to/cert.crt --key=path/to/cert.key

实际案例[编辑 | 编辑源代码]

场景:多服务路由[编辑 | 编辑源代码]

假设一个集群运行以下服务:

  • 前端服务(`web-service:80`)
  • API 服务(`api-service:8080`)

通过 Ingress 配置:

  • 访问 `app.example.com/web` 路由到前端。
  • 访问 `api.example.com/api` 路由到后端 API。

场景:灰度发布[编辑 | 编辑源代码]

使用注解实现流量拆分(Nginx Ingress 示例):

annotations:
  nginx.ingress.kubernetes.io/canary: "true"
  nginx.ingress.kubernetes.io/canary-weight: "20"

将 20% 流量路由到新版本服务。

常见问题[编辑 | 编辑源代码]

Ingress 与 Service 的区别[编辑 | 编辑源代码]

  • Service:提供内部服务发现和负载均衡,可通过 ClusterIP、NodePort 或 LoadBalancer 暴露。
  • Ingress:提供高级路由功能,需配合 Ingress Controller 使用。

支持的 Ingress Controller[编辑 | 编辑源代码]

常见实现包括:

数学表达[编辑 | 编辑源代码]

Ingress 的负载均衡算法(如轮询)可表示为: RequestimodNServicej 其中 N 为后端服务数量。

总结[编辑 | 编辑源代码]

Kubernetes Ingress 是管理外部访问的核心组件,通过路由规则和 TLS 支持简化多服务暴露。实际部署时需选择合适的 Ingress Controller 并注意安全配置(如证书管理)。