最近重读了张磊老师的书,发现了一处小细节,于是上网搜一搜。
在Kubernetes中有一种特殊的卷,叫Projected Volume,可以把它翻译为“投射数据卷”。到目前为止,Kubernetes 支持的 Projected Volume 一共有四种:Secret;ConfigMap;Downward API;ServiceAccountToken(一种特殊的Secret)。它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。这些特殊 Volume 的作用,是为容器提供预先定义好的数据。所以,从容器的角度来看,这些 Volume 里的信息就是仿佛是被 Kubernetes“投射”(Project)进入容器当中的。这正是 Projected Volume 的含义。
在书中给出了这样一个例子
apiVersion: v1
kind: Pod
metadata:
name: test-projected-volume
spec:
containers:
- name: test-secret-volume
image: busybox
args:
- sleep
- "86400"
volumeMounts:
- name: mysql-cred
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: mysql-cred
projected:
sources:
- secret:
name: user
- secret:
name: pass
这与传统的写法不是很一样:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-secret
经过搜索发现,projected
卷允许您将多种类型的数据源(如 Secrets
, ConfigMaps
, 和 Downward API
)合并到一个卷中,可以把两个 Secret
(分别名为 user
和 pass
)的内容合并到同一路径下。在上述例子中即合并到/projected-volume下,该目录下会有一个user文件和一个pass文件。如果需要在同一个文件系统位置使用来自不同源的数据,这将非常有用。
主要区别
- 数据源的多样性:使用
projected
卷可以在同一挂载点合并来自多个Secrets
,ConfigMaps
, 和Downward API
的数据。使用简单的secret
卷只能挂载单一的Secret
数据源。 - 管理复杂性:如果只需要访问一个
Secret
,那么使用简单的secret
卷是更直接和简单的方法。如果需要合并多个数据源,则projected
卷提供了更大的灵活性和管理方便性。 - 使用场景:根据具体需求选择使用方法。如果Pod需要从多个
Secrets
或者需要与ConfigMaps
数据混合时,projected
是更好的选择。对于简单场景,直接使用secret
卷就足够了。