k8s修改默认存储路径及容器存储空间资源限制ephemeral-storage

本文主要是介绍k8s修改默认存储路径及容器存储空间资源限制ephemeral-storage,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

k8s1.8引入的特性,限制容器存储空间的使用;对于容器资源隔离来说,非常有用,万一应用程序失控,写大量日志把node空间写满,影响就大了。

使用很简单,和cpu\memcache一样,如:

 
  1. resources:

  2. requests:

  3. cpu: 1

  4. memory: 2048Mi

  5. ephemeral-storage: 2Gi

  6. limits:

  7. cpu: 2

  8. memory: 2048Mi

  9. ephemeral-storage: 5Gi

但,这玩意生效有条件:

猛一看,ephemeral-storage只能对镜像存放在“根分区”下的容器有效,也就是默认的"Docker Root Dir: /var/lib/docker"必须在根分区下;对于一个正常点的运维来说,程序路径与根分区分离是基本的做法,对于一个有节操的k8s运维来说,将/var/lib/docker用独立分区,再正常不过了。

测试结果如下:

docker Version: 18.09.8
k8s version:1.13.8
Docker Root Dir: /var/lib/docker
kubelet的--root-dir: 默认(/var/lib/kubelet)

/var/lib/docker在根分区下,ephemeral-storage有效果
/var/lib/docker不在根分区下(作为单独分区),ephemeral-storage没有效果

这有点沮丧,这么有用的功能难道不能派上用场,不太相信,求助github,有线索:https://github.com/kubernetes/enhancements/issues/361

其中有这样的回复:

The behavior you describe should work regardless of this feature. Make sure you have --root-dir set correctly. Docker reports its root directory to the kubelet, so as long as your images are stored on the same partition that contains /var/lib/docker (or whatever your docker root dir is), this should work correctly.

这句话貌似有误,/var/lib/docker应该写错了,换成/var/lib/kubelet才好理解,因为/var/lib/kubelet是--root-dir的默认配置,总的来说,意思是只要“Docker Root Dir: /var/lib/docker”和“kubelet --root-dir”在一个分区,就能起作用

测试结果就是如此。

/var/lib/docker是独立分区的情况下,怎样实现kubelet的root-dir与/var/lib/docker一个分区呢?两个选择:

方案1. 修改root-dir

kubectl drain nodename
systemctl stop docker
systemctl stop kubelet修改/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf:
增加--root-dir=/var/lib/docker/kubelet/
将/var/lib/kubelet/修改为/var/lib/docker/kubelet/修改/etc/kubernetes/kubelet.conf
将/var/lib/kubelet/修改为/var/lib/docker/kubelet/mv /var/lib/kubelet /var/lib/dockersystemctl daemon-reload
systemctl start docker
systemctl start kubelet

有个遗留问题,重启kubelet后,又自动生产了以下目录,但kubelet运行正常

 
  1. # tree /var/lib/kubelet -L 3

  2. /var/lib/kubelet

  3. └── device-plugins

  4. ├── DEPRECATION

  5. ├── kubelet_internal_checkpoint

  6. └── kubelet.sock

 

方案2.root-dir软链到/var/lib/docker下

kubectl drain nodename
systemctl stop docker
systemctl stop kubeletmv /var/lib/kubelet /var/lib/docker
ln -s /var/lib/kubelet /var/lib/docker/kubeletsystemctl start docker
systemctl start kubelet
systemctl uncordon nodename

PS:上述mv操作前,先df确认下是否有/var/lib/kubelet下的文件被mount,有则先umount再mv,否则报错“Device or resource busy”

# mv kubelet/ /var/lib/docker
mv: cannot remove ‘kubelet/pods/73a3d42a-b2a5-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/kube-proxy-token-jccg4’: Device or resource busy
mv: cannot remove ‘kubelet/pods/73a36f7a-b2a5-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/etcd-certs’: Device or resource busy
mv: cannot remove ‘kubelet/pods/73a36f7a-b2a5-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/calico-node-token-tzfv8’: Device or resource busy
mv: cannot remove ‘kubelet/pods/e2542d86-ceef-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/node-exporter-token-5926x’: Device or resource busy# df -h
tmpfs                        20517564       0  20517564   0% /var/lib/kubelet/pods/73a3d42a-b2a5-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/kube-proxy-token-jccg4
tmpfs                        20517564       0  20517564   0% /var/lib/kubelet/pods/73a36f7a-b2a5-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/etcd-certs
tmpfs                        20517564       0  20517564   0% /var/lib/kubelet/pods/73a36f7a-b2a5-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/calico-node-token-tzfv8
tmpfs                        20517564       0  20517564   0% /var/lib/kubelet/pods/e2542d86-ceef-11e9-8e8d-005056b4f9d3/volumes/kubernetes.io~secret/node-exporter-token-5926

测试结果:

在容器中dd生成一个5G的文件,终于可以evicted了。

# kubectl get pods -o wide                          
NAME                           READY   STATUS    RESTARTS   AGE     IP              NODE                   NOMINATED NODE   READINESS GATES
ptest-trade-747b894f54-mhrv4   0/1     Evicted   0          3m37s   <none>          lin-40-16-206.lb.com   <none>           <none>
ptest-trade-747b894f54-tx847   0/1     Running   0          26s     10.46.206.96    lin-40-16-206.lb.com   <none>           <none># kubectl describe pod p7881-trade-747b894f54-mhrv4 
Events:Warning  Evicted              12s  kubelet, lin-40-16-206.lb.com  Pod ephemeral local storage usage exceeds the total limit of containers 5Gi.Warning  ExceededGracePeriod  2s   kubelet, lin-40-16-206.lb.com  Container runtime did not kill the pod within specified grace period.Normal   Killing              1s   kubelet, lin-40-16-206.lb.com  Killing container with id docker://ptest-trade:Need to kill Pod

 

这篇关于k8s修改默认存储路径及容器存储空间资源限制ephemeral-storage的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/308854

相关文章

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k