码迷,mamicode.com
首页 > 其他好文 > 详细

K8s中Volume

时间:2019-12-27 16:38:54      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:edm   esc   live   wan   ebs   waiting   相同   The   背景   

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃
时,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:       <none>
Annotations:  <none>
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:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Fri, 27 Dec 2019 13:44:40 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    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:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      sleep 6000s
    State:          Running
      Started:      Fri, 27 Dec 2019 13:44:40 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    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:  <unset>
  default-token-6wcrh:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-6wcrh
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From                 Message
  ----    ------     ----       ----                 -------
  Normal  Scheduled  <unknown>  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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          9s     <none>        k8s-node01   <none>           <none>
[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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          23s    <none>        k8s-node01   <none>           <none>
[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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          25s    <none>        k8s-node01   <none>           <none>
[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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          48s    <none>        k8s-node01   <none>           <none>
[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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          50s    <none>        k8s-node01   <none>           <none>
[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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          79s    <none>        k8s-node01   <none>           <none>
[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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          81s    <none>        k8s-node01   <none>           <none>
[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   <none>           <none>
test-pd1   0/1     ContainerCreating   0          3m2s   <none>        k8s-node01   <none>           <none>

假如子节点没有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:       <none>
Annotations:  <none>
Status:       Pending
IP:
IPs:          <none>
Containers:
  test-container:
    Container ID:
    Image:          wangyanglinux/myapp:v2
    Image ID:
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    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:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age                From                 Message
  ----     ------       ----               ----                 -------
  Normal   Scheduled    <unknown>          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:       <none>
Annotations:  <none>
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:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Fri, 27 Dec 2019 15:32:04 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    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:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age                  From                 Message
  ----     ------       ----                 ----                 -------
  Normal   Scheduled    <unknown>            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   <none>           <none>
test-pd1   1/1     Running   0          3m9s   10.244.2.55   k8s-node01   <none>           <none>
[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]#

K8s中Volume

标签:edm   esc   live   wan   ebs   waiting   相同   The   背景   

原文地址:https://www.cnblogs.com/dalianpai/p/12108041.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!