ingress-nginx:Kubernetes集群的流量入口控制器

2025-05-20 08:30:10

随着微服务架构的广泛应用,Kubernetes已成为容器编排的事实标准。在Kubernetes集群中,服务通常以Pod的形式运行,并且可能有多个实例以实现高可用性和负载均衡。为了让外部用户能够访问这些服务,需要一种机制来管理和路由流量。这正是ingress-nginx发挥作用的地方。它作为Kubernetes集群的"大门",负责接收所有外部流量,并根据预设的规则将其转发到对应的服务,大大简化了集群的网络配置和管理。

一、ingress-nginx的安装与配置

1.1 安装前的准备工作

在安装ingress-nginx之前,需要确保Kubernetes集群满足以下条件:

  • 集群版本需支持Ingress API,一般要求Kubernetes版本在1.19及以上
  • 具备足够的资源,包括CPU、内存等,以运行ingress-nginx控制器
  • 熟悉基本的Kubernetes概念和操作,如Pod、Service、Deployment等

同时,需要确定安装方式。ingress-nginx支持多种安装方式,包括使用Helm、直接使用YAML文件以及在特定云平台上使用托管服务等。

1.2 使用Helm安装ingress-nginx

Helm是Kubernetes的包管理工具,使用Helm安装ingress-nginx是一种较为便捷的方式。首先,需要添加ingress-nginx的Helm仓库:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

然后,创建一个命名空间用于部署ingress-nginx:

kubectl create namespace ingress-nginx

接下来,可以使用以下命令安装ingress-nginx:

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.replicaCount=2 \
  --set controller.nodeSelector."kubernetes\.io/os"=linux \
  --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux

在上述命令中,设置了controller.replicaCount=2以创建两个控制器副本,提高可用性。还设置了节点选择器,确保控制器和默认后端都运行在Linux节点上。

1.3 使用YAML文件安装

如果不想使用Helm,也可以直接使用YAML文件进行安装。首先,从官方仓库获取最新的安装清单:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

这将创建ingress-nginx所需的所有资源,包括命名空间、服务账户、RBAC规则、Deployment和Service等。

1.4 配置ingress-nginx

安装完成后,可能需要根据实际需求对ingress-nginx进行配置。配置主要通过ConfigMap、Annotations和命令行参数等方式实现。

例如,可以通过修改ConfigMap来调整Nginx的一些参数。首先,获取当前的ConfigMap:

kubectl edit configmap ingress-nginx-controller -n ingress-nginx

然后,在ConfigMap中添加或修改所需的配置项。例如,设置客户端最大请求体大小:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  client-max-body-size: "100m"

还可以通过Annotations为特定的Ingress资源配置特定的行为。例如,为某个Ingress资源配置重写规则:

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

二、ingress-nginx的核心功能与架构

2.1 核心功能

ingress-nginx提供了丰富的功能,使其成为Kubernetes集群中流量管理的理想选择:

  1. 基于域名的虚拟主机:ingress-nginx支持基于域名的虚拟主机,允许在同一个IP地址上托管多个域名的服务。例如,可以配置example.comtest.com两个域名指向不同的后端服务。

  2. 基于路径的流量分发:可以根据请求的URL路径将流量分发到不同的服务。例如,将/api路径的请求转发到API服务,将/web路径的请求转发到Web服务。

  3. 负载均衡:ingress-nginx内置了负载均衡功能,能够将流量均匀地分发到后端服务的多个实例,提高服务的可用性和性能。

  4. SSL/TLS终止:支持SSL/TLS证书的配置,实现HTTPS访问。可以将SSL/TLS连接在ingress-nginx处终止,然后以明文形式将请求转发到后端服务。

  5. 会话保持:通过配置会话保持功能,可以确保来自同一个客户端的请求始终被路由到同一个后端服务实例,这对于需要维护会话状态的应用特别有用。

  6. 限流:可以对特定的服务或路径进行流量限制,防止服务被过量的请求压垮,保护服务的稳定性。

