Kubernetes1.2中的卷插件

本次分析的kubernetes版本号:v1.2.1-beta.0。

针对kubernetes  v1.2.1-beta.0版本,从数据结构定义和使用的角度对kubernete卷插件进行分析。

在v1.2中,卷插件相关的主要结构体VolumePlugin,这是一个GO语言接口类型,可以对这个接口类型进行具体实现,已达到kubelet可以初始化和管理卷的目的:。

type VolumePlugin interface {

    Init(host VolumeHost) error

    Name() string

    CanSupport(spec *Spec) bool

    NewBuilder(spec *Spec, podRef*api.Pod, opts VolumeOptions) (Builder, error)

    NewCleaner(name string, podUIDtypes.UID) (Cleaner, error)

}

在结构体VolumePlugin中,在使用卷之前会调用Init这个函数来初始化卷,这个函数有个参数是VolumeHost类型的,这也是一个GO语言接口;Name函数返回卷插件名称,卷插件名称使用kubernetes中的namespace来定义,"kubernetes.io"这个namesapace是专门为了插件可以挂载到kubernetes而预留的;CanSupport函数用来测试对于指定规格的卷,卷插件是否可以支持;NewBuilder函数是一个GO语言接口类型,通过这个接口来挂载卷;NewCleaner函数也是一个GO语言接口类型,通过这个接口来卸载卷。

下面我们来看看kubernetes是如何使用结构体VolumePlugin的。在kubelet启动过程中使用到了结构体VolumePlugin,首先初始化所有卷插件,初始化的过程其实并没有在卷插件目录查找第三方卷插件,其实所有的卷插件都已经打包在了kubelet可执行程序中了,如果我们要扩展卷插件的话,也只能修改kubernetes源代码,然后重新编译出kubelet可执行文件。Kubernetes1.2中支持的卷插件包括AWS EBS、Azure文件系统、Ceph文件系统、Cinder、ConfigMap、Downwardapi、empty目录、FC存储、FlexVolume、Flocker、GCE的PD存储、git存储池、gluster文件系统、iscsi、NFS、RBD、persistent-claim、secret。

如果想使用AWS EBS作为卷给POD使用,那么需要在AWS ECS上部署kubernetes;如果想使用Cinder作为卷给POD使用,那么需要在OpenStack上部署kubernetes;如果想要使用GCE的PD存储给POD使用,那么需要在GCE上部署kubernetes。

在v1.2增加了微软Azure File 服务、ConfigMap、FlexVolume三种卷插件。

微软Azure File 服务使用标准 SMB 2.1 和SMB3.0协议提供文件共享服务,v1.2中POD可以挂载微软Azure File服务提供的卷。

ConfigMap是v1.2的新特性,前面介绍过了,ConfigMap用于在容器启动时向容器传入环境变量,这种方式的问题在于如果环境变量变化了,那么需要重新创建容器才能使配置生效,在v1.2中还可以通过挂载ConfigMap类型的卷,来将配置文件作为卷挂载到POD中,这样的的话就不需要重新创建容器就可以改变配置。

FlexVolume目前是一个在开发环境运行的功能特性,这个功能利用到了前面介绍的kubelet模块中新增加的VolumePluginDir参数,第三方卷供应商可以自行编写卷驱动程序,并且放在VolumePluginDir参数指定的路径中,这样kubenetes就可以使用这些卷了,这样做比较麻烦的地方在于,需要事先将卷驱动程序放到每个NODE节点的指定目录中,好处在于如果NODE节点连接到了第三方卷供应商提供的卷,那么可以使用这种方式将卷利用起来。比如VolumePluginDir参数对应的Node节点上的路径是/usr/libexec/kubernetes/kubelet-plugins/volume/exec,在这个目录中,我们可以增加一个cifs驱动,只需要在目录下增加个目录vendor-name/cifs就可以了。在使用的时候vendor只需要实现几个命令,分别是init、attach、datach、mount、unmount。

你可能感兴趣的:(源代码,容器,KUBERNETES)