
摘要: 本文将详细阐述如何在 Kubernetes (K8s) 集群中,使用一套标准的 YAML 配置文件作为模板,为开发(dev)、测试(test)和生产(prod)三个环境快速部署相互隔离且具备自动扩缩容能力的 NGINX 服务。我们将深入解析 Deployment、Service 和 HorizontalPodAutoscaler (HPA) 的核心配置,并提供一套完整的实施与验证流程。
一、 背景与目标
在现代软件开发流程中,多环境管理是保障应用质量和稳定性的基石。通过在 K8s 中使用命名空间(Namespace)进行环境隔离,可以有效避免配置冲突和资源抢占。我们的目标是:
- 创建
dev,test,prod三个命名空间。 - 基于一个统一的
nginx-stack.yaml模板文件进行部署。 - 为每个环境的 NGINX 服务配置 HPA,实现根据 CPU 负载自动扩缩容。
二、 核心部署文件解析 (nginx-stack.yaml)
这是我们部署的核心,它将 Deployment、Service 和 HPA 资源定义在同一个文件中,方便管理。以下是针对 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%时,开始扩容
配置关键点解析:
namespace: prod: 这是实现环境隔离的核心字段。部署到不同环境时,我们只需修改此值。resources.requests:Deployment中必须为容器设置资源请求(requests),特别是cpu。HPA 正是根据(Pod当前CPU使用量 / Pod的CPU请求量)来计算averageUtilization的。若不设置,HPA 将无法工作。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-hpa 的 TARGETS 列显示了当前的 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,实现了一套标准、可复用、高可用的多环境部署方案。这种声明式、自动化的方法极大地提高了部署效率和系统的弹性,是云原生应用管理的最佳实践之一。


高可用 NGINX 服务&spm=1001.2101.3001.5002&articleId=149808025&d=1&t=3&u=a7b0c5e4c3eb433a88d99536f9d5475f)
7136

被折叠的 条评论
为什么被折叠?



