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 可校验路径白名单。
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是否属于平台允许的域名白名单。 - 确保路径规则不冲突,避免路由覆盖。
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 核心对象关系总结
下图展示了这些核心对象在典型应用部署中的协作关系:
2.8 本章要点
- Pod 是原子调度单位,Webhook 可注入 Sidecar 或修改安全上下文。
- Service 提供稳定的网络抽象,Webhook 可强制命名规范与标签选择器。
- Deployment 管理 Pod 生命周期,Webhook 可校验副本数范围与安全策略。
- Ingress 是七层流量入口,Webhook 可强制 TLS 与域名白名单。
- ConfigMap 与 Secret 解耦配置与镜像,Webhook 可校验数据格式与加密要求。
- 理解这些原语的字段与生命周期,是编写有效 Webhook 准入控制策略的前提。