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: true
nodeSelector:
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.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
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: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
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-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:latest
ports:
- 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_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: password
Volume 挂载:
volumes:
- name: secret-volume
secret:
secretName: app-secret
3.2 ConfigMap 配置管理
创建方式对比
|
方法 |
命令示例 |
适用场景 |
|---|---|---|
|
文件 |
|
配置文件 |
|
目录 |
|
多配置文件 |
|
字面值 |
|
简单配置 |
热更新机制
Volume 挂载支持热更新:
volumes:
- name: config-volume
configMap:
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 应用架构。
更多推荐
所有评论(0)