在Kubernetes中,有几种特殊的Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。这些特殊 Volume 的作用,是为容器提供预先定义好的数据。所以,从容器的角度来看,这些 Volume 里的信息就是仿佛是被 Kubernetes“投射”(Project)进入容器当中的。这正是 Projected Volume 的含义。
Secret
创建一个secret:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
namespace: webapps
type: Opaque
data:
user: YWRtaW4=
pass: MWYyZDFlMmU2N2Rm
上面的yaml文件创建了一个名为mysecret的Secret,key值有两个,分别是user和pass,value值是经过base64转换的。
在Pod里使用这个Secret:
apiVersion: v1
kind: Pod
metadata:
name: debug
namespace: webapps
spec:
nodeSelector:
kubernetes.io/hostname: work2
containers:
- image: bibinwilson/docker-kubectl:latest
name: kubectl
volumeMounts:
- name: mysql-cred
mountPath: "/projected-volume"
readOnly: true
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysecret
key: user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: pass
serviceAccountName: app-service-account
volumes:
- name: mysql-cred
projected:
sources:
- secret:
name: mysecret
看这个yaml文件,可以看出这个pod把secret用在了两个地方,一个是挂载到pod内部的/projected-volume目录里,另一个是映射到pod内部的环境变量里。 我们可以进入到pod里验证下:
上图中,红框框就是将secret里的两个值以文件的形式挂载在/projected-volume;黄框框就是以环境变量的形式。
ConfigMap
创建一个configmap:
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfigmap
namespace: webapps
data:
configmap-key: |
configmap-contents
上面这个yaml文件将创建一个名为myconfigmap的configMap。
在pod里使用这个configMap:
然后我们进入到pod里验证下:
Downward API
apiVersion: v1
kind: Pod
metadata:
name: debug
namespace: webapps
spec:
nodeSelector:
kubernetes.io/hostname: work2
containers:
- image: bibinwilson/docker-kubectl:latest
name: kubectl
volumeMounts:
- name: mysql-cred
mountPath: "/projected-volume"
readOnly: true
- name: my-configmap
mountPath: "/projected-volume2"
readOnly: true
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysecret
key: user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: pass
serviceAccountName: app-service-account
volumes:
- name: mysql-cred
projected:
sources:
- secret:
name: mysecret
- name: my-configmap
projected:
sources:
- configMap:
items:
- key: configmap-key
path: configmap-key
name: myconfigmap
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
我们再来进入pod里验证下:
ServiceAccountToken
如何创建serviceaccount前面的文章有讲过了,这里我们简单看看它在pod里是如何存在的,如下图: