如何在k8s部署中跨专用和spot实例扩展Pods

40次阅读
没有评论

问题描述

想要在k8s部署中,将Pods部署在专用节点和spot节点上。他希望在扩展Pods时,前两个Pods始终在专用节点上运行,而其余的Pods在spot节点上运行。用户希望通过这种方式来提高平台的成本和可靠性。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

您可以按照以下步骤来实现:
1. 使用Cluster Autoscaler来自动扩展和缩减节点。Cluster Autoscaler会根据需要自动调整节点的数量。
2. 创建多个节点组,每个节点组包含多种实例类型,以便您始终可以获得spot节点。
3. 使用标签和反亲和规则来将应用程序调度到任何可用的spot节点上。
下面是一个示例配置文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your_deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: your_app
  template:
    metadata:
      labels:
        app: your_app
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - your_app
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: your_container
        image: your_image
        # 定义容器的其他配置

在上面的示例中,我们创建了一个Deployment,并指定了2个replica。我们使用了podAntiAffinity来确保同一个Deployment的Pods不会被调度到同一个节点上。这样,我们就可以确保前两个Pods始终在专用节点上运行。
请注意,这个方案并不能保证所有的Pods都在spot节点上运行。它只是确保前两个Pods在专用节点上运行,其余的Pods会根据可用的spot节点进行调度。

方案2

使用脚本或工具来管理节点的选择和调度可能会增加复杂性,并且需要确保节点组的正确设置。
另一种方法是编写脚本或使用工具来控制Pods的调度。您可以使用kubectl命令来手动选择节点,并使用一些第三方工具来管理节点组的选择和调度。
以下是一个简单的bash脚本示例,可以在专用节点上启动前两个Pods,然后在spot节点上启动其余的Pods:

#!/bin/bash
# 创建专用节点的Pods
kubectl run your_pod_1 --image=your_image --replicas=1 --overrides='{"apiVersion":"v1","spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-type","operator":"In","values":["dedicated"]}]}]}}}}}'
kubectl run your_pod_2 --image=your_image --replicas=1 --overrides='{"apiVersion":"v1","spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-type","operator":"In","values":["dedicated"]}]}]}}}}}'
# 创建spot节点的Pods
kubectl run your_pod_3 --image=your_image --replicas=3 --overrides='{"apiVersion":"v1","spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-type","operator":"In","values":["spot"]}]}]}}}}}'

在这个示例中,我们使用kubectl run命令手动创建Pods,并使用--overrides参数来指定Pods的调度规则。我们使用nodeAffinity来选择节点,并将前两个Pods调度到专用节点上,将其余的Pods调度到spot节点上。
请注意,这个方案需要手动管理Pods的调度,并确保节点组的正确设置。

正文完