【问题标题】:Can I change the limits of compute resources of unscheduled pods, with a custom scheduler in kubernetes我可以使用 kubernetes 中的自定义调度程序更改未调度 Pod 的计算资源限制吗
【发布时间】:2019-01-01 04:26:40
【问题描述】:

我是 Kubernetes 的新手,我正在研究 Kubernetes 集群的计算资源管理。出于这个原因,我在 go 中下载了一个玩具调度程序 (https://github.com/kelseyhightower/scheduler)。我知道一旦将计算资源请求设置为 pod,就无法更改它们。但是,假设我没有在 yaml 文件中设置 pod 的资源需求:例如nginx.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      schedulerName: hightower
      containers:
      - name: nginx
        image: nginx
        ports:
          - containerPort: 8080
            protocol: TCP

我可以为自定义调度程序尝试调度的每个 pod 应用资源请求吗?

【问题讨论】:

    标签: kubernetes-go-client


    【解决方案1】:

    根据Kubernetes官方Documentation,为了管理集群中的计算资源,您必须在PodDeployment中相应地指定CPUMemory的最大数量等资源类型(如果您考虑制作 ReplicaSets) 清单文件。因此,当您创建Pod 时,Scheduler 会为Pod 选择一个合适的Node 在其上运行,假设请求的资源不会消耗大部分Node 功能。

    自定义调度器可以扩展原生 Kubernetes 调度器的功能和灵活性;但是,他们无法改变如何在 Kubernetes 集群中配置和管理资源请求或资源限制的方法。

    【讨论】:

      【解决方案2】:

      感谢您的回复,我同意自定义调度程序的实现基本上涉及如何将 pod 绑定到节点,但是我认为我也可以在绑定之前对 pod 实施资源限制(如果不存在的话)以及当 pod 等待被调度时。事实证明,我唯一能做的就是使用部署而不是 pod,并更改部署的 pod 模板以应用计算资源限制。这种方式不像我想的那样“干净”,因为挂起的 pod 被销毁,并且 kubernetes 产生了包含资源限制的新 pod。如果有人感兴趣,我就是这样做的

      imports ...
      ...
      
      kubeconfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
              clientcmd.NewDefaultClientConfigLoadingRules(),
              &clientcmd.ConfigOverrides{},
      )
      namespace, _, err := kubeconfig.Namespace()
      if err != nil {
              panic(err.Error())
      }
      restconfig, err := kubeconfig.ClientConfig()
      if err != nil {
              panic(err)
      }
      clientset, err := kubernetes.NewForConfig(restconfig)
      if err != nil {
              panic(err)
      }
      
      ...
      
      deploymentsClient := clientset.AppsV1().Deployments(namespace)
      retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
          d, getErr := deploymentsClient.Get("deployment name",
               metav1.GetOptions{})
          if getErr != nil {
              panic(getErr)
          }
          d.Spec.Template.Spec.Containers[0].Resources.Requests = 
              make(map[v1core.ResourceName]resource.Quantity)
          d.Spec.Template.Spec.Containers[0].Resources.Requests[v1core.ResourceCPU] = 
              *resource.NewQuantity("# of cores", resource.BinarySI)
          _, updateErr := deploymentsClient.Update(d)
          return updateErr
      })
      ...
      

      【讨论】:

        猜你喜欢
        • 2020-10-02
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多