在Kubernetes(k8s)中,Nginx Ingress是一个重要的组件,下面将从概念、工作原理、部署和配置等方面详细介绍。
https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx
概念
- Ingress:Ingress是Kubernetes中的一种API对象,用于管理集群外部对集群内部服务的访问规则。它定义了一系列规则,这些规则允许外部HTTP和HTTPS流量访问集群内的服务,从而实现了基于域名、路径等条件的路由。
- Nginx Ingress:Nginx Ingress是基于Nginx服务器实现的Ingress控制器。它根据Ingress资源的配置动态生成Nginx的配置文件,并重新加载Nginx服务,以实现HTTP和HTTPS流量的路由和负载均衡。
工作原理
- Ingress资源定义:用户通过创建Ingress资源对象,定义外部访问的规则,例如基于域名的路由规则(如
example.com
指向某个服务)、基于路径的路由规则(如/api
指向另一个服务)等。 - Nginx Ingress控制器监听:Nginx Ingress控制器会持续监听Kubernetes API Server,实时获取Ingress资源的变化。
- 配置生成与更新:当Ingress资源发生变化时,Nginx Ingress控制器会根据新的规则动态生成Nginx的配置文件(通常是
nginx.conf
)。 - Nginx重新加载:生成新的配置文件后,Nginx Ingress控制器会触发Nginx服务重新加载配置,使新的路由规则生效。
- 流量路由:外部流量通过Nginx Ingress控制器进入集群,Nginx根据配置好的规则将流量路由到对应的后端服务。
部署Nginx Ingress控制器
以下是使用Helm部署Nginx Ingress控制器的示例步骤:
- 添加Helm仓库:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
- 创建命名空间(可选):
kubectl create namespace ingress-nginx
- 部署Nginx Ingress控制器:
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.replicaCount=2 # 设置控制器副本数
配置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: /service1(/|$)(.*)
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /service2(/|$)(.*)
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
配置解释
metadata
:包含Ingress资源的名称和注解。注解可以用于配置Nginx的特定行为,如nginx.ingress.kubernetes.io/rewrite-target
用于重写URL路径。spec.rules
:定义了路由规则。可以根据host
字段指定域名,根据path
字段指定路径,将流量路由到对应的后端服务。backend
:指定了后端服务的名称和端口。
验证配置
部署完Nginx Ingress控制器和配置好Ingress资源后,可以通过以下方式验证配置是否生效:
- 检查Ingress资源状态:
kubectl get ingress example-ingress
- 访问服务:在本地的
hosts
文件中添加域名解析,将example.com
指向Nginx Ingress控制器的外部IP地址,然后在浏览器中访问http://example.com/service1
和http://example.com/service2
,验证是否能够正确访问对应的服务。
通过以上步骤,你可以在Kubernetes集群中部署和配置Nginx Ingress,实现外部流量的路由和负载均衡。