前端项目K8S配置

5 阅读4分钟
  1. deploy/base
    放通用基础资源:ServiceDeploymentHPA,不区分环境。
  2. deploy/overlays/{dev|release|prod}
    每个环境只写差异项(补丁),通过 patchesStrategicMerge 覆盖 base。
  3. deploy/jobs-pre/base
    放一次性 Job 的通用配置(同步脚本任务)。
  4. deploy/jobs-pre/overlays/{dev|release|prod}
    各环境对 Job 的差异化补丁(命名空间、镜像拉取密钥、环境标签)。

一、应用服务配置(release 环境,按实际顺序)

1) base/kustomization.yaml

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

resources:
  - service.yaml
  - deployment.yaml
  - autoscaling.yaml

namespace: default

关键含义:

  • resources 定义基础资源装配顺序:先服务、再部署、再弹性伸缩。
  • namespace: default 是 base 默认值,后续会被 release overlay 覆盖。

2) base/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: <app-name>
  labels:
    name: <app-name>
    app: <app-name>
    language: js
spec:
  ports:
    - port: 80
      name: http
      targetPort: 80
      protocol: TCP
      appProtocol: http
  selector:
    app: <app-name>

关键含义:

  • selector.app 决定流量转发到哪些 Pod。
  • port/targetPort 表示集群内访问 80,转发到容器 80。
  • appProtocol: http 便于网关/观测系统识别协议。

3) base/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <app-name>
spec:
  strategy:
    rollingUpdate:
      maxSurge: 20%
      maxUnavailable: 20%
    type: RollingUpdate
  replicas: 1
  selector:
    matchLabels:
      app: <app-name>
  template:
    metadata:
      labels:
        app: <app-name>
        service-type: assets
        language: js
    spec:
      securityContext:
        runAsUser: 0
      hostAliases:
        - ip: "<fixed-ip>"
          hostnames:
            - "<external-domain>"
      containers:
        - name: assets
          image: imageName
          readinessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 20
            periodSeconds: 10
          livenessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 20
            periodSeconds: 10
          resources:
            requests:
              cpu: 200m
              memory: 256Mi
            limits:
              cpu: 800m
              memory: 512Mi
          ports:
            - containerPort: 80
              name: http
          volumeMounts:
            - mountPath: /data/app/platform-admin-nfs
              name: nfs
      volumes:
        - name: nfs
          persistentVolumeClaim:
            claimName: platform-admin-nfs

关键含义(代码级):

  • rollingUpdate:平滑发布策略,避免全量中断。
  • selector.matchLabelstemplate.labels 必须匹配,否则 Deployment 无法管理 Pod。
  • readinessProbelivenessProbe 分别控制“是否接流量”和“是否重启修复”。
  • resources.requests/limits 影响调度与资源上限,避免 Pod 抢占失控。
  • hostAliases 是容器内静态 hosts 映射,通常用于固定解析。
  • volumeMounts + PVC 把共享存储挂进容器,适合静态资源同步场景。

4) base/autoscaling.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: <app-name>-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: <app-name>
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

关键含义:

  • scaleTargetRef 指向要扩缩容的 Deployment。
  • averageUtilization: 70 表示 CPU 均值目标 70%,超出倾向扩容。
  • min/maxReplicas 控制弹性边界。

5) overlays/release/kustomization.yaml

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

resources:
  - ../../base

patchesStrategicMerge:
  - deployment.yaml
  - service.yaml
  - autoscaling.yaml

namespace: release

关键含义:

  • resources: ../../base 引用基础模板。
  • patchesStrategicMerge 按资源类型做“局部覆盖”。
  • namespace: release 把整套资源落到 release 命名空间。

6) overlays/release/deployment.yaml(补丁)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <app-name>
spec:
  selector:
    matchLabels:
     env: release
  template:
    metadata:
      labels:
        env: release
    spec:
      imagePullSecrets:
        - name: <registry-secret>
      containers:
        - name: assets
          resources:
            requests:
              cpu: 200m
              memory: 256Mi
            limits:
              cpu: 800m
              memory: 512Mi

关键含义:

  • 增加 env: release 标签,做环境隔离。
  • imagePullSecrets 指定私有镜像仓库凭据。
  • 可在此覆盖 base 的资源限制(当前值与 base 一致,便于后续单独调优)。

7) overlays/release/service.yaml(补丁)

apiVersion: v1
kind: Service
metadata:
  name: <app-name>
spec:
  selector:
    env: release

关键含义:

  • 给 Service selector 增加环境维度,确保只路由到 release Pod。
  • 与 base 的 app selector 合并后,形成更精确匹配。

8) overlays/release/autoscaling.yaml(补丁)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: <app-name>-hpa
spec:
  minReplicas: 1

关键含义:

  • 覆盖最小副本数,按环境控制基础容量。

二、预处理任务配置(release 环境,按实际顺序)

1) jobs-pre/base/kustomization.yaml

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

resources:
  - job-assets-sync.yaml

namespace: default

2) jobs-pre/base/job-assets-sync.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: <app-name>-sync
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 0
  ttlSecondsAfterFinished: 1800
  template:
    metadata:
      labels:
        job-name: <app-name>-sync
    spec:
      restartPolicy: Never
      securityContext:
        runAsUser: 0
      containers:
        - name: sync
          image: imageName
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          command:
            - /bin/sh
            - -c
            - /app/script/assets-sync.sh
          volumeMounts:
            - mountPath: /data/app/platform-admin-nfs
              name: nfs
      volumes:
        - name: nfs
          persistentVolumeClaim:
            claimName: platform-admin-nfs

关键含义(代码级):

  • completions: 1 + parallelism: 1:单次串行执行。
  • backoffLimit: 0:失败不自动重试,便于快速暴露问题。
  • ttlSecondsAfterFinished:完成后自动回收 Job 资源。
  • command:入口脚本就是同步任务本体。
  • PVC:任务和应用共享存储,常见于资源预同步。

3) jobs-pre/overlays/release/kustomization.yaml

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

resources:
  - ../../base

patchesStrategicMerge:
  - job-assets-sync.yaml

namespace: release

4) jobs-pre/overlays/release/job-assets-sync.yaml(补丁)

apiVersion: batch/v1
kind: Job
metadata:
  name: <app-name>-sync
spec:
  template:
    metadata:
      labels:
        env: release
    spec:
      imagePullSecrets:
        - name: <registry-secret>
      containers:
        - name: sync
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"

关键含义:

  • 同样通过 env: release 与镜像仓库凭据做环境隔离。
  • Job 的资源也可独立于应用服务调优。

三、这套配置的关键机制(总结)

  • base 负责“公共能力”,overlay 负责“环境差异”,降低重复配置。
  • Service selector + Pod labels 的一致性是流量路由正确的前提。
  • HPAresources 要配套,不然扩缩容效果会失真。
  • JobDeployment 分离是合理设计:一个常驻服务,一个一次性流程。
  • 通过 namespace + env label + imagePullSecrets 三件套实现环境隔离与发布安全。