标签:exp erp 字段 调度 ready shm 使用 ash 任务
Docker 也有 Volume 的概念,但对它只有少量且松散的管理。 在 Docker 中,Volume 是磁盘上或者另外一个容器内的一个目录。 直到最近,Docker 才支持对基于本地磁盘的 Volume 的生存期进行管理。 虽然 Docker 现在也能提供 Volume 驱动程序,但是目前功能还非常有限 (例如,截至 Docker 1.7,每个容器只允许有一个 Volume 驱动程序,并且无法将参数传递给卷)。另一方面,Kubernetes 卷具有明确的生命周期——与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。 也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。
卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录。 特定的卷类型可以决定这个目录如何形成的,并能决定它支持何种介质,以及目录中存放什么内容。
使用卷时, Pod 声明中需要提供卷的类型 (.spec.volumes 字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段).
容器中的进程能看到由它们的 Docker 镜像和卷组成的文件系统视图。 Docker 镜像 位于文件系统层次结构的根部,并且任何 Volume 都挂载在镜像内的指定路径上。 卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置。
k8s官网文档地址:https://kubernetes.io/zh/docs/concepts/storage/volumes/
Volume的常用类型
emptyDir
当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
说明: 容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。
emptyDir 的一些用途:
缓存空间,例如基于磁盘的归并排序。
为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium 字段设置为 "Memory",以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容?的内存消耗,受容?内存限制约束。
比如: /dev/shm挂载点,其tmpfs文件系统可以更快提供缓存,音视频类型会用到的比较多;
[root@master1 ~]# df -hT /dev/shm
文件系统 类型 容量 已用 可用 已用% 挂载点
tmpfs tmpfs 910M 0 910M 0% /dev/shm
示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: write
image: centos
command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {}
hostPath
hostPath卷类似于 docker 中的 -v 选项,能将主机节点文件系统上的文件或目录挂载到运行的Pod中,主要应用场景就是 Pod 需要访问主机上的文件;
例如,hostPath 的一些用法有:
运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。
除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。
支持的 type 值如下:
取值 | 行为 |
---|---|
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。 | |
DirectoryOrCreate | 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权。 |
Directory | 在给定路径上必须存在的目录。 |
FileOrCreate | 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。 |
File | 在给定路径上必须存在的文件。 |
Socket | 在给定路径上必须存在的 UNIX 套接字。 |
CharDevice | 在给定路径上必须存在的字符设备。 |
BlockDevice | 在给定路径上必须存在的块设备。 |
当使用这种类型的卷时要小心,因为:
示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c - sleep 36000
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
hostPath:
path: /tmp
type: Directory
网络存储(NFS示例)
nfs 卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。
NFS服务器地址
[root@node1 ~]# showmount -e 172.16.1.78
Export list for 172.16.1.78:
/data 172.16.0.0/16
简单的nfs示例:
[root@master1 nfs]# cat nfs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment1
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
containers: #列表所以下面会有-
- name: nginx-deployment1 #镜像
image: nginx:1.8
ports:
- containerPort: 80
volumeMounts: #数据卷
- name: wwwroot #名称 可以写多个通过名称来对应
mountPath: /usr/share/nginx/html #镜像发布路径
volumes:
- name: wwwroot #对应上面数据卷名称
nfs: #类型nfs
server: 172.16.1.78 #nfs对应IP
path: /data #nfs的共享目录路径
readOnly #只读 可以不写默认是读写
[root@master1 nfs]# vim nfs.yaml
[root@master1 nfs]# kubectl apply -f nfs.yaml
deployment.apps/nginx-deployment1 created
[root@master1 nfs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 0/1 Completed 0 125m
nginx-deployment-9cdc9bd5c-pzzst 1/1 Running 3 3d17h
nginx-deployment1-898d6bdf6-d7tvn 1/1 Running 0 21s
secret-env-pod 0/1 Completed 0 173m
web-nginx-dep2-66ccfd7fb7-z2x84 1/1 Running 2 9d
[root@master1 nfs]# kubectl exec -it nginn-deploment1-**** /bin/bash
root@nginx-deployment1-898d6bdf6-d7tvn:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 39G 6.1G 33G 16% /
tmpfs 64M 0 64M 0% /dev
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 39G 6.1G 33G 16% /etc/hosts
shm 64M 0 64M 0% /dev/shm
172.16.1.78:/data 39G 4.7G 34G 13% /usr/share/nginx/html
tmpfs 910M 12K 910M 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 910M 0 910M 0% /proc/acpi
tmpfs 910M 0 910M 0% /proc/scsi
tmpfs 910M 0 910M 0% /sys/firmware
root@nginx-deployment1-898d6bdf6-d7tvn:/# ls /usr/share/nginx/html/
docker_images
root@nginx-deployment1-898d6bdf6-d7tvn:/# echo ‘Hello NFS Volume test!!!‘ > /usr/share/nginx/html/index.html
root@nginx-deployment1-898d6bdf6-d7tvn:/# ls /usr/share/nginx/html/
docker_images index.html
root@nginx-deployment1-898d6bdf6-d7tvn:/# exit
exit
[root@master1 nfs]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 10d <none>
nginx-deployment NodePort 10.0.0.238 <none> 80:32256/TCP 3d17h app=nginx-deployment
[root@master1 nfs]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mypod 0/1 Completed 0 127m 10.244.1.19 node2.ljy.com <none> <none>
nginx-deployment-9cdc9bd5c-pzzst 1/1 Running 3 3d17h 10.244.2.11 master1.ljy.com <none> <none>
nginx-deployment1-898d6bdf6-d7tvn 1/1 Running 0 2m2s 10.244.0.19 node1.ljy.com <none> <none>
secret-env-pod 0/1 Completed 0 175m <none> master1.ljy.com <none> <none>
web-nginx-dep2-66ccfd7fb7-z2x84 1/1 Running 2 9d 10.244.1.25 node2.ljy.com <none> <none>
[root@master1 nfs]# curl 10.244.0.19
Hello NFS Volume test!!!
ConfigMap和Secret
configMap 资源提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被应用到 Pod 中运行的容器化应用。
StorageOS 在 Kubernetes 环境中以容?的形式运行,这使得应用能够从 Kubernetes 集群中的任何节点访问本地或关联的存储。 为应对节点失效状况,可以复制数据。 若需提高利用率和降低成本,可以考虑瘦配置(Thin Provisioning)和数据压缩。
标签:exp erp 字段 调度 ready shm 使用 ash 任务
原文地址:https://blog.51cto.com/liujingyu/2532637