1.10 Volume (存储卷)
Volume Pod 中能够被多个容器访问的共享目录。 Kubemetes Volume 概念、用途和目的与 Docker Volume 比较类似,但两者不能等价.
Kubemetes的Volume有以下特性:
- Kubemetes 中的Volume 定义在 Pod上,然后被 Pod 里的多个容器挂载到具体的文件目录下;
- Kubemetes 中的 Volume与Pod 的生命周期相同,但与容器的生命周期不相关,当容器终止或者重启时, Volume 中的数据也不会丢失。
- Kubemetes 支持多种类型的 Volume ,例如 GlusterFS Ceph 等先进的分布式文件系统.
一个 Pod里的多个容器共享文件、让容器的数据写到宿主机的磁盘上或者写文件到网络存储中,kubernetes Volume 还扩展出了 种非常有实用价值的功能,即容器配置文件集中化定义与管理,这是通过 ConfigMap 个新的资源对象来实现的。
- emptyDir:
一个emptyDir Volume 是在 Pod 分配到 Node 时创建的。 - hostPath:
hostPath 为在 Pod 上挂载宿主机上的文件或目录, - gcePersistentDisk
使用这种类型的 Volume 表示使用谷歌公有云提供的永久磁盘( Persistent Disk, PD )存放Volume 的数据,它 mptyD 不同, PD 上的内容会被永久保存, Pod 被删除时, PD 只是被卸载(Unmount ),但不会被删除. - awsElasticBlockStore
该类型的 Volume 使用亚马逊公有云提供的 EBSVolume 存储数据, 需要先建一个 BS Volume 才能使用 awsElasticBlockStore. - NFS
使用 NFS网络文件系统提供的共享目录存储数据时,我们需要在系统中部署一个NFS Server. - 其他类型的 Volume
iscsi :使用 iSCSI 存储设备上的目录挂载到 Pod中.
flocker :使用 Flocker 来管理存储卷。
glusterfs :使用开源 GlusterFS 网络文件系统的目录挂载到 Pod中.
rbd :使用 Ceph 块设备共享存储( Rados Block evice )挂载到 Pod
gitRepo :通过挂载一个空目录,并从 GIT中clone git reposit可以供 Pod 使用
secret:一个secre volume 用于为Pod 提供加密的信息,你可以将定义在 Kubemetes secret 直接挂载为文件让 Pod访问。 secret volume 是通过tmfs(内存文件系统)实现的,所以这种类型的 volume 总是不会持久化的.
1.11 Persistent Volume
PV 可以理解成 Kubemetes 集群中 的某个网络存储中对应的一块存储,它与 Volume 类似,但有以下区别。
- PV 只能是网络存储,不属于任何 Node ,但可以在每个 Node 上访问
- PV 井不是定义在 Pod 上的 ,而是独立于 Pod 之外定义。
- PV 目前 支持 类型包括:gcePersistentDisk、AWSElasticBlockStore、AzureFile、AzureDisk、FC ( Fibre Channel)、Flocker、NFS、iSCSI、RBD (Rados Block Device )、CephFS、Cinder、GlusterFS、Vsphere Volume、Quobyte Volumes、VMware Photon、Portwonc Volumes、ScaleIO Volumes和HostPath (仅供单机测试)。
PV 是有状态的对象,它有以下几种状态。
- Available :空闲状态。
- Bound :己经绑定到某个 PVC 上。
- Released :对应的 PVC 己经删除,但资源还没有被集群收
- Failed: PV 自动回收失败。
1.12 Namespace (命名空间)
Namespace (命名空间〉是 ubemetes 系统中的另一个非常重要的概念, Namespace 在很多情况下用于实现多租户的资源隔离。 Namespace 通过将集群内部的资源对象“分配”到不同的Namespace 中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
当我们给每个租户创建一个 Namespace 来实现多租户的资源隔离时,还能结合 kubernetes的资源配额管理,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等。
Kubemetes 集群在启动后,会创建一个名为“default ”的 Namespace
下面展示YAML定义Namespace:
apiVersion: v1
kind: Namespace
metadata:
name: development
定义了一个名为 busybox Pod ,放入 development
上面创建Namespace 里:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: development
spec:
containers:
- image : busybox
command:
- sleep
- "8080"
name: busybox
使用 kubectl get 命令查看将无法显示:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
可以在 kubectl 命令中加入–namespace 参数来查看某个命名空间中的对象:
# kubectl get pods --namespace=development
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 1m
1.13 Annotation (注解)
Annotation Label 类似,也使用 key/value 键值对的形式进行定义。不同的是 Label 具有严格的命名规则,它定义的是 Kubernetes 对象的元数据( Metadata ),并且用于 Label Selector.
通常来说,用 Annotation 来记录的信息如下。
- build 信息、 release 信息、 Docker 镜像信息等,例如时间戳、 release id 号、 PR 号、镜像hash 值、 docker registry地址等.
- 日志库、监控库、分析库等资源库的地址信息。
- 程序调试工具信息,例如工具名称、版本号等。
- 团队的联系信息,例如电话号码、负责人名称、网址等。