【问题标题】:Kubernetes doesn't schedule pod to the node with less workloadKubernetes 不会将 Pod 调度到工作量较少的节点上
【发布时间】:2020-11-06 20:41:46
【问题描述】:

我使用 AKS 来创建我们的集群,其中包含 3 个工作节点,它们的名称分别是 node-0node-1、节点 2。它们由 Azure VMSS 创建。

当我通过 Helm 部署 pod-new 时,调度程序总是将 pod-new 调度到 node-0node -2 即使那些工作量大的节点。

假设 node-0node-2 上有一个 pod-old,这将导致 pod-old 被驱逐,但仍未重新安排到 node-1。我需要明确使用 nodeSelector 将其移动到 node-1

下面是我的 deployment.yaml。为了获得更好的资源使用率,我没有指定requestlimit,因为我的 pod 需要更高的 cpu-burst 来进行初始化。初始化后,它只需要一点资源来服务请求。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: aks-service
  labels:
    helm.sh/chart: service-0.1.0
    app.kubernetes.io/name: service
    app.kubernetes.io/instance: aks
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  minReadySeconds: 10
  selector:
    matchLabels:
      app.kubernetes.io/name: service
      app.kubernetes.io/instance: aks
  template:
    metadata:
      labels:
        app.kubernetes.io/name: service
        app.kubernetes.io/instance: aks
    spec:
      imagePullSecrets:
        - name: custom
      serviceAccountName: account-with-azure-cr
      securityContext:
        fsGroup: 2000
        runAsGroup: 3000
        runAsUser: 1000
      containers:
        - name: frontend
          image: imageurl
          imagePullPolicy: IfNotPresent
          ports:
            - name: port-frontend
              containerPort: 3000
              protocol: TCP
      terminationGracePeriodSeconds: 30
      volumes:
        - name: varlog
          hostPath:
            path: /var/log
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers
        - name: varlogpod
          hostPath:
            path: /var/log/pods

【问题讨论】:

  • 是的,我对 AKS 也有同样的经历,这是唯一的出路。该文档仅列出了用于调度的多种算法,本质上它将选择哪一种是需要研究的。我还手动将 Pod 从一个节点重新调度到另一个节点,而不使用节点关联
  • 您的节点是否具有相同的标签并且在一个可用区中?
  • @Rico 标签上有两个不同的值,一个是可用区,另一个是主机名。 node-0、node-1、node-2依次在zone-0、zone-1、zone-2中。
  • 所有节点共享kubectl describe node nodename的输出

标签: kubernetes google-kubernetes-engine amazon-eks azure-aks


【解决方案1】:

为了让 Kubernetes 了解资源利用率,使用了 requests 数据。您可以从 link 阅读 AKS 提到的最佳实践。

Requests 告诉 kubernetes 阻止一些资源来运行 Pod。我猜当您说提供服务时,您只是在谈论 pod,因为 pod 是这里的工作单元(服务是将流量重定向到适当的 pod 的负载均衡器抽象)。即使您的 pod 需要的资源非常少,您也可以在请求中提及它们。限制是 k8s 将强制执行的(因此在您的情况下不需要),但请求应该是必须的。

引用以上文档

在您的 pod 规范中,根据上述信息定义这些请求和限制是最佳做法并且非常重要。如果您不包含这些值,则 Kubernetes 调度程序无法考虑您的应用程序在做出调度决策时所需的资源。

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 2021-04-06
    • 2019-09-21
    • 2020-04-10
    • 1970-01-01
    • 2019-03-09
    • 2019-09-10
    • 2018-02-09
    • 2018-07-21
    相关资源
    最近更新 更多