Projected Volume

将一个或多个上述资源对象(ConfigMap、Secret、Downward API)一次性挂载到容器内的同一个目录下

Projected Volume的一些常见应用场景

  • 通过Pod的标签生成不同的配置文件,需要使用配置文件,以及用户名和密码,这时需要使用3种资源:ConfigMap、Secrets、Downward API。
  • 在自动化运维应用中使用配置文件和账号信息时,需要使用ConfigMap、Secrets。
  • 在配置文件内使用Pod名称(metadata.name)记录日志时,需要使用ConfigMap、Downward API。
  • 使用某个Secret对Pod所在命名空间(metadata.namespace)进行加密时,需要使用Secret、Downward API。

需要首先创建configmap,secret,用于下列测试使用

# projected-volume-file-test.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  apploglevel: info
  appdatadir: /var/data
  config: 54ddd88cc
---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: KK345WWWWNNN
  username: KK345WWWWNNN
---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret2
type: Opaque
data:
  password: KK345UUUUHHH
  username: KK345UUUUHHH

# 创建
# kubectl create -f projected-volume-file-test.yaml
# 查看
# kubectl describe configmap myconfigmap
# kubectl describe secret mysecret
# kubectl describe secret mysecret2

使用 Projected Volume 挂载 ConfigMap、Secret、Downward API共3种资源的示例

apiVersion: v1
kind: Pod
metadata:
  name: volume-test-all
spec:
  containers:
  - name: container-test
    image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: all-in-one-all
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one-all
    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: myconfigmap
          items:
            - key: config
              path: my-group/my-config
			
# 创建
# kubectl create -f volume-test-all.yaml
# 查看
# kubectl exec -it volume-test-all  -- ls -lh /projected-volume/
# kubectl exec -it volume-test-all  -- ls -lh /projected-volume/my-group/
# kubectl exec -it volume-test-all  -- cat /projected-volume/cpu_limit
# kubectl exec -it volume-test-all  -- cat /projected-volume/labels
# kubectl exec -it volume-test-all  -- cat /projected-volume/my-group/my-config
# kubectl exec -it volume-test-all  -- cat /projected-volume/my-group/my-username

使用Projected Volume挂载两个Secret资源,其中一个设置了非默认挂载模式(mode)的示例

apiVersion: v1
kind: Pod
metadata:
  name: volume-test-secret2
spec:
  containers:
  - name: container-test
    image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    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: password
              path: my-group/my-password
              mode: 511

# 创建
# kubectl create -f volume-test-secret2.yaml 	
# 查看
# kubectl exec -it volume-test-secret2  -- ls /projected-volume
# kubectl exec -it volume-test-secret2  -- ls -lh /projected-volume/my-group/
# kubectl exec -it volume-test-secret2  -- cat  /projected-volume/my-group/my-username
# kubectl exec -it volume-test-secret2  -- cat  /projected-volume/my-group/my-password
		 

使用Projected Volume挂载ServiceAccountToken的示例
ServiceAccountToken通常用于容器内应用访问API Server鉴权的场景中

apiVersion: v1
kind: Pod 
metadata:
  name: sa-token-test 
spec:
  containers:
  - name: container-test
    image: busybox 
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: token-vol
      mountPath: "/service-account"
      readOnly: true
  volumes:
  - name: token-vol
    projected:
      sources:
      - serviceAccountToken:
          audience: api
          expirationSeconds: 3600
          path: token


# audience:预期受众的名称。Token的接收者必须使用其中的audience标识符来标识自己,
# 否则应该拒绝该Token。该字段是可选的,默认为API Server的标识符“api”。
# expirationSeconds:Service Account Token的过期时间,默认为1h,至少为10min(600s)。
# 管理员可以通过kube-apiserver的启动参--service-account-max-token-expiration限制Token的最长有效时间
# path:挂载目录下的相对路径。

# 创建
# kubectl create -f sa-token-test.yaml 
# 查看挂载目录
# kubectl exec -it sa-token-test  -- ls /service-account
# 查看挂载内容
# kubectl exec -it sa-token-test  -- cat /service-account/token
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