k8s:configmap/secret存储二进制文件研究

一直以为configmap/secret没办法存储二进制文件,最近有个p12的证书,也类似于二进制文件,用secret存储挂载进容器中,居然可以正常使用。 就想着其它二进制文件应该也可以吧,就拿linux下面的ls命令的文件,用configmap/secret分别存储然后挂载进容器中,也都可以正常使用。

简单的实验步骤:

制作一个configmap,存储文件是ls这个命令文件。

# kubectl create configmap configmap-ls --from-file=/root/ls

注意:要把容器里的ls命令复制到你执行kubectl命令的这个系统上用来configmap存储,因为可能你执行命令的这个系统和容器的系统不一样,你如果用这个系统上的ls命令挂载进去,可能没办法正常使用。

然后在deploy中,制作一个挂载配置,把这个configmap挂载进容器中。

............
        volumeMounts:
        - mountPath: /configmap/
          name: configmap-ls
...........
      volumes:
      - configMap:
          defaultMode: 420
          name: configmap-ls
        name: configmap-ls

ls这个命令文件就会在这个容器挂载的目录/configmap/下。因为这个容器中的挂载目录是只读的,需要从挂载目录中把ls文件复制出来,再授予它执行权限就可以正常使用了。(具体步骤可以自己去操作)

打开configmap的配置,可以发现,它里面有个binaryData字段

# kubectl get  configmap configmap-ls -o yaml
apiVersion: v1
binaryData:
  ls: f0VMRgIBAQAAAAAAAAAA.......................

主要就是这个binaryData字段起了作用。 查了一下,k8s是从1.10.0开始有了这个字段,也就是从这个版本开始,configmap开始支持存储二进制文件了。configmap存储文件时,会自动判断是不是能识别的utf8数据,如果是非utf8的数据,就会以二进制的格式来存储保存。

secret也可以保存二进制文件,但好像没有特殊的字段,应该也是自动识别的。 # kubectl create secret generic secret-ls --from-file=/root/ls