Nginx Ingress怎么部署

发布时间:2021-11-30 11:55:57 作者:iii
来源:亿速云 阅读:289
# 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

二、基础部署方式

2.1 使用Manifest部署(推荐生产环境)

官方提供的标准部署方式:

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

2.2 使用Helm部署(适合定制化需求)

添加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

2.3 各云平台特殊配置

AWS部署示例:

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"

Azure部署示例:

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"="true"

三、核心配置详解

3.1 ConfigMap配置

关键配置参数示例:

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"'

3.2 自定义Annotations

常用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

四、高级部署方案

4.1 多实例部署模式

场景1:按命名空间隔离

helm install ingress-nginx-dev ingress-nginx/ingress-nginx \
  --namespace ingress-nginx-dev \
  --set controller.scope.enabled=true \
  --set controller.scope.namespace="dev-ns"

场景2:按IngressClass区分

# 控制器启动参数添加
- --controller-class=k8s.io/internal-ingress-nginx
- --ingress-class=internal

4.2 金丝雀发布配置

通过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

4.3 自定义模板

创建自定义模板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

五、运维与监控

5.1 健康检查配置

livenessProbe:
  httpGet:
    path: /healthz
    port: 10254
    scheme: HTTP
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3

5.2 监控指标暴露

Prometheus监控配置示例:

--set controller.metrics.enabled=true \
--set controller.metrics.serviceMonitor.enabled=true \
--set controller.metrics.serviceMonitor.additionalLabels.release="prometheus"

5.3 日志收集建议

推荐配置:

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

六、常见问题排查

6.1 诊断工具

获取详细配置信息:

kubectl exec -n ingress-nginx <pod-name> -- nginx -T

检查事件日志:

kubectl describe ingress <ingress-name>
kubectl logs -n ingress-nginx <pod-name>

6.2 典型问题处理

问题1:503 Service Temporarily Unavailable

可能原因: - 后端服务未就绪 - Endpoints选择器不匹配

检查命令:

kubectl get endpoints <service-name>

问题2:413 Request Entity Too Large

解决方案:

annotations:
  nginx.ingress.kubernetes.io/proxy-body-size: "50m"

七、安全加固建议

7.1 网络策略

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

7.2 TLS最佳实践

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的多种部署方式和配置技巧。在实际生产环境中,建议根据具体业务需求选择合适的部署方案,并持续关注以下方面:

  1. 定期升级Controller版本(关注GitHub Releases
  2. 监控关键指标:QPS、延迟、错误率等
  3. 建立完善的日志收集和分析体系
  4. 制定灾备和回滚方案

通过合理配置和持续优化,Nginx Ingress能够为您的Kubernetes集群提供稳定高效的流量管理服务。 “`

这篇文章包含了约4050字,采用Markdown格式编写,涵盖了Nginx Ingress部署的完整流程,包括: - 环境准备和前置条件 - 基础部署方法(Manifest/Helm) - 核心配置详解 - 高级部署方案 - 运维监控指南 - 常见问题排查 - 安全加固建议

文章结构清晰,使用了代码块、表格等Markdown元素增强可读性,并提供了实际可操作的命令和配置示例。

推荐阅读:
  1. k8s ingress-nginx
  2. k8s ingress-nginx 0.25.1 最新版部署和例子

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx ingress

上一篇:如何在Nginx中开启HTTP3.0的支持

下一篇:C/C++ Qt TreeWidget单层树形组件怎么应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》