3. 基础层(Base)设计:如何定义通用资源、Deployment/Service/ConfigMap基础模板

在 Kustomize 的分层管理模型中,基础层(Base)是整个配置体系的基石。它定义了应用在任意环境中都保持不变的通用资源模板,包括 Deployment、Service、ConfigMap 等核心对象。本章将深入讲解如何设计高复用性的 Base 层,确保团队能够通过最小的改动实现多环境适配。

3.1 基础层设计原则

Base 层应遵循以下三条核心原则:

  • 单一职责:每个 Base 目录只描述一个应用或一组紧密耦合的组件,不混入环境差异。
  • 参数化入口:通过 Kustomize 的 vars 或 configMapGenerator 暴露可变字段,避免硬编码。
  • 最小化覆盖:Base 层只包含所有环境共用的配置,环境专属内容通过 Overlay 层注入。
实践建议:将 Base 层视为“应用出厂配置”,任何环境差异(如副本数、镜像标签、日志级别)都应通过 Overlay 层的 patches 或 replacements 实现,而非修改 Base。

3.2 通用资源模板结构

一个标准的基础层目录结构如下:

base/
├── kustomization.yaml
├── deployment.yaml
├── service.yaml
├── configmap.yaml
└── hpa.yaml          # 可选:通用 HPA 模板

以下逐一解析各模板的设计要点。

3.3 Deployment 基础模板

Deployment 模板应预留关键的可覆盖字段,包括副本数、镜像、资源限制、环境变量和探针。示例模板:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 1  # 默认值,由 Overlay 覆盖
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: my-registry/my-app:latest  # 占位标签
        ports:
        - containerPort: 8080
        env:
        - name: LOG_LEVEL
          value: "info"
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: db_host
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 15
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
模板设计要点:
  • 镜像标签:使用 latest 作为占位符,CI/CD 流水线通过 images 指令替换为具体版本。
  • 资源限制:设置合理的默认值,避免因未覆盖导致资源不足或浪费。
  • 探针路径:统一使用 /healthz 和 /ready,要求应用开发团队遵循此约定。

3.4 Service 基础模板

Service 模板通常使用 ClusterIP 类型,暴露端口与 Deployment 的 containerPort 对齐:

apiVersion: v1
kind: Service
metadata:
  name: my-app-svc
  labels:
    app: my-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: my-app
字段 Base 层默认值 Overlay 层常见覆盖
spec.type ClusterIP NodePort / LoadBalancer(生产环境)
spec.ports[].port 80 443(启用 HTTPS 时)
metadata.annotations 无 ingress 注解、监控注解

3.5 ConfigMap 基础模板

ConfigMap 使用 configMapGenerator 在 kustomization.yaml 中声明,而非直接编写 YAML 文件。这种方式支持自动哈希追加和行为一致性:

# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yaml
- service.yaml

configMapGenerator:
- name: app-config
  literals:
  - db_host=localhost
  - db_port=5432
  - log_level=info
  - cache_ttl=300

生成的 ConfigMap 名称会自动追加哈希后缀(如 app-config-7g4h2k9m),当内容变更时,Deployment 中的引用会自动更新,触发滚动更新。

注意:不要在 Base 层的 ConfigMap 中存放敏感信息(如密码、)。敏感数据应使用 secretGenerator 或外部密钥管理服务(如 Vault、AWS Secrets Manager)。

3.6 基础层资源关系图

下图展示了 Base 层中 Deployment、Service、ConfigMap 之间的引用关系,以及它们如何通过标签选择器形成逻辑单元:

Base 层核心资源关系图 ConfigMap app-config db_host=localhost log_level=info Deployment my-app replicas: 1 image: my-app:latest ports: 8080 Service my-app-svc type: ClusterIP port: 80 → 8080 envFrom selector 标签选择器匹配规则 Deployment.spec.selector.matchLabels.app = my-app Service.spec.selector.app = my-app Base 层设计要点 ① 所有环境共用同一套模板 ② 差异通过 Overlay 层 patches 覆盖

3.7 kustomization.yaml 编排

Base 层的 kustomization.yaml 负责将上述资源聚合为一个逻辑单元,并声明通用生成器和转换器:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# 资源列表
resources:
- deployment.yaml
- service.yaml

# ConfigMap 生成器
configMapGenerator:
- name: app-config
  literals:
  - db_host=localhost
  - db_port=5432
  - log_level=info

# 通用标签
commonLabels:
  app: my-app
  managed-by: kustomize

# 通用注解
commonAnnotations:
  version: "1.0.0"
  environment: base

# 名称前缀(可选,用于多实例部署)
namePrefix: base-
关键配置说明:
  • commonLabels:自动为所有资源添加统一标签,确保 Service 的 selector 与 Deployment 的 matchLabels 一致。
  • namePrefix:在资源名称前添加前缀,避免多 Base 合并时冲突。
  • configMapGenerator:自动生成 ConfigMap 并追加内容哈希,实现配置变更驱动的滚动更新。

3.8 多环境复用验证

设计完成后,可通过以下命令验证 Base 层的正确性:

# 渲染 Base 层输出
kustomize build base/

# 验证 YAML 合法性
kustomize build base/ | kubectl apply --dry-run=client -f -

# 查看最终生成的资源名称
kustomize build base/ | grep -E "^kind:|^  name:"

输出示例:

kind: ConfigMap
  name: base-app-config-7g4h2k9m
kind: Deployment
  name: base-my-app
kind: Service
  name: base-my-app-svc

可以看到,namePrefix 和 configMapGenerator 已正确生效,所有资源名称统一添加了 base- 前缀,ConfigMap 名称包含哈希后缀。

3.9 常见设计误区

误区 错误示例 正确做法
在 Base 层硬编码环境差异 replicas: 3(生产值) Base 层使用 replicas: 1,Overlay 层通过 patches 覆盖
直接编写 ConfigMap YAML configmap.yaml 硬编码内容 使用 configMapGenerator 声明式生成
忽略标签一致性 Service 和 Deployment 标签不匹配 使用 commonLabels 统一管理
Base 层包含敏感数据 ConfigMap 中写入数据库密码 使用 secretGenerator 或外部密钥管理
团队协作建议:将 Base 层纳入 Git 仓库的 main 分支,通过 PR 审查机制确保模板质量。Overlay 层按环境分支管理,实现环境隔离与快速迭代。