# Nginx Ingress怎么部署
## 前言
在現代云原生架構中,Ingress作為Kubernetes集群的流量入口網關,承擔著路由分發、負載均衡和TLS終止等重要功能。Nginx Ingress Controller作為最流行的Ingress實現方案之一,憑借其高性能、易擴展和豐富的功能特性,成為眾多企業的首選方案。本文將全面介紹Nginx Ingress的部署方法,涵蓋從基礎部署到高級配置的全流程。
## 一、部署前準備
### 1.1 環境要求
- Kubernetes集群(版本1.16+)
- kubectl命令行工具
- Helm(推薦3.0+版本)
- 集群管理員權限
### 1.2 網絡規劃建議
| 資源類型 | 建議配置 | 說明 |
|----------------|-------------------------|--------------------------|
| NodePort范圍 | 30000-32767 | 確保端口未被占用 |
| 外部IP | 預留2個以上靜態IP | 用于LoadBalancer類型服務 |
| DNS域名 | 提前準備通配符域名 | 如*.example.com |
### 1.3 命名空間創建
建議為Ingress Controller創建獨立命名空間:
```bash
kubectl create namespace ingress-nginx
官方提供的標準部署方式:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
部署完成后驗證:
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=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 \
--namespace ingress-nginx \
--set controller.replicaCount=2
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.service.type=LoadBalancer \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb"
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"="true"
關鍵配置參數示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
data:
# 連接超時時間
proxy-connect-timeout: "30"
# 請求體大小限制
proxy-body-size: "20m"
# 啟用gzip壓縮
gzip: "on"
# 自定義日志格式
log-format-upstream: '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'
常用Ingress注解示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
# 啟用CORS
nginx.ingress.kubernetes.io/enable-cors: "true"
# 重寫路徑
nginx.ingress.kubernetes.io/rewrite-target: /$2
# 認證配置
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
# 限速配置
nginx.ingress.kubernetes.io/limit-rpm: "100"
spec:
rules:
- host: example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
helm install ingress-nginx-dev ingress-nginx/ingress-nginx \
--namespace ingress-nginx-dev \
--set controller.scope.enabled=true \
--set controller.scope.namespace="dev-ns"
# 控制器啟動參數添加
- --controller-class=k8s.io/internal-ingress-nginx
- --ingress-class=internal
通過Canary Annotation實現流量切分:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-demo
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
rules:
- host: demo.example.com
http:
paths:
- backend:
service:
name: canary-service
port:
number: 80
創建自定義模板ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-template
namespace: ingress-nginx
data:
proxy-template.conf: |
# 自定義proxy配置
proxy_set_header My-Custom-Header "value";
proxy_connect_timeout {{ .cfg.ProxyConnectTimeout }};
Helm中引用模板:
--set controller.extraVolumeMounts[0].name=nginx-template \
--set controller.extraVolumeMounts[0].mountPath=/etc/nginx/template \
--set controller.extraVolumes[0].name=nginx-template \
--set controller.extraVolumes[0].configMap.name=nginx-template
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
Prometheus監控配置示例:
--set controller.metrics.enabled=true \
--set controller.metrics.serviceMonitor.enabled=true \
--set controller.metrics.serviceMonitor.additionalLabels.release="prometheus"
推薦配置:
controller:
logFormat: json
extraArgs:
access-log-path: /var/log/nginx/access.log
error-log-path: /var/log/nginx/error.log
extraVolumeMounts:
- name: varlog
mountPath: /var/log/nginx
獲取詳細配置信息:
kubectl exec -n ingress-nginx <pod-name> -- nginx -T
檢查事件日志:
kubectl describe ingress <ingress-name>
kubectl logs -n ingress-nginx <pod-name>
可能原因: - 后端服務未就緒 - Endpoints選擇器不匹配
檢查命令:
kubectl get endpoints <service-name>
解決方案:
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: ingress-nginx-policy
namespace: ingress-nginx
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-demo
spec:
tls:
- hosts:
- demo.example.com
secretName: tls-secret
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
本文詳細介紹了Nginx Ingress Controller的多種部署方式和配置技巧。在實際生產環境中,建議根據具體業務需求選擇合適的部署方案,并持續關注以下方面:
通過合理配置和持續優化,Nginx Ingress能夠為您的Kubernetes集群提供穩定高效的流量管理服務。 “`
這篇文章包含了約4050字,采用Markdown格式編寫,涵蓋了Nginx Ingress部署的完整流程,包括: - 環境準備和前置條件 - 基礎部署方法(Manifest/Helm) - 核心配置詳解 - 高級部署方案 - 運維監控指南 - 常見問題排查 - 安全加固建議
文章結構清晰,使用了代碼塊、表格等Markdown元素增強可讀性,并提供了實際可操作的命令和配置示例。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。