热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:K8s中Volume

篇首语:本文由编程笔记#小编为大家整理,主要介绍了K8s中Volume相关的知识,希望对你有一定的参考价值。容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应

篇首语:本文由编程笔记#小编为大家整理,主要介绍了K8s中Volume相关的知识,希望对你有一定的参考价值。


容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃
时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在
Pod 中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的 Volume 抽象就很好的解决了这些问题
背景
Kubernetes 中的卷有明确的寿命 —— 与封装它的 Pod 相同。所f以,卷的生命比 Pod 中的所有容器都长,当这
个容器重启时数据仍然得以保存。当然,当 Pod 不再存在时,卷也将不复存在。也许更重要的是,Kubernetes
支持多种类型的卷,Pod 可以同时使用任意数量的卷卷的类型。


emptyDir

一个emptyDir 第一次创建是在一个pod被指定到具体node的时候,并且会一直存在在pod的生命周期当中,正如它的名字一样,它初始化是一个空的目录,pod中的容器都可以读写这个目录,这个目录可以被挂在到各个容器相同或者不相同的的路径下。当一个pod因为任何原因被移除的时候,这些数据会被永久删除。注意:一个容器崩溃了不会导致数据的丢失,因为容器的崩溃并不移除pod.

emptyDir 磁盘的作用:


scratch space, such as for a disk-based mergesortcw

checkpointing a long computation for recovery from crashes

holding files that a content-manager container fetches while a webserver container serves the data




  • 普通空间,基于磁盘的数据存储

  • 作为从崩溃中恢复的备份点

  • 存储那些那些需要长久保存的数据,例web服务中的数据

默认的,emptyDir 磁盘会存储在主机所使用的媒介上,可能是SSD,或者网络硬盘,这主要取决于你的环境。当然,我们也可以将emptyDir.medium的值设置为Memory来告诉Kubernetes 来挂在一个基于内存的目录tmpfs,因为

tmpfs速度会比硬盘块度了,但是,当主机重启的时候所有的数据都会丢失


[root@k8s-master mnt]# cat volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: test
-pd
spec:
containers:
- image: wangyanglinux/myapp:v2
name: test
-container
volumeMounts:
- mountPath: /cache
name: cache
-volume
- name: liveness-exec-container
image: busybox
imagePullPolicy: IfNotPresent
command: [
"/bin/sh","-c","sleep 6000s"]
volumeMounts:
- mountPath: /cache
name: cache
-volume
volumes:
- name: cache-volume
emptyDir: {}
[root
@k8s-master mnt]#

执行:


