文章目录
- 架构概览
- 先决条件
- 部署方案选择
- 方案一:手动 YAML 部署
- 核心组件详解
- 方案二:Helm快速部署(生产推荐)
- 验证部署
- DNS配置策略
- 方案A:单域名映射
- 方案B:通配符映射(推荐)
- 应用实战:部署示例服务
- 最佳实践总结
本文将指导您通过两种方式部署 Kubernetes 社区版 Nginx Ingress 控制器,并配置DNS实现流量路由。目前存在两种 Nginx Ingress 控制器:
- Kubernetes社区版
- Nginx Inc开发版
配置文件 Nginx Ingress k8s 配置
架构概览
下图展示了 Nginx Ingress 控制器在 Kubernetes 中的核心架构:
先决条件
- 运行中的Kubernetes集群
- 已安装并认证的kubectl
- 集群管理员权限
- 指向Ingress控制器负载均衡器IP的有效域名(可选)
部署方案选择
方案一:手动 YAML 部署
下载 Nginx Ingress k8s 配置
分步部署以下关键组件:
kubectl create ns ingress-nginx
cd nginx-ingress-controller/manifests
kubectl apply -f .
核心组件详解
- 准入控制器(ValidatingWebhook)
防止错误Ingress配置破坏集群,工作流程:
- 拦截Ingress创建请求
- API服务器转发配置到Webhook服务
- Nginx控制器验证配置(8443端口)
- 返回验证结果
-
证书生成Job
使用kube-webhook-certgen自动生成CA证书:apiVersion: batch/v1 kind: Job metadata:name: ingress-nginx-admission-createnamespace: ingress-nginx spec:template:spec:containers:- args: [create, --host=ingress-nginx-controller-admission,...]image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
-
Controller核心部署
Deployment关键配置:containers: - args:- /nginx-ingress-controller- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controllerimage: registry.k8s.io/ingress-nginx/controller:v1.9.5ports:- containerPort: 80 # HTTP- containerPort: 443 # HTTPS- containerPort: 8443 # Webhook
方案二:Helm快速部署(生产推荐)
helm upgrade --install ingress-nginx ingress-nginx \--repo https://kubernetes.github.io/ingress-nginx \--namespace ingress-nginx --create-namespace
验证部署
- 获取负载均衡器IP:
kubectl -n ingress-nginx get svc ingress-nginx-controller
- 测试默认后端(应返回404):
curl YOUR_LOADBALANCER_IP
- 健康检查(应返回200):
curl YOUR_LOADBALANCER_IP/healthz
Kubernetes 使用 Ingress-Nginx 基于 Cookie 实现会话保持的负载均衡
DNS配置策略
方案A:单域名映射
www.example.com --> LoadBalancer IP
适用路径路由:
http://www.example.com/app1
http://www.example.com/app2/api
方案B:通配符映射(推荐)
*.apps.example.com --> LoadBalancer IP
实现动态路由:
http://demo1.apps.example.com
http://grafana.apps.example.com
应用实战:部署示例服务
-
创建示例应用
# hello-app.yaml apiVersion: apps/v1 kind: Deployment metadata:name: hello-appnamespace: dev spec:replicas: 2template:containers:- name: helloimage: "gcr.io/google-samples/hello-app:2.0"
-
创建ClusterIP服务
# hello-service.yaml kind: Service metadata:name: hello-servicenamespace: dev spec:ports: [{ port: 80, targetPort: 8080 }]selector: { app: hello }
-
配置Ingress路由规则
# ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: demo-ingressnamespace: dev spec:ingressClassName: nginxrules:- host: "demo.apps.yourdomain.com"http:paths:- path: /backend:service:name: hello-serviceport: { number: 80 }
-
访问测试:
最佳实践总结
- 生产环境建议:使用Helm部署并启用ValidatingWebhook
- DNS配置:通配符域名简化路由管理
- 安全加固:
- 限制Controller权限(RBAC)
- 定期轮转Webhook证书
- 性能优化:通过ConfigMap调整Nginx参数
# 示例:调优keepalive连接 apiVersion: v1 kind: ConfigMap metadata:name: nginx-confignamespace: ingress-nginx data:keep-alive: "75"keep-alive-requests: "100"
完整配置参考 Nginx Ingress官方文档