Kubernetes Ingress-nginx 介绍
Ingress 是 Kubernetes 中的一个 API 对象,它定义了外部流量如何访问集群内部的服务。Ingress-nginx 是一个流行的 Ingress 控制器实现,它基于 Nginx 服务器,提供七层负载均衡、URL 路由、SSL 终止等功能。
Ingress-nginx 功能
-
路由转发:Ingress-nginx 可以根据 Ingress 资源的规则将到达集群的请求路由到相应服务的 Pod 上。
-
SSL/TLS 终止:支持将外部的 HTTPS 流量转变为集群内部的 HTTP 流量,便于安全传输数据。
-
基于域名和路径的路由:可以通过 Ingress 规则轻松实现基于 Host 和 URL 路径的路由策略。
-
会话亲和性(Session Affinity):支持基于客户端 IP 的会话保持,确保同一客户端的后续请求被转发到同一后端 Pod。
-
重写和重定向:可以配置 Ingress 规则来执行 URL 重写和重定向操作。
实战演示:创建 Ingress-nginx 和 Ingress 资源
步骤 1:安装 Ingress-nginx 控制器
首先,确保你已经在 Kubernetes 集群中安装了 Ingress-nginx 控制器。可以通过以下命令使用 Helm 安装:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx
步骤 2:创建示例服务和部署
创建两个 Deployment 和对应的 Service,比如一个是网站 A,另一个是网站 B:
# website-a.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: website-a
spec:
replicas: 1
selector:
matchLabels:
app: website-a
template:
metadata:
labels:
app: website-a
spec:
containers:
- name: website-a
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: website-a
spec:
selector:
app: website-a
ports:
- port: 80
targetPort: 80
# website-b.yaml
# 类似地创建 website-b 的 Deployment 和 Service
执行命令创建这两个服务:
kubectl apply -f website-a.yaml
kubectl apply -f website-b.yaml
步骤 3:创建 Ingress 资源
创建一个 Ingress 资源,配置基于域名的路由规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multihost-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: www.website-a.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: website-a
port:
name: http
- host: www.website-b.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: website-b
port:
name: http
执行命令创建 Ingress:
kubectl apply -f ingress.yaml
现在,如果你已经配置了外部负载均衡器(如云服务商提供的负载均衡器,或 NodePort 服务配合 DNAT 规则),并且 DNS 解析已经设置好,那么通过 www.website-a.com
和 www.website-b.com
就可以访问到各自的网站服务了。注意,对于本地或开发环境,可能还需要额外配置 hosts 文件或者使用 nip.io
等服务来模拟 DNS 解析。