您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。