1

我是 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 应用资源请求吗?

4

2 回答 2

0

感谢您的回复,我同意自定义调度程序的实现基本上涉及您如何将 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
})
...
于 2018-07-25T12:50:54.247 回答
0

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

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

于 2018-07-25T12:10:35.963 回答