kubernetes临时存储ephemeral storage

黑风怪
• 阅读 2528

1.临时存储的概念

临时存储即宿主机节点的本地存储。

早期版本的kubernetes提供了对container的CPU、内存的限制,并没有提供对container使用的本地存储的限制,这种情况下,可能存在某些container大量消耗宿主机的存储容量,导致宿主机没有足够的磁盘空间运行核心组件。

container使用的宿主机空间:

  • 存放log的目录:/var/lib/kubelet、/var/log/pods
  • 存放rootfs的目录: /var/lib/docker

kubernetes在1.8版本引入了ephemeral storage资源,以管理本地临时存储的使用。

2.临时存储的配置

Pod的container可以配置临时存储的requests和limits:

* spec.containers[].resources.limits.ephemeral-storage
* spec.containers[].resources.requests.ephemeral-storage

创建一个deploy,ephemeral-storage申请300Mi,限制300Mi:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:      
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        command:
        - nginx
        - -g
        - "daemon off;"
        workingDir: /usr/share/nginx/html
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
        resources:
          limits:
            ephemeral-storage: 300Mi
          requests:
            ephemeral-storage: 300Mi

创建出来2个pod:

# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-774779ddfb-89f5m   1/1     Running   0          12s
nginx-774779ddfb-k8r2r   1/1     Running   0          12s

在其中一个pod写入400Mi的文件:

# kubectl exec -it nginx-774779ddfb-89f5m /bin/sh
# dd if=/dev/zero of=/test bs=4096 count=102400
102400+0 records in
102400+0 records out
419430400 bytes (419 MB, 400 MiB) copied, 16.2403 s, 25.8 MB/s

可以看到,写入文件的pod被Evicted,并新创了一个pod:

# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-774779ddfb-89f5m   0/1     Evicted   0          2m19s
nginx-774779ddfb-cv4zw   1/1     Running   0          4s
nginx-774779ddfb-k8r2r   1/1     Running   0          2m19s

3.临时存储的监控

容器临时存储的使用量:

  • container_fs_usage_bytes

容器临时存储的申请量:

  • kube_pod_container_resource_requests{resource="ephemeral_storage",unit="byte"}

节点的临时存储总量:

  • kube_node_status_allocatable{resource="ephemeral_storage",unit="byte"}

节点已分配临时存储:

  • sum by (node) (kube_pod_container_resource_requests{resource="ephemeral_storage"})

4.临时存储的源码

监控pod和container的临时存储使用率,若超过限制,则被evicted:

//pkg/kubelet/eviction/eviction_manager.go
func (m *managerImpl) localStorageEviction(pods []*v1.Pod, statsFunc statsFunc) []*v1.Pod {
    evicted := []*v1.Pod{}
    for _, pod := range pods {
        podStats, ok := statsFunc(pod)
        if !ok {
            continue
        }
        ...
        if m.podEphemeralStorageLimitEviction(podStats, pod) {
            evicted = append(evicted, pod)
            continue
        }
        if m.containerEphemeralStorageLimitEviction(podStats, pod) {
            evicted = append(evicted, pod)
        }
    }
    return evicted
}

重点看一下container的存储容量检查:

func (m *managerImpl) containerEphemeralStorageLimitEviction(podStats statsapi.PodStats, pod *v1.Pod) bool {
    //limits限制值
    thresholdsMap := make(map[string]*resource.Quantity)
    for _, container := range pod.Spec.Containers {
        ephemeralLimit := container.Resources.Limits.StorageEphemeral()
        if ephemeralLimit != nil && ephemeralLimit.Value() != 0 {
            thresholdsMap[container.Name] = ephemeralLimit
        }
    }
    //遍历所有的container
    for _, containerStat := range podStats.Containers {
        containerUsed := diskUsage(containerStat.Logs)
        if !*m.dedicatedImageFs {
            containerUsed.Add(*diskUsage(containerStat.Rootfs))
        }
        if ephemeralStorageThreshold, ok := thresholdsMap[containerStat.Name]; ok {
            //若limits < usage,则evicted
            if ephemeralStorageThreshold.Cmp(*containerUsed) < 0 {
                if m.evictPod(pod, 0, fmt.Sprintf(containerEphemeralStorageMessageFmt, containerStat.Name, ephemeralStorageThreshold.String()), nil) {
                    metrics.Evictions.WithLabelValues(signalEphemeralContainerFsLimit).Inc()
                    return true
                }
                return false
            }
        }
    }
    return false
}

