Ingress-nginx 部署手册 (Helm 版本)

1. 概述

本文档介绍如何使用 Helm 在 Kubernetes 集群中部署 Ingress-nginx服务。

2. 前提条件

  • Kubernetes 集群 (v1.16+)
  • Helm (v3.0+)
  • 集群节点可访问公司内网
  • 足够的 Kubernetes 操作权限

3. 部署步骤

3.1 创建Ingress-Nginx TLS Secret

创建 ingress-nginx-tls.yaml 文件,内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: default-cert-secret
  namespace: ingress-nginx
type: kubernetes.io/tls
data:
  tls.crt: 根据自己的证书设置
  tls.key: 根据自己的证书设置

3.2 部署Ingress-Nginx TLS Secret

kubectl apply -f ingress-nginx-tls.yaml

3.3 添加 Helm 仓库

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

3.4 创建配置文件

创建 ingress-nginx-values.yaml 文件,内容如下:

# ingress-nginx-values.yaml

# 基本配置
global:
  image:
    # -- Registry host to pull images from.
    registry: registry.cn-hangzhou.aliyuncs.com
controller:
  name: controller
  enableAnnotationValidations: true
  replicaCount: 1
  image:
    ## Keep false as default for now!
    chroot: false
    # registry: registry.k8s.io
    image: google_containers/nginx-ingress-controller
    tag: "v1.12.2"
    digest: sha256:ba65ee572fa4a4ff36a366fd78d342d70c13ddd0c186b369b532628dd9b2fc50
    pullPolicy: IfNotPresent
  config:
    # 全局请求体大小限制(对所有Ingress生效)
    proxy-body-size: "2048m"  # 2048MB,按需调整
    ssl-protocols: "TLSv1.2 TLSv1.3"  # 允许的协议版本
    ssl-redirect: "false"             # 启用自动跳转
    force-ssl-redirect: "false"       # 强制跳转
    hsts: "false" # 禁用 HSTS 的配置
    compute-full-forwarded-for: "true" # 将远程地址附加到 X-Forwarded-For 标头
    use-forwarded-headers: "true" # 启用对 X-Forwarded-* 系列请求头的支持
    forwarded-for-header: "X-Forwarded-For" # 指定用于传递客户端 IP 地址的请求头字段名称为 X-Forwarded-For
    #1.默认禁用:从 Ingress-NGINX v1.12.0 开始,默认情况下禁用了nginx.ingress.kubernetes.io/configuration-snippet 注解,因为它们被认为可能包含高风险的配置。
    #2.安全限制:为了防止恶意用户通过注解注入危险的配置,Ingress-NGINX 引入了更严格的安全检查
    #allow-snippet-annotations: "true" #可以设置allowSnippetAnnotations: true
    #annotations-risk-level: "Critical"
  # 如果需要对特定Ingress生效,需启用注解
  allowSnippetAnnotations: false  # 允许使用注解覆盖全局配置
  extraArgs:
    default-ssl-certificate: "ingress-nginx/default-cert-secret" #配置默认证书
  # TCP/UDP 服务配置映射(ConfigMap)设置
  # -------------------------------
  # 指定用于存储 TCP/UDP 代理规则的 ConfigMap 名称
  # 格式: "<命名空间>/<configmap名称>"
  # 示例:
  # tcp-services-configmap: "ingress-nginx/custom-tcp-rules"  # 使用指定命名空间的自定义 ConfigMap
  # tcp-services-configmap: "ingress-nginx/ingress-nginx-tcp"   # 使用默认生成的 nginx-tcp ConfigMap(推荐大多数情况)
  #
  # 工作原理:
  # 1. ingress-nginx 控制器会监听这个 ConfigMap 的变化
  # 2. 当 ConfigMap 中的内容发生变化时,控制器会动态更新 NGINX 配置
  # 3. TCP/UDP 代理规则会被转换为 NGINX stream 模块的配置
  #  tcp-services-configmap: "ingress-nginx/ingress-nginx-tcp"
  #  udp-services-configmap: "ingress-nginx/ingress-nginx-udp"
  
  # -- Use a `DaemonSet` or `Deployment`
  kind: DaemonSet
  service:
    enabled: true
    type: NodePort
    nodePorts:
      http: 80
      https: 443
      # TCP/UDP 端口映射配置
      # -------------------------------
      # 格式说明:
      #   "<Service端口>: <NodePort>"
      #
      # 注意事项:
      # 1. Service端口是在集群内部访问服务的端口
      # 2. NodePort 是在节点上暴露服务的端口,范围默认为 30000-32767
      # 3. 外部可以通过任意节点IP:NodePort 访问服务
      #
      # 示例(常规用法):
      #tcp:
      #  6380: 30680  # Service端口 6380 映射到 NodePort 30680
      #  3306: 30306  # Service端口 3306 映射到 NodePort 30306
      #tcp:
      #  6380: 30680  # Service端口 6380 映射到 NodePort 30680
      #  3306: 30306  # Service端口 3306 映射到 NodePort 30306  
  resources:
    ##  limits:
    ##    cpu: 100m
    ##    memory: 90Mi
    requests:
      cpu: 100m
      memory: 200Mi
  admissionWebhooks:
    patch:
      enabled: true
      image:
        # registry: registry.k8s.io
        image: google_containers/kube-webhook-certgen
        ## for backwards compatibility consider setting the full image url via the repository value below
        ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail
        ## repository:
        tag: v1.5.3
        digest: sha256:39c0f0694e12f7fef378ea2e8a5c4040cc95d10d45b3f201cad918f7475508bd
        pullPolicy: IfNotPresent

