十二、Pod的扩缩容-手动/自动-HPA

在实际生产系统中,经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。此时可以利用Deployment/RC的Scale机制来完成这些工作。

Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过运行kubectl scale命令或通过RESTful API对一个Deployment/RC进行Pod副本数量的设置,即可一键完成。自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整。

一、手动扩缩容机制

测试文件,pod副本数量为3个

apiVersion: apps/v1
kind: Deployment                         # Deployment类型
metadata:
  name: nginx-deployment                 # Deployment名称
  labels:                                # Deployment标签
    app: nginx
spec:                                    # Deployment配置
  replicas: 3                            # Deployment的副本
  selector:
    matchLabels:
      app: nginx                         # Deployment管理的Pod标签
  template:                              # Pod的定义
    metadata:
      labels:                            # Pod的标签
        app: nginx
    spec:                                # Pod的配置
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/cyanjiang/nginx:1.0
        ports:
        - containerPort: 80

创建并查看

[root@k8s-master01 scahpa]#kubectl create -f deploy.yaml
deployment.apps/nginx-deployment created
[root@k8s-master01 scahpa]#kubectl get po
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5ddfc76b5c-fqlgt   1/1     Running   0          8s
nginx-deployment-5ddfc76b5c-fxldw   1/1     Running   0          8s
nginx-deployment-5ddfc76b5c-qfs2q   1/1     Running   0          8s
[root@k8s-master01 scahpa]#kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           92s


方式一:scale

通过kubectl scale命令可以将Pod副本数量从初始的3个更新为5个:

[root@k8s-master01 scahpa]#kubectl scale deployment nginx-deployment --replicas=6
deployment.apps/nginx-deployment scaled
[root@k8s-master01 scahpa]#kubectl get po
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5ddfc76b5c-7xkj2   1/1     Running   0          7s
nginx-deployment-5ddfc76b5c-fqlgt   1/1     Running   0          2m24s
nginx-deployment-5ddfc76b5c-fxldw   1/1     Running   0          2m24s
nginx-deployment-5ddfc76b5c-nckgx   1/1     Running   0          7s
nginx-deployment-5ddfc76b5c-qfs2q   1/1     Running   0          2m24s
nginx-deployment-5ddfc76b5c-xfgdm   1/1     Running   0          7s

将–replicas的值设置为比当前Pod副本数量更小的数字,系统将会“杀掉”一些运行中的Pod,以实现应用集群缩容:

[root@k8s-master01 scahpa]#kubectl scale deployment nginx-deployment --replicas=1
deployment.apps/nginx-deployment scaled
[root@k8s-master01 scahpa]#kubectl get po
NAME                                READY   STATUS        RESTARTS   AGE
nginx-deployment-5ddfc76b5c-fqlgt   1/1     Terminating   0          3m22s
nginx-deployment-5ddfc76b5c-fxldw   0/1     Terminating   0          3m22s
nginx-deployment-5ddfc76b5c-nckgx   0/1     Terminating   0          65s
nginx-deployment-5ddfc76b5c-qfs2q   1/1     Running       0          3m22s
nginx-deployment-5ddfc76b5c-xfgdm   1/1     Terminating   0          65s
[root@k8s-master01 scahpa]#kubectl get po
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5ddfc76b5c-qfs2q   1/1     Running   0          3m33s

方式二:edit

使用kubectl edit,编辑正在运行的deploy中replicas数量。

[root@k8s-master01 scahpa]#kubectl edit deploy nginx-deployment
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2024-11-29T11:15:19Z"
  generation: 3
  labels:
    app: nginx
  name: nginx-deployment
  namespace: default
  resourceVersion: "28395402"
  uid: 4124b756-6803-4671-8fd7-35b59f6040ae
<think>好的,我现在需要处理用户的问题:在Linux Kubernetes中配置Deployment、StatefulSet和HPA来调整Pod的数量和配置,并设置基于特定API请求量以及目标CPU和内存利用率。首先,我要确认用户的需求是什么。他们可能想要自动扩展他们的应用,根据流量或资源使用情况动态调整Pod数量,同时确保有状态的应用程序也能正确扩展。用户还提到基于特定API的请求量,这可能指的是使用自定义的指标来触发扩展,而不仅仅是CPU和内存。 首先,我需要回顾Kubernetes中的这几个组件。Deployment用于无状态应用的部署和管理,支持滚动更新和回滚,可以通过replicas字段调整Pod数量。StatefulSet适用于有状态应用,每个Pod有稳定的标识符和持久存储。HPA(Horizontal Pod Autoscaler)则根据资源使用情况或自定义指标自动调整Pod副本数。 接下来,用户提到的设置基于特定API的请求量,这可能涉及到HPA使用自定义指标。Kubernetes HPA默认支持CPU和内存,但若想根据其他指标如HTTP请求量,需要配置Metrics Server以及可能自定义的适配器,比如Prometheus Adapter,将自定义指标提供给HPA。 然后,设置Pod的目标CPU和内存利用率,这需要在HPA配置中指定目标资源使用率。例如,设置CPU利用率为50%,当Pod的平均CPU使用超过这个值时,HPA会增加Pod数量。 现在,我需要考虑用户可能的实际应用场景。比如,一个Web应用在流量高峰时需要自动扩展,而在低谷时缩减以节省资源。对于有状态的应用,比如数据库,使用StatefulSet来保证每个Pod有唯一的网络标识和持久存储。同时,他们可能希望根据特定API的调用次数来触发扩展,比如某个关键接口的请求量突增时自动增加Pod。 接下来,我需要组织回答的结构,确保步骤清晰。首先介绍每个组件的作用,然后分别说明如何配置Deployment、StatefulSet,接着是HPA的设置,包括基于CPU/内存和自定义指标。同时,需要注意YAML文件的正确性,以及相关命令的执行步骤。 在思考过程中,可能会遇到一些问题,比如如何正确配置Metrics Server和Prometheus Adapter,用户是否已经具备这些组件,或者是否需要额外安装。如果用户的环境没有这些工具,可能需要补充安装步骤,但用户的问题中没有提到,所以可能需要假设用户已经具备基础环境,或者在回答中简要提及所需的先决条件。 另外,关于StatefulSet的扩展,需要说明它与Deployment的不同之处,比如每个Pod的持久化存储和顺序性。而HPA部分,需要区分v1和v2版本的API,因为v2支持多指标,而用户可能需要使用v2来同时处理CPU、内存和自定义指标。 最后,验证部分需要指导用户如何检查HPA的状态,如何测试自动扩展是否生效,比如通过增加负载来观察Pod数量的变化。同时,需要注意用户可能遇到的常见问题,比如指标无法获取,HPA不生效的原因,如资源请求未设置,或者Metrics Server未正确安装。 总结,回答需要涵盖以下几点: 1. Deployment和StatefulSet的基本配置和区别。 2. HPA的配置,包括基于CPU/内存和自定义API请求量。 3. 相关组件的安装和配置步骤(如Metrics Server、Prometheus Adapter)。 4. 示例YAML文件和命令。 5. 验证和测试步骤。 6. 注意事项和常见问题。 需要确保步骤清晰,代码示例正确,并且语言简洁明了,适合不同层次的用户理解。同时,按照用户之前的格式,使用标题和代码块,保持结构一致。</think>--- ### **一、核心组件概述** 1. **Deployment** - 管理无状态应用的Pod副本,支持滚动更新、回滚 - 通过`replicas`字段直接控制Pod数量 - 示例场景:Web服务、API服务等无状态应用 2. **StatefulSet** - 管理有状态应用的Pod,每个Pod有唯一标识(如顺序编号)和持久化存储 - 适用于数据库(MySQL、Redis)、分布式存储等 - 扩缩容时按顺序操作,保证数据一致性 3. **HPA(Horizontal Pod Autoscaler)** - 根据CPU/内存使用率或自定义指标自动调整Pod数量 - 支持多指标混合判断(如CPU利用率+每秒请求量) --- ### **二、配置Deployment与StatefulSet** #### **1. Deployment配置示例** ```yaml # deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web-app spec: replicas: 3 # 初始Pod数量 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 resources: requests: # HPA依赖此字段计算资源利用率 cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi" ``` 应用配置: ```bash kubectl apply -f deployment.yaml ``` #### **2. StatefulSet配置示例** ```yaml # statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: "mysql-service" replicas: 2 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "password" volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: # 每个Pod自动创建PVC - metadata: name: mysql-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi ``` 应用配置: ```bash kubectl apply -f statefulset.yaml ``` --- ### **三、配置HPA实现自动扩缩容** #### **1. 基于CPU/内存的HPA** ```yaml # hpa-basic.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: web-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-app minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization # 目标CPU利用率 averageUtilization: 50 # 阈值设为50% - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 # 内存利用率阈值70% ``` 应用配置: ```bash kubectl apply -f hpa-basic.yaml ``` #### **2. 基于自定义API请求量的HPA** *需预先部署Metrics Server和Prometheus Adapter* **步骤说明:** 1. 安装Metrics Server(收集基础资源指标) ```bash kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml ``` 2. 安装Prometheus Adapter(转换自定义指标) ```bash helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prom-adapter prometheus-community/prometheus-adapter ``` 3. 定义自定义指标规则(例如`http_requests_total`) ```yaml # custom-metrics-config.yaml rules: - seriesQuery: 'http_requests_total{namespace!="",pod!=""}' resources: overrides: namespace: { resource: "namespace" } pod: { resource: "pod" } name: matches: "^(.*)_total" as: "${1}_per_second" metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)' ``` 4. 创建基于请求量的HPA ```yaml # hpa-custom.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: web-app-hpa-custom spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-app minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: http_requests_per_second # Prometheus中的指标名 target: type: AverageValue averageValue: 100 # 每秒每个Pod处理100个请求 ``` --- ### **四、验证与调试** #### **1. 查看HPA状态** ```bash kubectl get hpa ``` 输出示例: ``` NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE web-app-hpa Deployment/web-app 50%/50%, 70%/70% 1 10 3 5m web-app-hpa-custom Deployment/web-app 100/100 (avg) 1 10 3 2m ``` #### **2. 压力测试触发扩容** ```bash # 使用工具模拟高负载 kubectl run -it --rm load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://web-app-service; done" ``` #### **3. 观察Pod数量变化** ```bash watch kubectl get pods ``` --- ### **五、关键注意事项** 1. **资源请求(Requests)必须设置** HPA依赖容器的`resources.requests`计算利用率,未设置会导致HPA失效 2. **指标采集间隔** Metrics Server默认15秒采集一次,调整参数需修改其部署配置: ```yaml args: - --metric-resolution=30s # 改为30秒采集一次 ``` 3. **StatefulSet扩缩容顺序** - 扩容时按顺序创建Pod(0,1,2,...) - 缩容时按逆序终止Pod(...,2,1,0) 4. **自定义指标兼容性** - 确保Prometheus Adapter的指标名称与HPA配置匹配 - 验证指标可用性: ```bash kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests_per_second" ``` --- ### **六、架构示意图** ``` 用户请求 | v [ HPA控制器 ] ├── 监控指标源(CPU/内存 → Metrics Server) └── 监控自定义指标(HTTP请求 → Prometheus Adapter) | v [ Deployment/StatefulSet ] | v [ Pods (自动扩缩容) ] ``` 通过以上配置,您的应用将实现: - 手动调整`replicas`控制Pod数量 - 基于CPU/内存的自动弹性扩缩容 - 结合业务指标(如API请求量)的精细化扩缩策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyan_Jiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值