参考:

1.https://ieevee.com/tech/2019/05/23/ephemeral-storage.html
2.https://www.bookstack.cn/read/okd-4.7-en/995d491a59697e3b.md

点赞
收藏
评论区
推荐文章
DevOpSec DevOpSec
4年前
Kubernetes(k8s)中文文档 Kubernetes概述
简介Kubernetes(https://www.kubernetes.org.cn/)是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes一个核心的特点就是能够自主的管理容
Wesley13 Wesley13
3年前
HDP3.1 中 YRAN 和 MR2 的内存大小配置的计算方式
  Container 是 YARN 中基本的处理单元,它是对内存、CPU等计算的封装。总的来说,每个core每块硬盘分配2个 container,能获得较好的集群利用率。 1. 确定可用内存大小。 对于每台主机来说,YARN 和 MapReduce 能用内存大小是除去预留给系统的内存(如果还有 HBase,还要相应留内存给它)后的大小,即
Stella981 Stella981
3年前
Kubernetes源码探疑:Pod IP泄露排查及解决
作者:陈绥来源:UCloud(ID:ucloud\_tech)UK8S是UCloud推出的Kubernetes容器云产品,完全兼容原生API,为用户提供一站式云上Kubernetes服务。我们团队自研了CNI(Container Network Interface)网络插件,深度集成VPC,使UK8S容器应用拥有与云主机间等同的网络性能(目前
可莉 可莉
3年前
12.k8s的存储卷创建过程
数据持久化需要数据卷。kubernetes生态提供海量的存储驱动和存储使用方式。root@mastersongcatpoddemo.ymlapiVersion:v1kind:Podmetadata:name:poddemonamespace:default
Wesley13 Wesley13
3年前
VirtualBox 4.3.6上安装CentOS 6.5
目标:1、在VirtualBox中安装CentOS2、配置虚拟机网络,实现:   a.主机联网后,宿机能够通过主机上网   b.不管主机联网与否,主机都能SSH登录宿机,并且主宿机能互相传送文件安装环境:1、Win764bit旗舰版2、VirtualBox4.3.63、CentOS6.5x86\_6
Stella981 Stella981
3年前
IDA Pro 权威指南学习笔记(十)
栈帧(stackframe)是在程序的运行时栈中分配的内存块,用于特定的函数调用如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存1.传给函数的参数的值需要存储到函数能够找到它们的位置2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们
Stella981 Stella981
3年前
Docker数据卷(Volume)
一、将Docker数据挂载到容器  在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即_数据不随着Container的结束而结束_),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:  (1)volumes:Docker管理宿主机文件系统的一
Stella981 Stella981
3年前
Kubernetes 临时存储需要限制吗?
临时存储简介Node节点通常还可以具有本地的临时性存储,由本地挂载的可写入设备或者RAM来提供支持。临时(Ephemeral)意味着对所存储的数据不提供长期可用性的保证。Pods通常可以使用临时性本地存储来实现缓冲区、保存日志等功能。kubelet可以为使用本地临时存储的Pods提供这种存储空间,允许后者使用
传统数据存储
通常情况下,业务系统产生的大量日志都是集中存储处理的。集中存储是指有一个由大型主机或多台主机组成的中心节点,数据集中存储在这个中心节点上,整个系统的所有业务单元都集中部署在这个中心节点上。数据计算几乎完全依赖于一台中大型中央计算机的处理能力。系统的所有功能
云主机使用的硬盘类型及对应的存储类型详解
随着云计算的普及,云主机已成为企业和个人用户的重要选择。云主机为用户提供了灵活、可伸缩的计算资源,并且具有高可用性、高可扩展性以及易于管理的特点。在云主机的使用过程中,硬盘类型和存储类型的选择是非常重要的环节。本文将详细介绍云主机所使用的硬盘类型以及对应的存储类型,帮助读者更好地了解和选择适合自己需求的云存储方案。
流浪剑客 流浪剑客
1年前
Yoink:临时存储助手「Mac」
是一款Mac上的文件暂存工具,可以帮助用户在移动或复制文件时提高工作效率。它可以将需要暂存的文件、图片、应用程序等拖放到Yoink的窗口中,等到需要使用时再从Yoink中拖出。使用Yoink可以避免在Finder中繁琐的导航,它提供了类似“桌面”的体验,可