2. Kubernetes 核心概念回顾:Pod、Service、Deployment、Ingress、ConfigMap、Secret

在深入 Webhook 与 K8s 平台集成之前,必须牢固掌握 Kubernetes 的六大核心原语。这些对象构成了应用部署、网络暴露、配置管理和安全凭证的基石。Webhook 的拦截与变更操作正是围绕这些资源的创建、更新与删除展开。

2.1 核心对象概览与职责

下表总结了每个核心对象在集群中的角色、生命周期特征以及 Webhook 可能介入的典型场景:

对象 API 组 / 版本 核心职责 Webhook 典型介入点
Pod v1 最小调度单元,运行一个或多个容器 注入 Sidecar、校验镜像地址、修改资源限制
Service v1 提供稳定的网络端点,负载均衡到 Pod 强制命名规范、自动添加标签选择器
Deployment apps/v1 声明式管理 Pod 副本、滚动更新与回滚 注入安全上下文、校验副本数范围
Ingress networking.k8s.io/v1 七层 HTTP/HTTPS 路由,将外部流量引入集群 强制 TLS 配置、校验路径唯一性
ConfigMap v1 存储非机密性的键值对配置数据 校验 Key 命名、禁止挂载敏感路径
Secret v1 存储敏感数据(密码、、证书) 强制加密标注、校验数据格式、审计访问

2.2 Pod:最小调度与运行单元

Pod 是 Kubernetes 中可创建和部署的最小计算单元。一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间、存储卷和资源约束。Webhook 最常见的拦截目标就是 Pod 资源。

关键字段:
  • spec.containers[].image — 容器镜像,Webhook 可强制替换为私有仓库地址。
  • spec.containers[].resources — CPU/内存限制,Webhook 可设置默认值或上限。
  • spec.containers[].securityContext — 安全上下文,Webhook 可强制禁止特权模式。
  • spec.volumes 与 spec.containers[].volumeMounts — 存储挂载,Webhook 可校验路径白名单。
Pod 内部结构示意 Pod 边界(共享网络 & 存储) 容器 1 nginx:1.25 端口 80 CPU: 0.5 / Mem: 256Mi 容器 2(Sidecar) fluent-bit:2.1 日志采集 CPU: 0.1 / Mem: 64Mi 共享 卷 Webhook 可在 Pod 创建时自动注入 Sidecar 容器、修改资源限制或校验镜像来源

2.3 Service:稳定的网络抽象层

Service 为一组动态变化的 Pod 提供固定的虚拟 IP(ClusterIP)和 DNS 名称。它通过标签选择器(Selector)匹配后端 Pod,实现负载均衡。Webhook 常用于强制 Service 的命名规范或自动添加必要的选择器标签。

常见 Service 类型:
  • ClusterIP — 默认类型,仅在集群内部可达。
  • NodePort — 在每个节点上开放一个静态端口,外部可通过 NodeIP:NodePort 访问。
  • LoadBalancer — 云厂商提供的外部负载均衡器,自动分配公网 IP。

2.4 Deployment:声明式 Pod 管理

Deployment 是管理无状态应用的首选控制器。它通过 ReplicaSet 确保指定数量的 Pod 副本始终运行,并支持滚动更新、暂停、回滚等操作。Webhook 在 Deployment 上的典型应用包括:

  • 强制设置 spec.template.spec.securityContext(如 runAsNonRoot: true)。
  • 校验 spec.replicas 是否在平台允许的最小/最大范围内。
  • 自动注入健康检查探针(livenessProbe / readinessProbe)。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "1"
            memory: "512Mi"
          requests:
            cpu: "0.5"
            memory: "256Mi"

2.5 Ingress:七层流量入口

Ingress 提供基于 HTTP/HTTPS 的路由规则,将外部请求转发到集群内部的 Service。它是平台对外暴露服务的标准方式。Webhook 在 Ingress 资源上的常见校验包括:

  • 强制要求 spec.tls 配置,禁止明文 HTTP 流量。
  • 校验 spec.rules[].host 是否属于平台允许的域名白名单。
  • 确保路径规则不冲突,避免路由覆盖。
Ingress 七层流量路由路径 外部用户 Ingress Controller Ingress 规则 host: app.example.com Service Pod v1 Pod v2 Pod v3 Webhook 可强制 Ingress 必须配置 TLS 证书,并校验域名是否在平台白名单内 拒绝未加密的 HTTP 流量进入集群

2.6 ConfigMap 与 Secret:配置与敏感数据管理

ConfigMap 和 Secret 将配置数据与容器镜像解耦。ConfigMap 存储非敏感配置(如配置文件、环境变量),Secret 则用于存储敏感信息(如密码、API 、TLS 证书)。两者都可以被 Pod 以环境变量或挂载卷的方式引用。

安全注意事项:
  • Secret 默认仅进行 Base64 编码,并非加密。生产环境应启用 加密静态数据(Encryption at Rest)。
  • Webhook 可以强制 Secret 必须包含 kubernetes.io/encrypted: "true" 标注,或校验其数据格式是否符合预期。
  • ConfigMap 不应存储任何敏感信息;Webhook 可扫描其数据内容并拒绝包含疑似密码的 Key。
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  LOG_LEVEL: info
---
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQxMjM=   # Base64 编码的 "password123"

2.7 核心对象关系总结

下图展示了这些核心对象在典型应用部署中的协作关系:

Kubernetes 核心对象协作关系 Deployment ReplicaSet Pod Service Ingress ConfigMap Secret 关系说明: Deployment 管理 ReplicaSet → ReplicaSet 管理 Pod 副本数 Service 通过标签选择器关联 Pod,提供稳定网络端点 Ingress 将外部流量路由到 Service ConfigMap / Secret 被 Pod 以环境变量或卷挂载方式引用 Webhook 可以拦截上述任意资源的创建/更新请求,执行校验、注入或拒绝操作

2.8 本章要点

  • Pod 是原子调度单位,Webhook 可注入 Sidecar 或修改安全上下文。
  • Service 提供稳定的网络抽象,Webhook 可强制命名规范与标签选择器。
  • Deployment 管理 Pod 生命周期,Webhook 可校验副本数范围与安全策略。
  • Ingress 是七层流量入口,Webhook 可强制 TLS 与域名白名单。
  • ConfigMap 与 Secret 解耦配置与镜像,Webhook 可校验数据格式与加密要求。
  • 理解这些原语的字段与生命周期,是编写有效 Webhook 准入控制策略的前提。