在 Kubernetes 中,有几种特殊的 Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。这些特殊 Volume 的作用,是为容器提供预先定义好的数据.

到目前为止,Kubernetes 支持的 Projected Volume 一共有四种:

Secret

它的作用,是帮你把 Pod 想要访问的加密数据,存放到 Etcd 中。然后,你就可以通过在 Pod 的容器里挂载 Volume 的方式,访问到这些 Secret里保存的信息了。

以Pod 举例

apiVersion: v1
kind: Pod
spec:
  ...
	volumes:
		- name: mysql-cred
			projected:  # 表示 projected 类型的 volume
				sources:
					- secret:
							name: user  # 挂载一个名字为 user 的secret对象
					- secret:
							name: pass

通过k8s保存 Secret

$ cat ./username.txt
admin
$ cat ./password.txt
c1oudc0w!
$ kubectl create secret generic user --from-file=./username.txt
$ kubectl create secret generic pass --from-file=./password.txt
$ kubectl create secret generic mysql-auth --from-literal=username=root --from-literal=password=root

$ kubectl get secrets # 执行查看Secret对象

也可以通过 yaml 文件创建, 如下所示. 被创建出来的 volume 会被挂载到相应的目录下, 以key为文件名的形式存储密码, 同样一旦对应的 ETCD 里的数据被更新, volume 里的文件内容也同样会被更新

使用volume引用Secret

Pod...
spec:
	volumes:
	- name: nginxcert
		secret:
			secretName: nginx-ssl

imagePullSecrets

还有一种 Secret 可以被引用为 imagePullSecrets, 主要用于存储 访问私有docker镜像时的认证信息, 如下所示