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 集群中的典型协作关系。箭头方向表示“依赖”或“指向”关系。

Kubernetes 核心概念关系图 Kubernetes 核心概念关系图 核心对象 配置/安全 隔离单元 依赖/指向 Namespace(隔离边界) Deployment 声明式 Pod 管理 Service 稳定网络端点 Pod 最小部署单元 ConfigMap 非机密配置 Secret 敏感数据 关键依赖链 1. Deployment 管理 Pod 2. Service 选择 Pod 3. ConfigMap/Secret 注入 Pod 测试隔离建议 每个测试套件使用独立 Namespace 避免资源冲突

2.3 配置注入机制对比

ConfigMap 与 Secret 是集成测试配置管理的核心工具。下表对比两者的关键差异,帮助你在测试场景中做出正确选择。

对比维度 ConfigMap Secret
数据性质 非敏感配置(URL、超时、日志级别) 敏感数据(密码、Token、证书)
存储编码 明文 UTF-8 Base64 编码(可启用加密)
注入方式 环境变量 / 挂载文件 / 命令行参数 环境变量 / 挂载文件
更新生效 挂载文件自动更新(需应用监听) 挂载文件自动更新(需应用监听)
测试场景示例 数据库主机名、API 端点、特性开关 数据库密码、JWT 签名密钥、TLS 私钥
常见误区: 不要将数据库密码放在 ConfigMap 中,即使测试环境也应使用 Secret。集成测试的 Secret 可以通过 CI/CD 变量或 Vault 动态注入,避免硬编码。

2.4 典型测试部署流程

以下步骤展示了一个集成测试环境从创建到验证的完整流程,涉及上述六个核心概念。

  1. 创建 Namespace:为当前测试套件创建独立命名空间,如 test-integration-api-v2。
  2. 创建 ConfigMap 与 Secret:注入测试专用的配置项与凭据。
  3. 创建 Deployment:声明 Pod 模板,引用 ConfigMap 与 Secret,设置副本数(通常为 1 或 2)。
  4. 创建 Service:为 Deployment 管理的 Pod 暴露 ClusterIP 或 NodePort 端点。
  5. 等待 Pod 就绪:通过 kubectl wait --for=condition=Ready pod 确保服务可用。
  6. 执行测试:测试客户端通过 Service 的 DNS 名称(如 my-svc.test-ns.svc.cluster.local)发起请求。
  7. 清理资源:删除 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 集群中的位置关系,帮助你建立全局认知。

Kubernetes 核心概念分层架构图 Kubernetes 核心概念分层架构 Namespace(资源隔离层) Deployment(管理控制层) Service(网络抽象层) Pod(计算执行层) ConfigMap(非机密配置) Secret(机密配置) 注入 Pod