K8s 实战:基于单 YAML 文件模板部署多环境(Dev/Test/Prod)高可用 NGINX 服务

在这里插入图片描述

摘要: 本文将详细阐述如何在 Kubernetes (K8s) 集群中,使用一套标准的 YAML 配置文件作为模板,为开发(dev)、测试(test)和生产(prod)三个环境快速部署相互隔离且具备自动扩缩容能力的 NGINX 服务。我们将深入解析 DeploymentServiceHorizontalPodAutoscaler (HPA) 的核心配置,并提供一套完整的实施与验证流程。

一、 背景与目标

在现代软件开发流程中,多环境管理是保障应用质量和稳定性的基石。通过在 K8s 中使用命名空间(Namespace)进行环境隔离,可以有效避免配置冲突和资源抢占。我们的目标是:

  1. 创建 dev, test, prod 三个命名空间。
  2. 基于一个统一的 nginx-stack.yaml 模板文件进行部署。
  3. 为每个环境的 NGINX 服务配置 HPA,实现根据 CPU 负载自动扩缩容。
二、 核心部署文件解析 (nginx-stack.yaml)

这是我们部署的核心,它将 DeploymentServiceHPA 资源定义在同一个文件中,方便管理。以下是针对 prod 环境的模板文件:

# nginx-stack.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: prod  # <-- 关键点1: 指定部署的命名空间
spec:
  replicas: 1 # 初始Pod数量
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          # 关键点2: 必须设置资源请求,这是HPA计算利用率的基础
          requests:
            cpu: "200m" # 请求0.2个CPU核心
          limits:
            cpu: "500m" # 限制最多使用0.5个CPU核心
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: prod # <-- 同样指定命名空间
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
  namespace: prod # <-- 同样指定命名空间
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment # 目标是上面定义的Deployment
  minReplicas: 1 # 最小Pod数量
  maxReplicas: 5 # 最大Pod数量
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        # 关键点3: HPA扩容阈值
        averageUtilization: 50 # 当CPU平均利用率超过50%时,开始扩容

配置关键点解析:

  1. namespace: prod: 这是实现环境隔离的核心字段。部署到不同环境时,我们只需修改此值。
  2. resources.requests: Deployment 中必须为容器设置资源请求(requests),特别是 cpu。HPA 正是根据 (Pod当前CPU使用量 / Pod的CPU请求量) 来计算 averageUtilization 的。若不设置,HPA 将无法工作。
  3. averageUtilization: 50: 当所有 Pod 的 CPU 平均利用率超过 50% 时,HPA 会启动扩容流程,增加 Pod 副本,直到利用率降至 50% 以下或达到 maxReplicas
三、 实施部署规划
步骤 1:创建命名空间

首先,创建我们的三个目标环境。

kubectl create namespace dev
kubectl create namespace test
kubectl create namespace prod
步骤 2:为各环境准备配置文件

我们将 nginx-stack.yaml 作为模板。为每个环境创建一个副本,并进行差异化配置。

  • nginx-stack.dev.yaml:
    • 将所有 namespace 字段修改为 dev
    • 可适当降低资源配置,例如 replicas: 1, maxReplicas: 2
  • nginx-stack.test.yaml:
    • 将所有 namespace 字段修改为 test
    • 配置可以介于 dev 和 prod 之间,例如 replicas: 1, maxReplicas: 3
  • nginx-stack.prod.yaml:
    • 使用我们模板中的 prod 配置,replicas: 1, maxReplicas: 5

提示:在大型项目中,推荐使用 Kustomize 或 Helm 等工具来管理这种环境差异化配置,而不是手动复制和修改文件。

步骤 3:执行部署

在每个环境中应用对应的配置文件。

# 部署到开发环境
kubectl apply -f nginx-stack.dev.yaml

# 部署到测试环境
kubectl apply -f nginx-stack.test.yaml

# 部署到生产环境
kubectl apply -f nginx-stack.prod.yaml
四、 验证与测试
1. 检查部署状态

分别检查三个命名空间中的资源是否都已成功创建。

# 检查prod环境的部署、Pod和服务
kubectl get deployment,pod,svc -n prod

# 检查prod环境的HPA状态
kubectl get hpa -n prod

您应该能看到 nginx-hpaTARGETS 列显示了当前的 CPU 利用率(初始可能为 <unknown>/50%,稍等片刻即可获取)。

2. 模拟负载,触发自动扩容

现在,我们对 prod 环境进行压力测试,观察 HPA 是否生效。

首先,在一个终端窗口中启动对 HPA 的监控:

watch kubectl get hpa -n prod

然后,在另一个终端窗口中,运行一个临时的 Pod 来对 nginx-service 发起连续请求:

# -n prod 指定在prod命名空间中运行
kubectl run -n prod --generator=run-pod/v1 loader --image=busybox -- -it --rm /bin/sh -c "while true; do wget -q -O- http://nginx-service; done"

几分钟内,您会看到监控窗口中 HPA 的 TARGETS CPU 利用率飙升超过 50%,并且 REPLICAS 数量开始自动增加,直至达到 maxReplicas 或 CPU 利用率回落。

在这里插入图片描述

停止负载测试 Pod 后(kubectl delete pod loader -n prod),REPLICAS 数量会在几分钟(默认5分钟)后自动缩减回 minReplicas

在这里插入图片描述

五、 总结

通过本教程,我们成功地利用 K8s 的 Namespace 和 HPA,实现了一套标准、可复用、高可用的多环境部署方案。这种声明式、自动化的方法极大地提高了部署效率和系统的弹性,是云原生应用管理的最佳实践之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值