前面已经介绍过,有些应用如果意外宕机,Kubernetes
会将应用自动重启的机制,如rc
、Deployment
等,但是重启的Pod
如何保证数据一致呢,这里就需要借助kubernetes
的多种存储,例如ConfigMap
(专门用来存储配置文件,就像配置文件中心)、Secret
(存储一些需要加密的数据)、Volumn
(用来存储一些数据)、PV
(Persistent Volumn
,一个动态的存储)。
ConfigMap
ConfigMap
功能在Kubernetes
1.2版本中引入,许多应用程序会从配置文件、命令行参数或者环境变量中读取配置信息。ConfigMap API
给我们提供了向容器中注入配置信息的机制,ConfigMap
可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON
二进制对象。
创建一个ConfigMap
ConfigMap
可以使用目录创建、使用文件创建、使用字面值创建。
- 使用目录创建
1 | # ls ./configmap |
-from-file
指定在目录下的所有文件都会在ConfigMap
里面创建一个键值对,键的名字就是文件名,值就是文件的内容 *
- 使用文件创建
只要指定一个文件就可以从单个文件中创建ConfigMap
1 | # kubectl create configmap my-config --from-file=./configmap/a.properties |
-from-file
这个参数可以使用多次,你可以使用两次分别指定上个例子中的那两个配置文件,效果就跟指定整个目录是一样的。
- 使用字面值创建
使用字面值创建,利用-from-litteral
参数传递配置信息,该参数可以使用多次,格式如下
1 | # kubectl create configmap my-config --from-literal=log.level=warn |
Pod中使用ComfigMap
- 使用
ConfigMap
来代替环境变量
1 | # vim configmap-env.yaml |
- 通过数据卷插件来使用
ConfigMap
1 | # vim configmap-volumn.yaml |
Secret
Secret
解决了密码、token
、密钥等敏感数据的配置,而不需要把这些敏感数据暴露到镜像或者Pod Spec
中。
Secret
可以以Volumn
或者环境变量的方式使用
Secret
有三种类型:
Service
Account
:用来访问Kubernetes API
,由Kubernetes
自动创建,并且会自动挂载到Pod
的/run/secrets/kubernetes.io/serviceaccount
目录中;Opaque
:base64
编码格式的Secret
,用来存储密码、密钥等;kubernetes.io/dockerconfigjson
:用来存储私有docker registry
的认证信息。
这里我们仅了解Opaque Secret
,其他两种Secret
暂时不做深究
Opaque Secret
- 创建及使用
Opaque
类型的数据是一个map
类型,要求value
是base64
编码格式:
1 | # echo -n "admin"|base64 |
Volumn 卷
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,Kubelet
会重启它,但是容器中的文件将丢失–容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod
中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes
中的Volumn
抽象就很好的解决了这些问题。目前,Kubernetes
支持多种类型的Volumn
,例如GlusterFs
、Ceph
等先进的分布式文件系统。
Volumn
的使用也比较简单,在大多数情况下,我们现在Pod上声明一个Volumn
,然后在容器里引用该Volumn
并Mount
到容器里的某个目录上。举例来说,我们要给之前Tomcat Pod
增加一个名字为dataVol
的Volumn
,并且Mount
到容器的/mydata-data
目录下,则只要对Pod
的定义文件做如下修改即可
1 | spec: |
上面例子中emptyDir
是Volumn
的一种类型,Kubernets
提供了丰富的Volumn
类型。
emptyDir
一个emptyDir
Volumn
是在Pod
分配到Node
时创建的,从它的名字可以看出,他的初始化内容为空,并且无需指定宿主机上对应的目录文件,因为这是Kubernetes
自动分配的一个目录,当Pod
从Node
上移除时,emptyDir
中的数据也会被永久删除。
hostPath
hostPath
为在Pod
上挂载宿主机上的文件或目录。在下面的例子中使用宿主机的/data
定义了一个hostPath
类型的Volumn
:
1 | volumes: |
Persistent Volumn
之前我们提到的Volumn
是定义在Pod
上的,属于“计算资源”的一部分,而实际上,“网络存储”是相对独立于“计算资源”而存在的一种实体资源。比如在使用虚拟机的情况下,我们通常会先定义一个网络存储,然后从中划出一个“网盘”并挂在到虚拟机上。Persistent Volumn
(简称PV
)和与之关联的Persistent Volumn Clain
(简称PVC
)也起到了类似的作用。
PV
可以理解成Kubernetes
集群中的某个网络存储中对应的一块存储,它与Volumn
很类似,但有以下区别。
PV
只能是网络存储,不属于任何Node
,但可以在每个Node
上访问。PV
并不是定义在Pod
上的,而是独立于Pod
之外定义。PV
目前只有一种类型:GCE Persistent Disks
、NFS
、RBD
、iSCSCI
、AWS ElasticBlockStore
、CluserFS
等。
下面给出了NFS
类型PV
的一个yaml
定义声明,声明了需要5Gi
的存储空间:
1 | apiVersion: v1 |
如果某个Pod
想申请某种条件的PV
,则首先需要定义一个PersistentVolumnClaim
(PVC
)对象:
1 | kind: PersistentVolumnClaim |
然后在Pod
的Volumn
定义中引用上述PVC
即可:
1 | volumes: |
– 引用自知乎一起学习k8s