在 Kubernetes 中,有几种特殊的 Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。这些特殊 Volume 的作用,是为容器提供预先定义好的数据.
到目前为止,Kubernetes 支持的 Projected Volume 一共有四种:
它的作用,是帮你把 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 里的文件内容也同样会被更新
Pod...
spec:
volumes:
- name: nginxcert
secret:
secretName: nginx-ssl
还有一种 Secret 可以被引用为 imagePullSecrets, 主要用于存储 访问私有docker镜像时的认证信息, 如下所示