Azure Kubernetes 服务:在 Spot 节点池被逐出后,如何将 Pod 从 Spot 节点池移动到常规节点池?

时间:2021-03-09 09:29:21

标签: kubernetes yaml azure-aks kubernetes-pod

我总共有 3 个节点池如下:

  1. 数据库池 - 常规节点池
  2. 内容池 - 常规节点池
  3. 内容点池 - 点节点池

最初,内容池具有 0 个节点,并启用了自动调节程序。 我已经在内容点池上部署了一个 nginx pod 部署。它的最小节点数为 1,最大节点数为 3。 nginx的部署文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 2
            preference:
              matchExpressions:
              - key: agentpool
                operator: In
                values:
                - contentspotpool
          - weight: 1
            preference:
              matchExpressions:
              - key: agentpool
                operator: In
                values:
                - contentpool

当内容点池被驱逐时,我希望 内容点池 上的 pod 被转移到内容池。但是,pod 被安排在数据库池..!

谁能告诉我如何实现这一目标?..

另外,我如何设置数据库池以拒绝所有新 Pod?

使用的 AKS 版本 - 1.18.14

1 个答案:

答案 0 :(得分:1)

我决定提供一个社区 Wiki 答案,因为有一个类似的答案但被作者删除了。

在这种情况下,您可以使用 Taints and Tolerations:

<块引用>

污点和容忍度协同工作,以确保 pod 不会被安排到不适当的节点上。一个或多个污点被应用到一个节点;这标志着节点不应接受任何不容忍污点的 Pod。

您可以向数据库池中的节点添加一个 taint 并指定一个 toleration,该 taint 仅用于可以调度的 Pod在数据库池上。


我创建了一个简单的例子来说明它是如何工作的。

我只有一个工作节点,我向这个节点添加了一个特定的 taint

$ kubectl get nodes
NAME                STATUS   ROLES    AGE     
database-pool       Ready    <none>   6m9s  

$ kubectl taint nodes database-pool type=database:NoSchedule
node/database-pool tainted

$ kubectl describe node database-pool | grep -i taint
Taints:             type=database:NoSchedule

仅允许将具有以下 Podstoleration 调度到 database-pool 节点上:

tolerations:
- key: "type"
  operator: "Equal"
  value: "database"
  effect: "NoSchedule"

我创建了两个 Podsweb(不容忍 taint)和 web-with-toleration(容忍 taint):

$ cat web.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: web
  name: web
spec:
  containers:
  - image: nginx
    name: web
    
$ cat web-with-toleration.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: web
  name: web-with-toleration
spec:
  containers:
  - image: nginx
    name: web
  tolerations:
  - key: "type"
    operator: "Equal"
    value: "database"
    effect: "NoSchedule"

$ kubectl apply -f web.yml
pod/web created
$ kubectl apply -f web-with-toleration.yml
pod/web-with-toleration created

最后,我们可以检查哪个 Pod 已被正确调度:

$ kubectl get pods -o wide
NAME                  READY   STATUS    RESTARTS   AGE     IP           NODE                                         
web                   0/1     Pending   0          6m13s   <none>       <none>                                       
web-with-toleration   1/1     Running   0          6m8s    10.76.0.14   database-pool 


可以同时使用 Node affinityTaints 来很好地控制 Pods 在特定节点上的位置。 > <块引用>

节点亲和性,是 Pod 的一个属性,它将它们吸引到一组节点(作为偏好或硬性要求)。 污点则相反——它们允许一个节点排斥一组 Pod。