[root@k8s-master mnt]# vim volume.yaml
[root@k8s-master mnt]# kubectl create -f volume.yaml
pod/test-pd created
[root
@k8s-master mnt]# kubectl describe pod test-pd
Name: test-pd
Namespace:
default
Priority:
0
Node: k8s
-node02/192.168.180.136
Start Time: Fri,
27 Dec 2019 13:44:38 +0800
Labels: >
Annotations: >
Status: Running
IP:
10.244.1.49
IPs:
IP:
10.244.1.49
Containers:
test
-container:
Container ID: docker:
//236b2b8c29ed6d42b74aaef24bc1d43d21863598c7c5a5cd19b9fc953993c7c0
Image: wangyanglinux
/myapp:v2
Image ID: docker
-pullable://wangyanglinux/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
Port: >
Host Port: >
State: Running
Started: Fri,
27 Dec 2019 13:44:40 +0800
Ready:
True
Restart Count:
0
Environment: >
Mounts:
/cache from cache-volume (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-6wcrh (ro)
liveness
-exec-container:
Container ID: docker:
//304943afd2171d58d2b36d93f3833405f7e2651ffb67ad807adaf80c8a6fd330
Image: busybox
Image ID: docker
-pullable://busybox@sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
Port: >
Host Port: >
Command:
/bin/sh
-c
sleep 6000s
State: Running
Started: Fri,
27 Dec 2019 13:44:40 +0800
Ready:
True
Restart Count:
0
Environment: >
Mounts:
/cache from cache-volume (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-6wcrh (ro)
Conditions:
Type Status
Initialized
True
Ready
True
ContainersReady
True
PodScheduled
True
Volumes:
cache
-volume:
Type: EmptyDir (a temporary directory that shares a pod‘s lifetime)
Medium:
SizeLimit: >
default-token-6wcrh:
Type: Secret (a volume populated by a Secret)
SecretName:
default-token-6wcrh
Optional:
false
QoS Class: BestEffort
Node
-Selectors:
Tolerations: node.kubernetes.io
/not-ready:NoExecute for 300s
node.kubernetes.io
/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled > default-scheduler Successfully assigned default/test-pd to k8s-node02
Normal Pulled 8s kubelet, k8s
-node02 Container image "wangyanglinux/myapp:v2" already present on machine
Normal Created 8s kubelet, k8s
-node02 Created container test-container
Normal Started 7s kubelet, k8s
-node02 Started container test-container
Normal Pulled 7s kubelet, k8s
-node02 Container image "busybox" already present on machine
Normal Created 7s kubelet, k8s
-node02 Created container liveness-exec-container
Normal Started 7s kubelet, k8s
-node02 Started container liveness-exec-container
[root
@k8s-master mnt]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test
-pd 2/2 Running 0 107s
[root
@k8s-master mnt]# !711
kubectl exec test-pd -it -- /bin/sh
Defaulting container name to test
-container.
Use ‘kubectl describe pod
/test-pd -n default‘ to see all of the containers in this pod.
/ # ls
bin cache dev etc home lib media mnt proc root run sbin srv sys tmp usr var
/ # exit

看来里面有这个文件夹

hostPath
hostPath 卷将主机节点的文件系统中的文件或目录挂载到集群中
hostPath 的用途如下:
运行需要访问 Docker 内部的容器;使用 /var/lib/docker 的 hostPath
在容器中运行 cAdvisor;使用 /dev/cgroups 的 hostPath
允许 pod 指定给定的 hostPath 是否应该在 pod 运行之前存在,是否应该创建,以及它应该以什么形式存在
除了所需的 path 属性之外,用户还可以为 hostPath 卷指定 type

技术图片

使用这种卷类型是请注意,因为:
由于每个节点上的文件都不同,具有相同配置(例如从 podTemplate 创建的)的 pod 在不同节点上的行为可能会有所不同。
当 Kubernetes 按照计划添加资源感知调度时,将无法考虑 hostPath 使用的资源
在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或修改主机上的文件权限以便写入 hostPath 卷。


[root@k8s-master mnt]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: test
-pd1
spec:
containers:
- image: wangyanglinux/myapp:v2
name: test
-container
volumeMounts:
- mountPath: /test-pd1
name: test
-volume1
volumes:
- name: test-volume1
hostPath:
path:
/data
type: Directory
[root
@k8s-master mnt]#


[root@k8s-master mnt]# vim pod1.yaml
[root@k8s-master mnt]# kubectl create -f pod1.yaml
pod/test-pd1 created
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 101m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 9s k8s-node01
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 102m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 23s k8s-node01
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 102m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 25s k8s-node01
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 102m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 48s k8s-node01
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 102m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 50s k8s-node01
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 103m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 79s k8s-node01
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 103m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 81s k8s-node01
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 104m 10.244.1.49 k8s-node02
test
-pd1 0/1 ContainerCreating 0 3m2s k8s-node01

假如子节点没有data文件夹


[root@k8s-master mnt]# kubectl describe pod test-pd1
Name: test-pd1
Namespace:
default
Priority:
0
Node: k8s
-node01/192.168.180.135
Start Time: Fri,
27 Dec 2019 15:31:19 +0800
Labels: >
Annotations: >
Status: Pending
IP:
IPs: >
Containers:
test
-container:
Container ID:
Image: wangyanglinux
/myapp:v2
Image ID:
Port: >
Host Port: >
State: Waiting
Reason: ContainerCreating
Ready:
False
Restart Count:
0
Environment: >
Mounts:
/test-pd1 from test-volume1 (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-6wcrh (ro)
Conditions:
Type Status
Initialized
True
Ready
False
ContainersReady
False
PodScheduled
True
Volumes:
test
-volume1:
Type: HostPath (bare host directory volume)
Path:
/data
HostPathType: Directory
default-token-6wcrh:
Type: Secret (a volume populated by a Secret)
SecretName:
default-token-6wcrh
Optional:
false
QoS Class: BestEffort
Node
-Selectors:
Tolerations: node.kubernetes.io
/not-ready:NoExecute for 300s
node.kubernetes.io
/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled > default-scheduler Successfully assigned default/test-pd1 to k8s-node01
Warning FailedMount 21s (x6 over 36s) kubelet, k8s
-node01 MountVolume.SetUp failed for volume "test-volume1" : hostPath type check failed: /data is not a directory


[root@k8s-master mnt]# kubectl describe pod test-pd1
Name: test-pd1
Namespace:
default
Priority:
0
Node: k8s
-node01/192.168.180.135
Start Time: Fri,
27 Dec 2019 15:31:19 +0800
Labels: >
Annotations: >
Status: Running
IP:
10.244.2.55
IPs:
IP:
10.244.2.55
Containers:
test
-container:
Container ID: docker:
//5a8696561897043c9c141acae2f66eea2ca6d4b834a15c143c953a269113e25b
Image: wangyanglinux
/myapp:v2
Image ID: docker
-pullable://wangyanglinux/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
Port: >
Host Port: >
State: Running
Started: Fri,
27 Dec 2019 15:32:04 +0800
Ready:
True
Restart Count:
0
Environment: >
Mounts:
/test-pd1 from test-volume1 (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-6wcrh (ro)
Conditions:
Type Status
Initialized
True
Ready
True
ContainersReady
True
PodScheduled
True
Volumes:
test
-volume1:
Type: HostPath (bare host directory volume)
Path:
/data
HostPathType: Directory
default-token-6wcrh:
Type: Secret (a volume populated by a Secret)
SecretName:
default-token-6wcrh
Optional:
false
QoS Class: BestEffort
Node
-Selectors:
Tolerations: node.kubernetes.io
/not-ready:NoExecute for 300s
node.kubernetes.io
/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled > default-scheduler Successfully assigned default/test-pd1 to k8s-node01
Warning FailedMount 106s (x6 over 2m1s) kubelet, k8s
-node01 MountVolume.SetUp failed for volume "test-volume1" : hostPath type check failed: /data is not a directory
Normal Pulled 77s kubelet, k8s
-node01 Container image "wangyanglinux/myapp:v2" already present on machine
Normal Created 77s kubelet, k8s
-node01 Created container test-container
Normal Started 77s kubelet, k8s
-node01 Started container test-container
[root
@k8s-master mnt]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-pd 2/2 Running 1 109m 10.244.1.49 k8s-node02
test
-pd1 1/1 Running 0 3m9s 10.244.2.55 k8s-node01
[root
@k8s-master mnt]# kubectl exec test-pd1 -it -- /bin/sh
/ # ls
bin etc lib mnt root sbin sys tmp var
dev home media proc run srv test
-pd1 usr
/ # cd test-pd1
/test-pd1 # date > index.html
/test-pd1 # ls -l
total 4
-rw-r--r-- 1 root root 29 Dec 27 07:35 index.html
/test-pd1 #

在子节点查看


[root@k8s-node01 /]# mkdir /data
[root@k8s-node01 /]# cd /data
[root@k8s-node01 data]# ll
总用量 4
-rw-r--r-- 1 root root 29 12月 27 15:35 index.html
[root
@k8s-node01 data]# cat index.html
Fri Dec 27 07:35:52 UTC 2019
[root
@k8s-node01 data]#


推荐阅读
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 这个问题困扰了我两天,卸载Dr.COM客户端(我们学校上网要装这个客户端登陆服务器,以后只能在网页里输入用户名和密码了),问题解决了。问题的现象:在实验室机台式机上安装openfire和sp ... [详细]
  • imnewtotheswiftandxcodeworld,soimhavingaproblemtryingtointegrateapackagetomypro ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • Thisworkcameoutofthediscussioninhttps://github.com/typesafehub/config/issues/272 ... [详细]
author-avatar
平凡天仙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有