第十二题:不以持久卷方式挂载:
题目:
1.创建一个pod,名为non-presistent-redis
2.挂载存储卷,卷名为:cache-control,挂载到本地的:/data/redis目录下
3.在名称空间ns-ehj里做,不要以持久卷方式挂载
解题思路:
- 没有明确要求挂载在node主机上的具体位置,使用随机位置emptyDir:{} ,
- 如果明确挂载到主机的指定位置和地址,则使用hostPath
可参考:
https://kubernetes.io/docs/concepts/storage/volumes/
https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
解题步骤-1( emptyDir 模式):
- 步骤1: dry-run创建初始文件:
sudo kubectl run non-persistent-redis --image=redis --generator=run-pod/v1 --dry-run -o yaml > non-persistent-redis.yaml
- 步骤2: 修改文件,挂载硬盘(emptyDir:{}):
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: non-persistent-redis
name: non-persistent-redis
namespace: ns-ehj
spec:
volumes:
- name: cache-control
emptyDir: {}
containers:
- image: redis
name: non-persistent-redis
volumeMounts:
- mountPath: /data/redis
name: cache-control
解题步骤-2( hostPath模式):
- 步骤1: dry-run创建初始文件
sudo kubectl run non-persistent-redis-hostpath --image=redis --generator=run-pod/v1 --dry-run -o yaml > non-persistent-redis-hostpath.yaml
- 步骤2: 修改文件,挂载硬盘(hostPath):
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: non-persistent-redis-hostpath
name: non-persistent-redis-hostpath
namespace: ns-ehj
spec:
volumes:
- name: cache-control-hostpath
hostPath:
path: ~/data/redis
type: DirectoryOrCreate
containers:
- image: redis
name: non-persistent-redis-hostpath
volumeMounts:
- mountPath: /data/redis
name: cache-control-hostpath
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
下面我们来具体了解下K8S中的volume挂载方式:
1.我们需要清楚的是:
- 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。 首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失——因为容器会以干净的状态重建。
- 当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两个问题。
2.K8S支持的Volume的类型:
- awsElasticBlockStore
- azureDisk
- azureFile
- cephfs
- cinder
- configMap
- csi
- downwardAPI
- emptyDir
- fc (fibre channel)
- flexVolume
- flocker
- gcePersistentDisk
- gitRepo (deprecated)
- glusterfs
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- projected
- portworxVolume
- quobyte
- rbd
- scaleIO
- secret
- storageos
- vsphereVolume
我们来看下几个常用的Volume:
- emptyDir:当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
注意:
容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃时 emptyDir 卷中的数据是安全的。
默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium 字段设置为 "Memory",以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。
emptyDir示例:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
- hostPath:
hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。
例如,hostPath 的一些用法有:
- 运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
- 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
-
允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。
除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。
支持的 type 值如下:
当使用这种类型的卷时要小心,因为:
- 具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
- 当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由
hostPath
使用的资源。 - 基础主机上创建的文件或目录只能由 root 用户写入。您需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入
hostPath
卷
hostPath 示例:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
注意:
一定要找到该node上的mount目录。