k8s-1.7版本以上-节点资源限制

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: k8s-1.7版本以上-节点资源限制

前言:


注 意 \color{red}注意注意:集群版本不同,部署方式不同,本文章配置模式为修改初始启动文件,需要重启docker,kubelet服务,慎行!1.21版本过后,支持动态配置node节点调度规则,以yaml形式管理

官网链接

1.限制k8s-node计算资源(修改启动文件方式-适用版本k8s-1.7+):链接地址

2.节点调度驱逐策略(动态配置节点资源规则-使用版本k8s-1.21+):链接地址


借鉴链接:k8s 节点可分配资源限制

kubectl api-versions

用来确认当前版本是否支持动态配置节点调度

查看当前集群apiversion命令可使用的资源类型


前置要求


必须调整为cgroup的管理方式

1.先确认docker的cgroup driver:

# docker info | grep "Cgroup Driver"
Cgroup Driver: cgroupfs


如果确认docker的Cgroup Driver不是 cgroupfs,则可以通过以下方法配置。


2.修改docker配置

{
  "registry-mirrors": ["https://bk6kzfqm.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=cgroupfs"], #修改此处
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}


3.修改kubelet cgroup 驱动systemd为cgroupfs

# vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2"

--cgroup-driver=cgroupfs参数修改成cgroupfs


4.查看kubelet 所有的配置文件

# /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--cgroup-driver=cgroupfs ##修改成cgroupfs


5.重启docker和kubelet

systemctl restart docker && systemctl restart kubelet
##报错的话排查问题
# systemctl status kubelet.service -l
# journalctl   _PID=<pid>


Kubelet Node Allocatable 节点约束资源


1.查看当前节点可用资源

kubectl describe nodes <node_name>
...
Capacity: ##总资源
  cpu:                2
  ephemeral-storage:  99561988Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             4026372Ki
  pods:               110
Allocatable: ##可用资源
  cpu:                2
  ephemeral-storage:  91756327989
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             2868278679 #大概2.6g
  pods:               110
...


2.概念学习

Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和System进程有足够的资源。


目前支持cpu, memory, ephemeral-storage三种资源预留。


Node Capacity是Node的所有硬件资源,kube-reserved是给kube组件预留的资源,system-reserved是给System进程预留的资源, eviction-threshold(阈值)是kubelet eviction(收回)的阈值设定,

allocatable才是真正scheduler调度Pod时的参考值(保证Node上所有Pods的request resource不超过Allocatable)


Node Allocatable Resource = Node Capacity - Kube-reserved - system-reserved - eviction-threshold。


修改后/var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2 \
    --enforce-node-allocatable=pods,kube-reserved,system-reserved \
    --kube-reserved-cgroup=/system.slice/kubelet.service \
    --system-reserved-cgroup=/system.slice \
    --kube-reserved=cpu=0,memory=1000Mi \
    --system-reserved=cpu=1,memory=1000Mi  \
    --eviction-hard=memory.available<5%,nodefs.available<10%,imagefs.available<10% \
    --eviction-soft=memory.available<10%,nodefs.available<15%,imagefs.available<15% \
    --eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m \
    --eviction-max-pod-grace-period=30 \
    --eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi"


参数解释:

--enforce-node-allocatable=pods,kube-reserved,system-reserved

含义:指定kubelet为哪些进程做硬限制,可选的值有:


pods

kube-reserved #给kube组件预留的资源:kubelet,kube-proxy以及docker等

system-reserve #system-reserved:给system进程预留的资源

--kube-reserved-cgroup=/system.slice/kubelet.service

含义:这个参数用来指定k8s系统组件所使用的cgroup。

注意,这里指定的cgroup及其子系统需要预先创建好,kubelet并不会为你自动创建好。

--system-reserved-cgroup=/system.slice

含义:这个参数用来指定系统守护进程所使用的cgroup。

注意,这里指定的cgroup及其子系统需要预先创建好,kubelet并不会为你自动创建好。

--kube-reserved=cpu=1,memory=250Mi  

含义:这里的kube-reserved只为非pod形式启动的kube组件预留资源

--system-reserved=cpu=200m,memory=250Mi

含义:为系统守护进程(sshd, udev等)预留的资源量,

