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端口,所以需要修改端口范围

浙公网安备 33010602011771号