EmptyDir:EmptyDir是一个空目录,他的生命周期和所属的 Pod 是完全一致的。EmptyDir的用处是,可以在同一 Pod 内的不同容器之间共享工
作过程中产生的文件。默认使用本地磁盘存储,也可设置为内存模式提高读写效率,但是对于主机内存资源造成消耗
HostPath:这种会把宿主机上的指定卷加载到容器之中,当然,如果 Pod 发生跨主机的重建,其内容就难保证了,这种卷一般和DaemonSet搭配
使用,用来操作主机文件,例如进行日志采集的 FLK 中的 FluentD 就采用这种方式,加载主机的容器日志目录,达到收集本主机所
有日志的目的
脱离主机的存储:提供网络存储
PV:存储卷,可以手动创建
accessModes:
ReadWriteOnce(RWO):单个读写
ReadOnlyMany(ROX):只读的方式被多个挂载
ReadWriteMany(RWX):这种存储可以以读写的方式被多个 Pod 共享
persistentVolumeReclaimPolicy:
Retain:不清理, 保留 Volume(需要手动清理)
Recycle:删除数据,即 rm -rf /thevolume/*(只有 NFS 和 HostPath 支持)
Delete:删除存储资源,比如删除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
PV的生命周期:
Provisioning,即 PV 的创建,可以直接创建 PV(静态方式),也可以使用 StorageClass 动态创建
Binding,将 PV 分配给 PVC
Using,Pod 通过 PVC 使用该 Volume,并可以通过准入控制
Releasing,Pod 释放 Volume 并删除 PVCReclaiming,回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除
Deleting,删除 PV 并从云存储中删除后段存储
PV状态:
Available、Bound、Released、Failed
PVC:存储资源申青
Pod通过挂在Volume的方式应用PVC
StorageClass:按需创建,解决管理员无限创建pv的工作
根据已经支持的存储插件来创建存储类,不同插件支持参数不同,具体创建各自查询
pvc通过classname来进行绑定
DaemonSet会为每个容器创建一个卷,并且保证pod被删除后或者使用同一份配置文件所绑定的卷是同一个
动态创建的pv名字:pvc-pvc_uid
文件夹名:namespce-deploy或daemonset名-编号(aemonset会有)-pv名称
DefaultStorageClass,可以指定存储类为默认存储类,创建pvc的时候不指定存储类会默认使用该存储类(依赖admission插件)
configmaps和Secret:pod启动时少量的配置我们可以使用环境变量解决但是如果是负载的配置文件我们可以使用下面两种,该功能也可以作为
配置中心使用
configmaps:
生成为容器内的环境变量
设置容器启动命令的参数
挂载为容器内部的文件或目录
kubectl create configmap --from-file=/path/to/dir
缺点:
ConfigMap必须在Pod之前创建
ConfigMap属于某个NameSpace,只有处于相同NameSpace的Pod才可以应用它
ConfigMap中的配额管理还未实现
如果是volume的形式挂载到容器内部,只能挂载到某个目录下,该目录下原有的文件会被覆盖掉
静态Pod不能用ConfigMap
注意:将Configmap挂载为一个文件夹后,原来在镜像中的文件夹里的内容就看不到,这是什么原理?这是因为原来文件夹下的内容无法
进入,所以显示不出来。为了避免这种挂载方式影响应用的正常运行,可以将configmap挂载为一个配置文件
confgimap更新后,如果是以文件夹方式挂载的,会自动将挂载的Volume更新。如果是以文件形式挂载的,则不会自动更新,不过
一般应用重启后才会更新配置,所以需要删掉pod触发pod的重建
secrets:Secret是用来保存小片敏感数据的k8s资源
创建:kubectl create secret generic db-user-pass --from-file= --from-file= 可以指定多个文件
get或describe指令都不会展示secret的实际内容
通过配置文件创建
每创建一个Account都会生成一个kubernetes.io/service-account-token类型的secrets
使用Secret:
创建一个Secret,多个Pod可以引用同一个Secret
修改Pod的定义,在spec.volumes[]加一个volume,给这个volume起个名字,spec.volumes[].secret.secretName记录的是要引
用的Secret名字
在每个需要使用Secret的容器中添加一项spec.containers[].volumeMounts[],指定spec.containers[].volumeMounts[].
readOnly = true,spec.containers[].volumeMounts[].mountPath要指向一个未被使用的系统路径。
修改镜像或者命令行使系统可以找到上一步指定的路径。此时Secret中data字段的每一个key都是指定路径下面的一个文件名
可以控制secret key被映射到容器内的路径,利用spec.volumes[].secret.items来修改被映射的具体路径
可以指定secret文件的权限,类似linux系统文件权限,如果不指定默认权限是0644,等同于linux文件的-rw-r--r--权限,设置默认权
限位mode
以文件的形式挂载到容器中的secret,他们的值已经是经过base64解码的了,可以直接读出来使用
imagePullSecrets:用来访问镜像仓库的秘钥
注意:同configmap
单个Secret容量限制的1Mb
kubelet只支持由API server创建出来的Pod中引用secret,使用特殊方式创建出来的Pod是不支持引用secret的,比如通过
kubelet的--manifest-url参数创建的pod,或者--config参数创建的,或者REST API创建的