在Kubernetes中有一些资源对象可以以存储卷的形式挂载为容器内的目录或者文件,目前包括ConfigMap、Secret、DownwardAPI、ServiceAccountToken、Project Volume。
一、ConfigMap
ConfigMap主要保存应用程序所需要的配置文件,并且通过Volume形式挂载到容器内的文件系统中,供容器内的应用程序读取。
例如,一个包含两个配置文件的ConfigMap资源如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appconfigfiles
data:
key-serverxml: |
<?xml version='1.0' encoding='utf-8'?>
......
key-loggingproperties: "handlers
......
= 4host-manager.org.apache.juli.FileHandler\r\n\r\n"
在Pod的YAML配置中,可以将ConfigMap设置为一个Volume,然后在容器中通过VolumeMounts将ConfigMap类型的Volume挂载到/config目录下:
apiVersion: v1
kind: Pod
metadata:
name: cm-test-app
spec:
containers:
- name: cm-test-app
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
volumeMounts:
- name: serverxml
mountPath: /configfiles
volumes:
- name: serverxml
configMap:
name: cm-appconfigfiles
items:
- key: key-serverxml
path: server.xml
- key: key-loggingproperties
path: logging.properties
在Pod成功创建之后,进入容器内部查看在/config目录下有两个文件
ConfigMap中的配置内容如果是UTF-8编码的字符,则将被系统认为是文本文件,如果是其它字符,则系统将以二进制数据格式进行保存(设置binaryData字段)
二、Secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque #
data:
password: dmFsdWUtMg0K #base64编码
username: dmFsdWUtMg0K #base64编码
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
三、Downward API
通过Downward API可以将Pod或Container的某些元数据信息(例如Pod名称、Pod IP、Node IP、Label、 Annotation、容器资源限制等)以文件形式挂载到容器内,供容器内部使用。下面是将Pod的标签通过DownWard API挂载为容器内文件:
apiVersion: v1
kind: Pod
metadata:
name: downward-api-test
labels:
zone: us-est-coast
cluster: test-cluster
rack: rack-001
annotations:
build: two
builder: chugao
spec:
containers:
- name: client-container
image: busybox
command: ["sh", "-c"]
args:
- while true; do
if [[ -e /etc/podinfo/labels ]]; then
echo -en '\n\n'; cat /etc/podinfo/labels; fi;
if [[ -e /etc/podinfo/annotations ]]; then
echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
sleep 5;
done;
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
四、Projected Volume和Service Account Token
Projected Volume是一种特殊的卷类类型,用于将(ConfigMap、Secret、Downward API)一个或多个资源一次性挂载到容器内的同一个目录下。
如果Pod希望同时挂载ConfigMap、Secret、Downward API,则需要设置不同类型的Volume都挂载为容器内的目录或文件。如果应用程序希望将配置文件和秘钥文件放在容器内的同一个目录下,则通过多个Volume就无法实现。为了支持这种需求,Kubernetes引入了一种新的Projected Volume存储卷类型,用于将多种配置类型数据通过单个Volume挂载到容器内的单个目录下:
Projected Volume的一些常见的应用场景:
- 通过Pod的标签生成的不同的配置文件,需要使用配置文件,以及用户名和密码,这时需要使用3种资源:ConfigMap、Secret、Downward API
- 在自动化运维应用中使用配置文件和账号信息时,需要使用ConfigMap、Secret
- 在配置文件内使用Pod名称(metadata.name)记录日志时,需要使用ConfigMap、Downward API
- 如果某个Secret对Pod所在命名空间(metadata.namespace)进行加密时,需要使用Secret、Downward API
Projected Volume在Pod的Volume定义中类型projected,通过srouces字段设置一个或多个ConfigMap、Sectet、Downward API、ServiceAccountToken资源。各种类型的资源配置内容与单独设置Volume时基本一样,但有两点不同:
- 对于Secret类型从Volume字段为"secretName"在projected.source.secret中被改为”name"
- Volume的挂载模式为“defaultMode”仅可以设置在projected级别,对于各子项,仍然可以设置各自的挂载模式,使用字段名为“mode”
# #使用Projected Volume挂载COnfigMap、Sectet、Downward API 三种资源 # apiVersion: v1 kind: Pod metadata: name: volume-test spec: containers: - name: container-test image: busybox volumeMounts: - name: all-in-one mountPath: "/projected-volume" readOnly: true volumes: - name: all-in-one projected: sources: - secret: name: mysecret items: - key: username path: my-group/my-username - downwardAPI: items: - path: "labels" fieldRef: fieldPath: metadata.labels - path: "cpu_limit" resourceFieldRef: containerName: container-test resource: limits.cpu - configMap: name: muconfigmap items: - key: config path: my-group/my-configmap
使用projected Volume挂载两个Secret资源,其中一个设置为非默认挂载
#
#使用Projected Volume挂载ServiceAccountToken
#
apiVersion: v1
kind: Pod
metadate:
name: sa-token-test
spec:
containers:
- name: container-test
image: busybox
volumemounts:
- name: token-vol
mountPath: "/service-account"
readOnly: true
volumes:
- name: token-val
projected:
sources:
- serviceAccountToken:
audience: api
expirationsSeconds: 3600
path: token
#
#使用projected挂载两个secret并同一个设置挂载模式
#
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- secret:
name: mysecret2
items:
- key: passwoed
path: my-group/my-password
mode: 0511 #设置非默认挂载
对于ServiceAccountToken类型为Volume,可以设置Token的audience、expirationsSeconds、path等属性信息
- audience: 预期受众的名称。Token的接收者必须使用其中的audience标识符来标识自己,否则应该拒绝该Token。该字段是可选的,默认为API Server的标识符“api”
- expirationsSeconds: Service Account Token的过期时间,默认为1h至少为10min。管理员可以通过kube-apiver的启动参数--service-account-max-token-expiration限制token的最长生效
- path:挂载目录下的相对路径