2.2 架构组成

ingress-nginx的架构主要由以下几个部分组成:

  1. Controller组件:这是ingress-nginx的核心组件,负责监控Kubernetes API服务器,获取Ingress资源的配置信息,并根据这些信息动态更新Nginx的配置。Controller组件以Deployment的形式运行在Kubernetes集群中。

  2. Nginx服务器:Controller组件会生成Nginx的配置文件,并启动Nginx服务器。Nginx服务器实际承担流量的接收、处理和转发工作。

  3. Default Backend:当请求无法匹配到任何定义的Ingress规则时,流量会被转发到默认后端服务。默认后端通常是一个简单的Web服务器,返回404错误页面。

  4. ConfigMap:用于存储ingress-nginx的全局配置信息,如Nginx的参数设置、自定义配置等。

  5. Service:ingress-nginx通过Service暴露给外部网络。根据不同的环境和需求,可以选择使用LoadBalancer类型的Service(在支持负载均衡器的云平台上)或NodePort类型的Service。

2.3 工作原理

ingress-nginx的工作原理可以概括为以下几个步骤:

  1. 配置监控:Controller组件持续监控Kubernetes API服务器,监听Ingress、Service、Endpoint等资源的变化。

  2. 配置生成:当发现配置变化时,Controller组件根据Ingress资源的定义生成对应的Nginx配置文件。

  3. 配置应用:Controller组件将生成的配置文件应用到Nginx服务器,并触发Nginx的重新加载,使配置生效。

  4. 流量转发:Nginx服务器根据配置接收外部流量,并根据规则将流量转发到对应的后端服务。

  5. 健康检查:ingress-nginx会定期检查后端服务的健康状态,当发现服务不可用时,会自动将流量从故障服务实例上转移,确保服务的可用性。

三、ingress-nginx的使用方法

3.1 创建基本的Ingress资源

使用ingress-nginx的第一步是创建Ingress资源。下面是一个基本的Ingress资源示例:

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

这个Ingress资源配置了将所有访问example.com的请求转发到名为web-service的服务的80端口。

3.2 配置基于路径的路由

可以创建更复杂的Ingress资源,实现基于路径的路由。例如:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-based-ingress
spec:
  rules:
    - host: 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

这个配置将example.com/api路径的请求转发到api-service服务,将example.com/web路径的请求转发到web-service服务。

3.3 配置SSL/TLS

为了启用HTTPS访问,需要配置SSL/TLS证书。首先,创建一个Secret来存储证书和私钥:

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

然后,在Ingress资源中引用这个Secret:

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

3.4 配置负载均衡策略

ingress-nginx支持多种负载均衡策略,可以通过Annotations进行配置。例如,配置为IP哈希策略:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: lb-policy-ingress
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "ip_hash"
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

常见的负载均衡策略包括round-robin(轮询)、ip_hash(IP哈希)和least_conn(最少连接)等。

3.5 配置重写规则

有时候需要对请求的URL进行重写,可以通过Annotations配置重写规则。例如:

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

这个配置会将example.com/app/foo的请求重写为/foo后转发到app-service服务。

四、总结

ingress-nginx作为Kubernetes集群的流量入口控制器,为集群提供了强大而灵活的流量管理能力。通过本文的介绍,我们了解了ingress-nginx的安装配置方法,包括使用Helm和YAML文件两种方式;深入剖析了其核心功能和架构,包括基于域名和路径的流量分发、负载均衡、SSL/TLS终止等;详细讲解了使用方法,包括创建基本的Ingress资源、配置基于路径的路由、启用SSL/TLS、设置负载均衡策略和重写规则等。掌握ingress-nginx的使用,对于构建高效、稳定的Kubernetes应用系统至关重要。通过合理配置和使用ingress-nginx,可以实现集群内外流量的有效管理,提高应用的可用性和性能。

kubernetes
ingress-nginx 是 Kubernetes 的入口控制器,它使用 NGINX 作为反向代理和负载均衡器。
Go
Apache-2.0
18.6 k