# ====================== TCP 代理配置 ======================
#
# 说明:
# ingress-nginx 支持 TCP 流量代理,可用于暴露非 HTTP 服务(如数据库、消息队列等)
#
# 配置方式:
# 1. 在controller.extraArgs 中添加configmap(格式: "<命名空间>/<configmap名称>")
#    tcp-services-configmap: "ingress-nginx/ingress-nginx-tcp"
# 2. 在 controller.service.nodePorts.tcp 中配置 Service 端口到 NodePort 的映射
# 3. 在 tcp 字段中配置 Service 端口到具体服务的路由规则
#
# 示例:将 Service 端口 6380 代理到 redis-cluster 命名空间的 Redis proxy 服务
#
# 步骤一:配置controller.extraArgs
# controller:
#   extraArgs:
#     tcp-services-configmap: "ingress-nginx/ingress-nginx-tcp"

# 步骤二:配置端口映射(在 controller.service.nodePorts.tcp 下)
# controller:
#   service:
#     nodePorts:
#       tcp:
#         6380: 30680  # Service 端口 6380 映射到 NodePort 30680
#
# 步骤三:配置服务路由(在 tcp 下)
# tcp:
#   6380: "redis-cluster/camellia-redis-cluster-proxy:6380"
#
# 模板逻辑说明:
# 在 Helm 模板中,通过以下逻辑来确定是否设置 NodePort:
# {{- if index $.Values.controller.service.nodePorts.tcp $key }}
#   nodePort: {{ index $.Values.controller.service.nodePorts.tcp $key }}
# {{- end }}
# 这意味着只有当在 controller.service.nodePorts.tcp 中明确定义了某个 Service 端口的 NodePort 映射时,
# 才会在生成的 Service 中显式指定 nodePort 字段。
#
# 工作原理:
# 1. tcp 配置会被转换为 ConfigMap 中的条目
# 2. ingress-nginx 控制器监听该 ConfigMap 的变化
# 3. 控制器将 TCP 规则转换为 NGINX stream 模块配置
# 4. NGINX 根据配置将流量代理到目标服务
#
# 访问方式:
# 外部客户端可以通过任意节点IP:30680 访问 Redis 服务
#
# 注意事项:
# 1. Service 端口(如 6380)是模板中 port 字段的值,也是 tcp 配置的键
# 2. NodePort(如 30680)是 Kubernetes Service 在节点上暴露的端口,范围通常为 30000-32767
# 3. 最终路由的目标是命名空间/服务名:端口 格式

# TCP 服务路由配置
#tcp:
#  6380: "redis-cluster/camellia-redis-cluster-proxy:6380"
#  3306: "database/mysql-service:3306"
#  5432: "database/postgres-service:5432"

# ====================== UDP 代理配置 ======================
#
# 说明:
# ingress-nginx 同样支持 UDP 流量代理
# 配置方式与 TCP 类似,但使用 udp 字段

# 配置方式:
# 1. 在controller.extraArgs 中添加configmap(格式: "<命名空间>/<configmap名称>")
#    udp-services-configmap: "ingress-nginx/ingress-nginx-udp"
# 2. 在 controller.service.nodePorts.udp 中配置 Service 端口到 NodePort 的映射
# 3. 在 udp 字段中配置 Service 端口到具体服务的路由规则
#
# 示例:将 Service 端口 53 代理到 kube-system 命名空间的 codedns 服务
#
# 步骤一:配置controller.extraArgs
# controller:
#   extraArgs:
#     udp-services-configmap: "ingress-nginx/ingress-nginx-udp"

# 步骤二:配置端口映射(在 controller.service.nodePorts.tcp 下)
# controller:
#   service:
#     nodePorts:
#       tcp:
#         53: 30653  # Service 端口 53 映射到 NodePort 30653
#
# 步骤三:配置服务路由(在 tcp 下)
# udp:
#   53: "kube-system/coredns:53"

# UDP 服务路由配置
#udp:
#  53: "kube-system/coredns:53"

3.5 部署 Ingress-nginx

执行以下命令部署 Ingress-nginx:

# 使用 Helm 部署
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --values ingress-nginx-values.yaml \
  --version 4.12.2

3.6 验证部署

执行以下命令验证 CoreDNS 部署状态:

1. 检查 Pod 状态

# 检查 Pod 状态
kubectl get pods -n ingress-nginx -o wide

# 检查服务状态
kubectl get svc -n ingress-nginx

4.0 注意事项

  • k8s默认service端口是30000-32767,因使用NodePort绑定80/443端口,所以需要修改端口范围
posted @ 2025-05-15 16:43  怀恋小时候  阅读(382)  评论(0)    收藏  举报