文章目錄
- 架構概覽
- 先決條件
- 部署方案選擇
- 方案一:手動 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官方文檔