挂载为文件

大部分情况下,ConfigMap定义的都是配置文件,而不是环境变量,因此需要将ConfigMap中的文件(一般为--from-file创建)挂载到Pod中,然后Pod中的容器就可以引用,此时可以通过Pod的volume字段进行挂载。

名为cm-dir的ConfigMap:
$ kubectl get cm cm-dir -o yaml
apiVersion: v1
data:
  game.properties: "enemies=aliens\r\nlives=3\r\nenemies.cheat=true\r\nenemies.cheat.level=noGoodRotten\r\nsecret.code.passphrase=UUDDLRLRBABAS\r\nsecret.code.allowed=true\r\nsecret.code.lives=30"
  ui.properties: "color.good=purple\r\ncolor.bad=yellow\r\nallow.textmode=true\r\nhow.nice.to.look=fairlyNice"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T06:41:29Z"
  name: cm-dir
  namespace: default
  resourceVersion: "152782"
  uid: 0238826d-3ffb-4365-9b12-76610f4b6b31

在该configMap中存在两个键,分别名为game.propertiesui.properties,这两个键对应的值各自表示一个properties文件

挂载ConfigMap中所有的文件

将名称为cm-dir的ConfigMap挂载到容器的/etc/config/目录下:

pod-cm.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: ['/bin/sh', '-c', 'ls /etc/config']
    volumeMounts:
      - name: config-volume
        mountPath:  /etc/config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
  volumes:
    - name: config-volume
      configMap:
        name: cm-dir
  restartPolicy: Never      

使用kubectl创建该Pod后,会执行Pod设置的command命令,即执行ls /etc/config/

$ kubectl create -f pod-cm.yaml 
pod/dapi-test-pod created

$ kubectl get pod dapi-test-pod
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          17s

$ kubectl logs dapi-test-pod
game.properties
ui.properties

注意:

/etc/config/目录会被覆盖

自定义文件名挂载ConfigMap

很多情况下,需要更改挂载的文件名,可以使用path字段指定ConfigMap挂载的文件名,比如将game.properties挂载到/etc/config,并指定名称为keys:

pod-cm-rename.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-rename
spec:
  containers:
  - name: test-container
    image: busybox
    command: ['/bin/sh', '-c', 'cat /etc/config/keys']
    volumeMounts:
      - name: config-volume
        mountPath:  /etc/config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
  volumes:
    - name: config-volume
      configMap:
        name: cm-dir
        items:
          - key: game.properties
            path: keys
  restartPolicy: Never      
$ kubectl create -f pod-cm-rename.yaml 
pod/pod-cm-rename created

$ kubectl get pod pod-cm-rename
NAME            READY   STATUS      RESTARTS   AGE
pod-cm-rename   0/1     Completed   0          13s

$ kubectl logs pod-cm-rename
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

注意:

只有在items中指定的key才会被挂载,未指定的key将不会被挂载

指定挂载的文件权限

ConfigMap在挂载使用时可以更改文件的权限(默认是0644),比如将上述的文件挂载权限自定义为0666(对应Linux的文件权限为rw-rw-rw-):

pod-cm-rename.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-rename
spec:
  containers:
  - name: test-container
    image: busybox
    command: ['/bin/sh', '-c', 'cat /etc/config/keys']
    volumeMounts:
      - name: config-volume
        mountPath:  /etc/config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
  volumes:
    - name: config-volume
      configMap:
        name: cm-dir
        items:
          - key: game.properties
            path: keys
        defaultMode: 0666
  restartPolicy: Never      

使用.configMap.defaultMode字段自定义文件权限,该权限对.configMap.items下的所有文件均生效

可以使用items[].mode字段单独设置某个文件的权限,用于不同文件的不同权限挂载。

最后更新于