Kubernetes(八) Ingress 与配置资源管理详解
一、Kubernetes Ingress 深度解析
1.1 为什么需要 Ingress
传统的 NodePort Service 虽然能将集群内服务暴露给外部客户端,但存在显著问题:
-
端口管理困难:一个端口只能服务一个应用,需要提前规划
-
维护成本高:Service 数量多时端口不连续,难以管理
-
功能局限:基于四层调度,无法实现七层负载均衡特性
Ingress 解决方案:
-
提供高级流量管理能力
-
通过 Ingress Controller 接收所有入口流量
-
使用 Ingress 资源定义流量转发规则
1.2 Ingress 核心架构
组件构成
-
Ingress 资源:定义路由规则的 API 对象(类似 nginx.conf)
-
Ingress Controller:实际执行转发的负载均衡器
工作原理
-
Controller 监听 API Server 感知 Ingress 规则变化
-
动态生成 Nginx 配置并写入
/etc/nginx.conf
-
执行 reload 使配置生效
-
实现基于域名/路径的请求转发
1.3 三种部署方式对比
方式一:DaemonSet + HostNetwork(生产推荐)
优势:
-
性能最优,请求链路最短
-
直接使用宿主机网络,无额外 NAT
部署步骤:
# 1. 节点标记
kubectl label node node02 ingress=true# 2. 修改为 DaemonSet 并启用 HostNetwork
apiVersion: apps/v1
kind: DaemonSet
spec:template:spec:hostNetwork: truenodeSelector:ingress: "true"
方式二:Deployment + NodePort
适用场景:
-
测试环境
-
前置有负载均衡器的场景
特点:
-
通过 NodePort 暴露,多一层 NAT
-
大流量场景可能影响性能
方式三:LoadBalancer(云环境)
适用场景:
-
公有云环境
-
需要云厂商负载均衡器支持
1.4 Ingress 实战配置
基础路由配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport: number: 80
HTTPS 配置
# 生成证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout tls.key -out tls.crt \-subj "/CN=nginxsvc/O=nginxsvc"# 创建 Secret
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
高级功能
-
BasicAuth 认证:基于 HTTP 基础认证
-
重写规则:URL 重写和重定向
-
多域名路由:基于虚拟主机的流量分发
二、Pod 控制器详解
2.1 控制器类型对比
控制器 | 有状态 | 特点 | 适用场景 |
---|---|---|---|
Deployment | ❌ | 无状态应用、滚动更新 | Web 服务、API |
StatefulSet | ✅ | 稳定网络标识、有序部署 | 数据库、中间件 |
DaemonSet | ❌ | 每个节点运行一个 Pod | 日志收集、监控 |
Job/CronJob | ❌ | 一次性/周期性任务 | 批处理、备份 |
2.2 关键控制器深度解析
StatefulSet(有状态应用)
核心特性:
-
稳定网络标识:Pod 名称和 DNS 名称固定
-
持久化存储:每个 Pod 独立 PVC
-
有序部署:按顺序创建/删除(0→N-1)
架构组件:
-
Headless Service:提供 DNS 解析
-
VolumeClaimTemplate:为每个 Pod 提供独立存储
-
StatefulSet:管理 Pod 生命周期
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: "mysql"replicas: 3template:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7volumeMounts:- name: datamountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10Gi
DaemonSet(节点级部署)
典型应用:
-
日志收集代理(Fluentd、Filebeat)
-
监控数据采集(Node Exporter)
-
存储服务客户端(Ceph、GlusterFS)
apiVersion: apps/v1
kind: DaemonSet
metadata:name: node-exporter
spec:selector:matchLabels:app: node-exportertemplate:metadata:labels:app: node-exporterspec:containers:- name: node-exporterimage: prom/node-exporter:latestports:- containerPort: 9100
三、配置资源管理
3.1 Secret 安全管理
类型与应用场景
类型 | 用途 | 示例 |
---|---|---|
Opaque | 用户自定义敏感数据 | 数据库密码 |
dockerconfigjson | 镜像仓库认证 | 私有仓库登录 |
tls | SSL/TLS 证书 | HTTPS 证书 |
service-account-token | API 访问令牌 | ServiceAccount |
创建与使用
# 命令行创建
kubectl create secret generic app-secret \--from-literal=username=admin \--from-literal=password=secret123# YAML 定义(Base64 编码)
echo -n 'admin' | base64
apiVersion: v1
kind: Secret
metadata:name: app-secret
type: Opaque
data:username: YWRtaW4=password: c2VjcmV0MTIz
使用方式
环境变量注入:
env:
- name: DB_PASSWORDvalueFrom:secretKeyRef:name: app-secretkey: password
Volume 挂载:
volumes:
- name: secret-volumesecret:secretName: app-secret
3.2 ConfigMap 配置管理
创建方式对比
方法 | 命令示例 | 适用场景 |
---|---|---|
文件 |
| 配置文件 |
目录 |
| 多配置文件 |
字面值 |
| 简单配置 |
热更新机制
Volume 挂载支持热更新:
volumes:
- name: config-volumeconfigMap:name: app-config
触发滚动更新:
kubectl patch deployment myapp -p \'{"spec":{"template":{"metadata":{"annotations":{"version":"v2"}}}}}'
最佳实践
-
配置与镜像分离:提高可移植性
-
环境差异化配置:不同环境使用不同 ConfigMap
-
配置版本管理:结合 GitOps 实践
四、总结与最佳实践
4.1 Ingress 总结
-
生产推荐:DaemonSet + HostNetwork 模式
-
高可用方案:多节点部署 + LVS/Keepalived
-
安全加固:TLS 证书、访问控制、速率限制
-
监控告警:Prometheus 监控 Controller 指标
4.2 控制器选择指南
-
无状态 Web 服务:Deployment
-
有状态数据库:StatefulSet + 持久化存储
-
节点级守护进程:DaemonSet
-
定时任务:CronJob
4.3 配置管理原则
-
敏感信息:始终使用 Secret,配合 RBAC 控制访问
-
普通配置:ConfigMap 实现配置与代码分离
-
安全编码:Base64 编码不是加密,需要网络传输加密
-
更新策略:理解热更新限制,合理设计重启策略
4.4 生产环境建议
-
资源限制:为 Controller 设置合理的资源请求和限制
-
HPA 配置:根据流量自动扩缩容
-
备份策略:定期备份重要配置和证书
-
灾难恢复:制定 Controller 故障的应急预案
通过合理运用 Ingress 流量管理和配置资源管理,可以构建出高效、安全、易维护的 Kubernetes 应用架构。