如:–system-reserved=cpu=500m,memory=1Gi,ephemeral-storage=1Gi。

注意,除了考虑为系统进程预留的量之外,还应该为kernel和用户登录会话预留一些内存。

--eviction-hard=memory.available<5%,nodefs.available<10%,imagefs.available<10%

含义:设置进行pod驱逐的阈值,这个参数只支持内存和磁盘。

通过–eviction-hard标志预留一些内存后,当节点上的可用内存降至保留值以下时,

kubelet 将会对pod进行驱逐。

--eviction-soft=memory.available<10%,nodefs.available<15%,imagefs.available<15%

含义:配置 驱逐pod的软阈值

--eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m

含义:定义达到软阈值之后,持续时间超过多久才进行驱逐

--eviction-max-pod-grace-period=30

含义:驱逐pod前最大等待时间=min(pod.Spec.TerminationGracePeriodSeconds, eviction-max-pod-grace-period),单位为秒

--eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi

含义:至少回收的资源量


3.开始修改并生效

修改成合适的值后,保存

# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2 \
    --enforce-node-allocatable=pods,kube-reserved,system-reserved \
    --kube-reserved-cgroup=/system.slice/kubelet.service \
    --system-reserved-cgroup=/system.slice \
    --kube-reserved=cpu=0,memory=100Mi \
    --system-reserved=cpu=1,memory=100Mi  \
    --eviction-hard=memory.available<5%,nodefs.available<10%,imagefs.available<10% \
    --eviction-soft=memory.available<10%,nodefs.available<15%,imagefs.available<15% \
    --eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m \
    --eviction-max-pod-grace-period=30 \
    --eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi"


修改Kubelet启动service文件 /lib/systemd/system/kubelet.service

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/
[Service]
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target


3.重启kubelet 和docker服务,再次查看节点的Capacity和Allocatable

# systemctl restart docker && systemctl restart kubelet
# kubectl describe nodes <node-name>
Addresses:
  InternalIP:  192.168.17.150
  Hostname:    k8s-01
Capacity:
  cpu:                2
  ephemeral-storage:  99561988Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             4026372Ki
  pods:               110
Allocatable:
  cpu:                1
  ephemeral-storage:  91756327989
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             1819702679 #大概1.6g
  pods:               110


对比:

再次声明:需要重启docker和kubelet,生产环境慎行,1.21版本后使用yaml文件动态配置即可

类似于这种方式

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
  memory.available: "500Mi"
  nodefs.available: "1Gi"
  imagefs.available: "100Gi"
evictionMinimumReclaim:
  memory.available: "0Mi"
  nodefs.available: "500Mi"
  imagefs.available: "2Gi"
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
13天前
|
Kubernetes API 调度
k8s中节点无法启动Pod
【10月更文挑战第3天】
48 6
|
2月前
|
存储 Kubernetes Docker
Kubernetes节点资源耗尽状态的处理
Kubernetes节点资源耗尽状态的处理
|
15天前
|
Kubernetes Linux 开发工具
centos7通过kubeadm安装k8s 1.27.1版本
centos7通过kubeadm安装k8s 1.27.1版本
|
1月前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
76 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
15天前
|
Kubernetes 应用服务中间件 Linux
多Master节点的k8s集群部署
多Master节点的k8s集群部署
|
1月前
|
存储 Kubernetes Ubuntu
Ubuntu 22.04LTS版本二进制部署K8S 1.30+版本
这篇文章详细介绍了在Ubuntu 22.04 LTS系统上使用VMware Fusion虚拟化软件部署Kubernetes 1.30+版本的完整过程,包括环境准备、安装containerd、配置etcd、生成证书、部署高可用组件、启动Kubernetes核心组件以及网络插件的部署和故障排查。
98 4
|
2月前
|
存储 Kubernetes 调度
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
|
2月前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
2月前
|
Kubernetes 负载均衡 调度
在K8S中,K8S外部节点访问Pod有哪些方式?
在K8S中,K8S外部节点访问Pod有哪些方式?
|
2月前
|
Kubernetes Unix Linux
k8s将节点容器运行时从Docker迁移到Containerd
k8s将节点容器运行时从Docker迁移到Containerd