k8s容器资源设置

之前理解错了k8s给容器配置的一些配置项。阅读一下kubernetes官方文档

https://kubernetes.io/zh-cn/docs/concepts/configuration/manage-resources-containers/

容器资源设置

当定义pod时,可以设定每个容器所需要的资源数量,如CPU和内存大小

其中resources有两项配置:requests和limits

javascript 复制代码
resources:
  limits:
    cpu: '1'
    memory: 8Gi
  requests:
    cpu: 50m
    memory: 500Mi

request配置决定了kube-scheduler将pod调度到哪个节点上

当你为container指定了limit后,kubelet将会确保运行的容器不会使用超过所涉限制的资源

即:requests决定去哪个节点,limits决定了docker的占用资源

pod可以使用超出requests的资源,但无法超过limits设置的资源

例:配置memory的limit为4G,容器运行时的最大内存占用就是4G,一旦docker的进程尝试使用更多的内存就会OOM

本地临时性存储设置

临时性本地数据:emptyDir卷、可写入容器层、容器镜像、日志

可以为本地临时性存储设置请求和限制

javascript 复制代码
spec.containers[].resources.limits.ephemeral-storage
spec.containers[].resources.requests.ephemeral-storage

举例:

javascript 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  volumes:
    - name: ephemeral
      emptyDir:
        sizeLimit: 500Mi

该pod包含两个容器,每个容器请求2G大小的本地临时性存储,每个容器都设置了4G作为本地临时性存储的限制,因此整个pod的本地临时性存储请求是4G,限制为8G,其中emptyDir可以使用500M

什么叫可写入镜像层?我们了解一下docker的镜像分层原理

docker镜像分层原理

使用docker pull的时候我们可以看到镜像是分层下载的

当我们运行一个新的容器的时候,是在镜像分层的基础上新增了一层:container layer

针对这一层的修改,再容器重启后都会全部丢失

所以在使用docker的过程中,如果需要修改运行时的容器文件,尽量去重新构建镜像而不是直接修改容器内的文件

如果重新构建解决不了问题,就通过挂载数据卷的方式解决

容器层如果想做修改,实际上时进行了写时复制操作

容器的层是怎么来的?实际上在构建镜像的时候,每执行一个操作就会多一层

分层的好处是什么?在pull镜像的时候可能会注意到,如果本地已经存在了部分层,是不会重复拉取的!

因此 分层主要解决的就是镜像版本变化的拉取问题,可以节省时间,并且节省存储空间

并且,当多个基于相同镜像运行的容器,是共享相同的镜像层的,每个容器有区别的地方在于可写入镜像层,也就是说所主机上只需要保存一份base镜像,内存中也只需要加载一份base镜像,使用这个镜像的容器就都可以运行了

Docker镜像层都是只读的,容器层是可写的。 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作"容器层","容器层"之下的都叫"镜像层"。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中

接下来理解一下docker的几个概念:rootfs、Union mount、image、layer

rootfs

代表一个docker container在启动时其内部进程可见的文件系统视角,或者是docker container的根目录

docker的运行和linux操作系统内核启动类似,当docker daemon为docker container挂载rootfs的时候,将其设定为只读模式。在rootfs挂载完毕之后,docker daemonl利用union mount方式,在只读的rootfs上再挂载一个读写的文件系统

也就是说 容器中的进程堆rootfs的内容只有只读权限

Union mount

一种文件系统挂载的方式,允许同一时刻多种文件系统挂载在一起,并以一种文件系统的形式呈现多种文件系统内容合并后的目录

一般情况下,通过某种文件系统挂载内容至挂载点,那么挂载点目录中原先的内容将会被隐藏,而union mount不会。

实现union mount的文件系统称为union FileSystem,常见的有unionFS、AUFS、OverlayFS

对用户而言,整个文件系统并没有关注那部分是只读的,那部分是读写的,即便用户试图改写/etc/hosts中的内容,也是修改的读写系统中复制的/etc/hosts,然后保证用户看到读写系统中的/etc/hosts

image

docker中的image是一种轻量级的、可独立执行的软件包

layer

image由layer组成

除了只读的image之外,docker daemon在创建容器时会在容器的rootfs上,再mount一层read-write filesystem,而这一层文件系统,也称为容器的一层layer,常被称为top layer

容器的top layer可以转化为image吗?当然时可以的,这就是docker中的commit操作,无论在什么周期节点,对容器进行commit都可以将top layer所有内容打包为一个image,变成一个新的镜像

dockerFile中 ENV CMD LABEL不会增加层 而 RUN ADD COPY都会增加一层

COW策略

写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。

在docker中,如果某一层需要读取低层的文件,直接读即可。如果要修改一个文件,且这个文件是在低层,那就需要先拷贝到当前层,然后修改当前层这个文件

简单理解就是 镜像的层包含这一层文件相对于之前层的diff

docker下载

1、docker client发送镜像的tag到registry

2、registry根据镜像tag,得到manifest文件,返回给docker client

3、docker client根据manifest文件后,根据imageID检查镜像在本地是否存在

4、如果不存在则下载config文件,根据diff_ids得到镜像每一层解压后的digest

5、根据每层解压后的digest文件,检查本地是否存在,如果不存在则通过layer的digest下载该层并解压

docker本地存储

本地存储目录为/var/lib/docker/image/overlay2

相关推荐
yBmZlQzJ5 小时前
财运到内网穿透域名解析技术机制与中立评估
运维·经验分享·docker·容器·1024程序员节
sim20207 小时前
把某个pod固定到某个节点
kubernetes
yBmZlQzJ7 小时前
内网穿透工具通过端口转发实现内外网通信
运维·经验分享·docker·容器·1024程序员节
DeepHacking7 小时前
Overleaf 本地Docker部署
运维·docker·容器
孤岛悬城8 小时前
46 Docker资源管理
docker·容器·云计算
学Linux的语莫11 小时前
kompose、docker转k8s
docker·容器·kubernetes
阿里云云原生12 小时前
探秘 AgentRun丨流量一大就瘫痪?如何解决 AI 模型调用之痛
云原生
是Yu欸13 小时前
从Ascend C算子开发视角看CANN的“软硬协同”
c语言·开发语言·云原生·昇腾·ascend·cann·开放社区
光头熊13 小时前
一次 nerdctl prune -a 导致 Kubernetes 节点不可用的复盘
kubernetes
码界奇点13 小时前
基于微服务架构的企业身份与访问管理系统设计与实现
微服务·云原生·架构·车载系统·毕业设计·源代码管理