一、Kubernetes Ingress 深度解析

1.1 为什么需要 Ingress

传统的 NodePort Service 虽然能将集群内服务暴露给外部客户端,但存在显著问题:

  • ​端口管理困难​​:一个端口只能服务一个应用,需要提前规划

  • ​维护成本高​​:Service 数量多时端口不连续,难以管理

  • ​功能局限​​:基于四层调度,无法实现七层负载均衡特性

​Ingress 解决方案​​:

  • 提供高级流量管理能力

  • 通过 Ingress Controller 接收所有入口流量

  • 使用 Ingress 资源定义流量转发规则

1.2 Ingress 核心架构

组件构成
  • ​Ingress 资源​​:定义路由规则的 API 对象(类似 nginx.conf)

  • ​Ingress Controller​​:实际执行转发的负载均衡器

工作原理
  1. Controller 监听 API Server 感知 Ingress 规则变化

  2. 动态生成 Nginx 配置并写入 /etc/nginx.conf

  3. 执行 reload 使配置生效

  4. 实现基于域名/路径的请求转发

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)

​架构组件​​:

  1. ​Headless Service​​:提供 DNS 解析

  2. ​VolumeClaimTemplate​​:为每个 Pod 提供独立存储

  3. ​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 配置管理

创建方式对比

方法

命令示例

适用场景

文件

--from-file=config.properties

配置文件

目录

--from-file=config-dir/

多配置文件

字面值

--from-literal=key=value

简单配置

热更新机制

​Volume 挂载支持热更新​​:

volumes:
- name: config-volume
  configMap:
    name: app-config

​触发滚动更新​​:

kubectl patch deployment myapp -p \
  '{"spec":{"template":{"metadata":{"annotations":{"version":"v2"}}}}}'
最佳实践
  1. ​配置与镜像分离​​:提高可移植性

  2. ​环境差异化配置​​:不同环境使用不同 ConfigMap

  3. ​配置版本管理​​:结合 GitOps 实践

四、总结与最佳实践

4.1 Ingress 总结

  • ​生产推荐​​:DaemonSet + HostNetwork 模式

  • ​高可用方案​​:多节点部署 + LVS/Keepalived

  • ​安全加固​​:TLS 证书、访问控制、速率限制

  • ​监控告警​​:Prometheus 监控 Controller 指标

4.2 控制器选择指南

  • ​无状态 Web 服务​​:Deployment

  • ​有状态数据库​​:StatefulSet + 持久化存储

  • ​节点级守护进程​​:DaemonSet

  • ​定时任务​​:CronJob

4.3 配置管理原则

  1. ​敏感信息​​:始终使用 Secret,配合 RBAC 控制访问

  2. ​普通配置​​:ConfigMap 实现配置与代码分离

  3. ​安全编码​​:Base64 编码不是加密,需要网络传输加密

  4. ​更新策略​​:理解热更新限制,合理设计重启策略

4.4 生产环境建议

  • ​资源限制​​:为 Controller 设置合理的资源请求和限制

  • ​HPA 配置​​:根据流量自动扩缩容

  • ​备份策略​​:定期备份重要配置和证书

  • ​灾难恢复​​:制定 Controller 故障的应急预案

通过合理运用 Ingress 流量管理和配置资源管理,可以构建出高效、安全、易维护的 Kubernetes 应用架构。

更多推荐