k8s configMap 中 subPath 字段和 items 字段


1. subPath字段的作用

在Linux中,將目錄A掛載到目錄B,則目錄B原有的文件都會被目錄A下的文件覆蓋。

那么在k8s中,如何將configmap掛載到容器中某個目錄的文件中呢?答案是使用subPath。

subPath可以將configMap和secret作為文件掛載到容器中而不覆蓋掛載目錄下的文件。

 

話不多說,直接看一個例子。

制作案例鏡像:

dockerfile:

FROM busybox
WORKDIR /workspace
RUN touch a.txt b.txt c.txt

切換到dockerfile目錄下執行:

docker build -t mydocker:latest .
docker tag mydocker:latest zengfeng666/mydocker:1.0
docker push zengfeng666/mydocker:1.0

 

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
  namespace: dev
data:
  info: |
    username:admin
    password:123456
  info2: zhangssssssssssssssssssssssssss

 

pod1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: dev
spec:
  containers:
  - name: mydocker
    image: zengfeng666/mydocker:1.0
    command: ["/bin/sh", "-c", "while true; do sleep 2; done;"]
    volumeMounts:
    - name: config
      mountPath: /workspace
  volumes:
  - name: config
    configMap:
      name: configmap

 

pod2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod2 namespace: dev spec: containers: - name: mydocker image: zengfeng666/mydocker:1.0 command: ["/bin/sh", "-c", "while true; do sleep 2; done;"] volumeMounts: - name: config mountPath: /workspace/info subPath: info - name: config mountPath: /workspace/info2 subPath: info2 volumes: - name: config configMap: name: configmap

 

$ kubectl create -f pod1.yaml
$ kubectl create -f pod2.yaml

$ kubectl get pods -n dev
NAME   READY   STATUS    RESTARTS   AGE
pod1   1/1     Running   0          2m20s
pod2   1/1     Running   0          14s

 

可以看到,因為pod1中是將configmap直接掛載到了容器的workspace目錄,由於Linux的目錄掛載特性(可以看這篇:什么是掛載,Linux掛載詳解),原來的workspace目錄下的文件將會被掛載過來的目錄下(可以將configmap看成一個目錄,因為每個key都是一個文件)的文件所覆蓋,因此workspace中只有configmap中的info和info2文件。如果不想被覆蓋,則要以文件的方式進行掛載,如pod2.yaml中所示,注意mountPath和subPath的寫法,subPath此時指的就是configMap中的key,也就是文件名。

 

 

 

2. items字段的作用

 假如不想以key名作為配置文件名可以引入items 字段,在其中逐個指定要用相對路徑path替換的key:

     volumes:
      - name: config
        configMap:
          name: configmap
          items:
          - key: info         # 原文件名(key的名稱)
            path: userinfo    # 修改之后的文件名(key的名稱)
          - key: info2
            path: userinfo2

items還有一個作用,就是只有items下的key對應的文件會被掛載到容器中。

比如pod1.yaml中不想把info和info2都掛載到workspace目錄下,而只需要掛載info到workspace目錄下,則可以將pod1.yaml的volumes字段修改為:

     volumes:
      - name: config
        configMap:
          name: configmap
          items:
          - key: info         
            path: info         

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM