实现Kubernetes中的抢占式Pod与固定Pod的弹性伸缩:一项全面指南

时间:2024-10-21 11:53:50

个人名片
在这里插入图片描述
????作者简介:java领域优质创作者
????个人主页码农阿豪
????工作室:新空间代码工作室(提供各种软件服务)
????个人邮箱:[2435024119@]
????个人微信:15279484656
????个人导航网站
????座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结????????????️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用????????????
Redis专栏:Redis从零到一学习分享,经验总结,案例实战????????????
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有????????????

目录

    • 实现Kubernetes中的抢占式Pod与固定Pod的弹性伸缩:一项全面指南
      • 背景介绍
      • 环境和需求概述
      • 步骤和配置
        • 1. 固定现有两个Deployment的Pod数量
        • 2. 新增使用抢占式Pod的Deployment
        • 3. 配置 HPA 来管理抢占式 Deployment
        • 4. 确保共享 CPU 指标
      • 总结

实现Kubernetes中的抢占式Pod与固定Pod的弹性伸缩:一项全面指南

在现代云计算环境中,优化资源使用和成本是关键。Kubernetes作为一个强大的容器编排平台,提供了丰富的功能来管理和扩展应用程序。尤其是,当我们希望在保证业务连续性的同时,降低成本并优化资源利用时,抢占式(或称竞价)Pod的使用就显得尤为重要。在本文中,我们将探讨如何在Kubernetes环境中实现抢占式Pod与固定Pod的弹性伸缩,并提供详细的步骤和配置示例。

背景介绍

Kubernetes通过部署(Deployment)和水平Pod自动扩展(HPA)等功能,允许我们根据实际的工作负载动态地调整Pod的数量。这对于处理不断变化的流量和业务需求至关重要。然而,在一些情况下,我们希望将业务流量分配到不同类型的节点上,以实现成本节约和资源优化。例如,腾讯云的抢占式(竞价)实例提供了显著的成本优势,但其特性是这些实例可能会被回收,这就要求我们对这些Pod进行特殊的处理和配置。

环境和需求概述

在本文中,我们的Kubernetes环境包含以下主要组件:

  1. 节点池:目前,环境中只有一个超级节点池,没有抢占式Pod的支持。
  2. 业务结构:有两个Deployment(一个主查日志,一个用于扩缩容),它们使用相同的Selector标签。
  3. 弹性伸缩:通过Horizontal Pod Autoscaler(HPA)来依据CPU指标对其中一个Deployment进行弹性伸缩。

我们的目标是:

  1. 将现有两个Deployment中的Pod数量固定。
  2. 新增一个Deployment,使用抢占式Pod来运行相同的业务。
  3. 共享所有Deployment的CPU指标。
  4. 对新增的Deployment使用抢占式Pod,并实现弹性伸缩。
  5. 确保原有的Deployment内Pod数量固定,并基于整体CPU使用情况调整抢占式Deployment的Pod数量。

步骤和配置

1. 固定现有两个Deployment的Pod数量

首先,我们需要确保两个现有的Deployment(主查日志和扩缩容)的Pod数量是固定的。这样做可以确保业务的稳定性,而不受弹性伸缩策略的影响。

主查日志 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment-main
spec:
  replicas: 10  # 固定为 10
  selector:
    matchLabels:
      app: test-deployment
  template:
    metadata:
      labels:
        app: test-deployment
    spec:
      containers:
      - name: main
        image: /advertise/api-test:latest
        resources:
          requests:
            cpu: "4"
            memory: 8Gi
          limits:
            cpu: "4"
            memory: 8Gi

扩缩容 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment-scale
spec:
  replicas: 10  # 固定为 10
  selector:
    matchLabels:
      app: test-deployment
  template:
    metadata:
      labels:
        app: test-deployment
    spec:
      containers:
      - name: main
        image: /advertise/api-index:latest
        resources:
          requests:
            cpu: "4"
            memory: 8Gi
          limits:
            cpu: "4"
            memory: 8Gi
2. 新增使用抢占式Pod的Deployment

接下来,我们创建一个新的Deployment,运行相同的业务代码,但配置它使用抢占式节点池。这可以通过在Pod模板中添加节点选择器(nodeSelector)来实现。

抢占式 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment-preemptible
spec:
  replicas: 0  # 初始时不创建任何 Pod
  selector:
    matchLabels:
      app: test-deployment
  template:
    metadata:
      labels:
        app: test-deployment
    spec:
      nodeSelector:
        type: preemptible  # 确保使用抢占式节点
      containers:
      - name: main
        image: /advertise/api-test:latest
        resources:
          requests:
            cpu: "4"
            memory: 8Gi
          limits:
            cpu: "4"
            memory: 8Gi
3. 配置 HPA 来管理抢占式 Deployment

为了实现弹性伸缩,我们需要配置水平Pod自动扩展(HPA)。HPA可以依据CPU使用率等指标动态调整Pod的数量。

HPA 配置

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: test-deployment-preemptible-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-deployment-preemptible
  minReplicas: 0
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50  # 设置 CPU 使用率超过 50% 时扩容
4. 确保共享 CPU 指标

所有的Deployment共享相同的CPU指标,是通过相同的selector标签来实现的。由于selector标签一致,Kubernetes会将这些Pod视为同一组,从而可以使用相同的CPU指标。

总结

在本文中,我们探讨了如何在Kubernetes环境中实现抢占式Pod与固定Pod的弹性伸缩。通过固定现有两个Deployment的Pod数量,新建一个使用抢占式Pod的Deployment,并配置水平Pod自动扩展(HPA),我们可以在保证业务连续性的同时,利用抢占式节点池实现成本优化。

这种配置不仅能帮助我们降低成本,还能确保在业务需求变化时,能够动态调整资源使用,提高资源利用效率。在实际应用中,务必根据具体的业务需求和环境配置进行调整和优化,确保系统的稳定性和性能。

希望这篇指南对你在Kubernetes环境中管理和优化Pod的使用有所帮助。如果有任何问题或需要进一步的帮助,请随时联系我。