2. Kubernetes 核心概念速览:Pod、Service、Deployment、Namespace、ConfigMap、Secret
在进入集成测试驱动的环境配置之前,必须先建立对 Kubernetes 核心原语的统一认知。本章不追求面面俱到,而是聚焦于集成测试场景中最常打交道的六个概念:Pod、Service、Deployment、Namespace、ConfigMap 和 Secret。理解它们之间的依赖与组合关系,是后续编写测试配置清单的基础。
2.1 六要素核心定义
| 概念 | 英文名 | 核心定义 | 测试场景中的角色 |
|---|---|---|---|
| Pod | Pod | Kubernetes 中最小的可部署计算单元,封装一个或多个容器、存储与网络。 | 被测应用的运行载体;集成测试直接验证 Pod 内的容器行为。 |
| Service | Service | 为一组 Pod 提供稳定的网络端点与负载均衡,屏蔽 Pod IP 漂移。 | 测试客户端通过 Service 访问被测 Pod,实现服务发现。 |
| Deployment | Deployment | 声明式管理 Pod 副本数、更新策略与回滚,保证期望状态。 | 控制测试环境的 Pod 版本与副本数,支持滚动更新测试。 |
| Namespace | Namespace | 虚拟集群隔离单元,用于划分资源边界与访问策略。 | 隔离不同测试套件(如单元测试、集成测试、冒烟测试)的资源。 |
| ConfigMap | ConfigMap | 以键值对形式存储非机密配置数据,注入 Pod 环境变量或挂载文件。 | 管理测试专用的数据库连接串、超时参数、特性开关。 |
| Secret | Secret | 存储敏感数据(密码、Token、证书),Base64 编码,支持加密。 | 保管测试环境中的 API 密钥、数据库密码、TLS 证书。 |
测试视角提示: 集成测试通常不直接操作 Pod,而是通过 Deployment 管理 Pod 生命周期,通过 Service 访问 Pod,通过 ConfigMap/Secret 注入配置。Namespace 用于隔离不同测试阶段的资源,避免命名冲突。
2.2 六要素关系图
下图展示了六个核心概念在 Kubernetes 集群中的典型协作关系。箭头方向表示“依赖”或“指向”关系。
2.3 配置注入机制对比
ConfigMap 与 Secret 是集成测试配置管理的核心工具。下表对比两者的关键差异,帮助你在测试场景中做出正确选择。
| 对比维度 | ConfigMap | Secret |
|---|---|---|
| 数据性质 | 非敏感配置(URL、超时、日志级别) | 敏感数据(密码、Token、证书) |
| 存储编码 | 明文 UTF-8 | Base64 编码(可启用加密) |
| 注入方式 | 环境变量 / 挂载文件 / 命令行参数 | 环境变量 / 挂载文件 |
| 更新生效 | 挂载文件自动更新(需应用监听) | 挂载文件自动更新(需应用监听) |
| 测试场景示例 | 数据库主机名、API 端点、特性开关 | 数据库密码、JWT 签名密钥、TLS 私钥 |
常见误区: 不要将数据库密码放在 ConfigMap 中,即使测试环境也应使用 Secret。集成测试的 Secret 可以通过 CI/CD 变量或 Vault 动态注入,避免硬编码。
2.4 典型测试部署流程
以下步骤展示了一个集成测试环境从创建到验证的完整流程,涉及上述六个核心概念。
- 创建 Namespace:为当前测试套件创建独立命名空间,如
test-integration-api-v2。 - 创建 ConfigMap 与 Secret:注入测试专用的配置项与凭据。
- 创建 Deployment:声明 Pod 模板,引用 ConfigMap 与 Secret,设置副本数(通常为 1 或 2)。
- 创建 Service:为 Deployment 管理的 Pod 暴露 ClusterIP 或 NodePort 端点。
- 等待 Pod 就绪:通过
kubectl wait --for=condition=Ready pod确保服务可用。 - 执行测试:测试客户端通过 Service 的 DNS 名称(如
my-svc.test-ns.svc.cluster.local)发起请求。 - 清理资源:删除 Namespace 即可级联删除其下所有资源。
最佳实践: 在 CI/CD 流水线中,每个测试阶段(单元测试、集成测试、端到端测试)使用独立的 Namespace,并在测试结束后立即删除。这可以避免资源残留导致的后续测试失败。
2.5 资源定义示例(YAML 片段)
以下是一个集成测试环境的完整 YAML 示例,展示了六个概念的协同使用。
apiVersion: v1
kind: Namespace
metadata:
name: test-integration-v1
---
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: test-integration-v1
data:
DB_HOST: "postgres-service.test-integration-v1.svc.cluster.local"
LOG_LEVEL: "debug"
---
apiVersion: v1
kind: Secret
metadata:
name: app-secret
namespace: test-integration-v1
type: Opaque
data:
DB_PASSWORD: dGVzdC1wYXNzd29yZA== # base64("test-password")
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: test-integration-v1
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app:test-latest
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DB_HOST
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
namespace: test-integration-v1
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
测试执行命令: 使用
kubectl apply -f test-env.yaml 一键部署上述资源。测试完成后,执行 kubectl delete namespace test-integration-v1 即可完整清理。
2.6 概念关系总结
下图以分层视角总结六个概念在 Kubernetes 集群中的位置关系,帮助你建立全局认知。