Pod 和容器的资源管理描述如何为 Kubernetes 中的“常规”pod 设置资源请求和限制。是否有支持/推荐的方法来为 kube-apiserver 等控制平面组件设置这些限制?
我考虑的事情:
- 修改静态清单,例如。此操作可行,但下次升级时
/etc/kubernetes/manifests/kube-apiserver.yaml
将被覆盖。kubeadm
- 环境
kube-reserved
或system-reserved
旗帜。但是,这也可以再次起作用 - 它们仅在一个 ConfigMap 中定义(例如kubelet-config-1.21
),并将在kubeadm
节点升级期间被覆盖。相同的限制将适用于控制平面节点和工作节点,而我不希望这样。
我可以使用类似 ansible 的东西来克服这个问题,但是 ansible 将与 kubeadm“冲突”,我想避免这种情况。
我正在尝试解决什么问题?
我有一个小型家庭实验室 kubernetes 安装。我想允许在控制平面节点上运行常规 pod,但我希望能够为控制平面组件保留一些资源(主要是内存)。即我希望能够设置requests
诸如 kube-apiserver 之类的东西,以便调度程序知道不要将任何其他 pod(它们也将具有适当的requests
)放在其位置。
答案1
是否有支持/推荐的方法来为控制平面组件(例如 kube-apiserver)设置这些限制?
是的,你可以使用kubeadm init
命令patches
行标志。看看这个 GitHub 页面。 这文档对此内容可能也感兴趣。另请参阅官方文档:使用补丁定制控制平面:
Kubeadm 允许您将包含补丁文件的目录传递到
InitConfiguration
各个JoinConfiguration
节点。这些补丁可用作将控制平面组件清单写入磁盘之前的最后一个自定义步骤。您可以将此文件传递
kubeadm init
给--config <YOUR CONFIG YAML>
:
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
patches:
directory: /home/user/somedir
以下是如何在 kube-apiserver 上设置资源的示例:
kube-apiserver.yaml
在某些目录中创建文件(例如/home/user/patches
),其内容如下:
spec:
containers:
- name: kube-apiserver
resources:
requests:
memory: 512Mi
limits:
memory: 1024Mi
然后在每次节点升级期间使用 --patches 标志:使用kubeadm upgrade node --patches /home/user/patches/
或kubeadm upgrade apply v1.22.4 --patches /home/user/patches/
另一个选项是向控制平面组件提供额外的标志。为此,请查看本指南:使用 ClusterConfiguration 中的标志自定义控制平面:
kubeadm
ClusterConfiguration
对象为用户提供了一种方法来覆盖传递给控制平面组件(例如 APIServer、ControllerManager、Scheduler 和 Etcd)的默认标志。这些组件使用以下结构定义:
apiServer
controllerManager
scheduler
etcd