【K8S】在 Kubernetes 上配置安装 Nginx Ingress 控制器指南_ingress 怎么配置
文章目录
-
-
- 架构概览
- 先决条件
- 部署方案选择
-
- 方案一:手动 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-nginxcd nginx-ingress-controller/manifestskubectl apply -f .
核心组件详解
- 准入控制器(ValidatingWebhook)
防止错误Ingress配置破坏集群,工作流程:
- 拦截Ingress创建请求
- API服务器转发配置到Webhook服务
- Nginx控制器验证配置(8443端口)
- 返回验证结果
-
证书生成Job
使用kube-webhook-certgen自动生成CA证书:apiVersion: batch/v1kind: Jobmetadata: name: ingress-nginx-admission-create namespace: ingress-nginxspec: 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-controller image: registry.k8s.io/ingress-nginx/controller:v1.9.5 ports: - 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/app1http://www.example.com/app2/api
方案B:通配符映射(推荐)
*.apps.example.com --> LoadBalancer IP
实现动态路由:
http://demo1.apps.example.comhttp://grafana.apps.example.com
应用实战:部署示例服务
-
创建示例应用
# hello-app.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: hello-app namespace: devspec: replicas: 2 template: containers: - name: hello image: \"gcr.io/google-samples/hello-app:2.0\"
-
创建ClusterIP服务
# hello-service.yamlkind: Servicemetadata: name: hello-service namespace: devspec: ports: [{ port: 80, targetPort: 8080 }] selector: { app: hello }
-
配置Ingress路由规则
# ingress.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: demo-ingress namespace: devspec: ingressClassName: nginx rules: - host: \"demo.apps.yourdomain.com\" http: paths: - path: / backend: service: name: hello-service port: { number: 80 }
-
访问测试:
最佳实践总结
- 生产环境建议:使用Helm部署并启用ValidatingWebhook
- DNS配置:通配符域名简化路由管理
- 安全加固:
- 限制Controller权限(RBAC)
- 定期轮转Webhook证书
- 性能优化:通过ConfigMap调整Nginx参数
# 示例:调优keepalive连接apiVersion: v1kind: ConfigMapmetadata: name: nginx-config namespace: ingress-nginxdata: keep-alive: \"75\" keep-alive-requests: \"100\"
完整配置参考 Nginx Ingress官方文档