coredns的configMap的详细内容:
[root@k8s-master ~]# cat coredns/coredns-cm.yaml apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | #这个就是key值了 Corefile .:53 { errors log health kubernetes cluster.local 10.254.0.0/18 forward . /etc/resolv.conf cache 30 }
conredns调用它的configMap:
#无关部分省略了 containers: - name: coredns image: registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 imagePullPolicy: IfNotPresent args: [ "-conf", "/etc/coredns/Corefile" ] volumeMounts: - name: config-volume mountPath: /etc/coredns ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP #一些存活探针什么的也省略了 volumes: - name: config-volume configMap: name: coredns items: - key: Corefile #coredns-cm.yaml文件里定义的 path: Corefile #挂载的文件名称
总结:
configMap和secret是比较类似的,作用基本相同,都是对于kubernetes集群内的配置文件解耦,调用方法也基本类似,都可以通过volume挂载方式直接挂到pod相关的容器内部,也可以作为系统环境变量注入到pod相关的容器内。都可以被多个pod同时调用,比如,Apod调用了名称为B的configMap的某个变量C,Dpod也可以调用BconfigMap的变量C,Epod当然也可以,以此类推。
只是挂载为文件的时候需要注意一点,如果挂载目标路径有文件,那么,挂载文件的时候将会覆盖,如果不想覆盖,比如,挂载到pod的容器的/etc目录下,这个时候肯定不希望覆盖了,如果覆盖容器可能都启动不了,就这个subPath的情况我专门做一下解释:
文件夹+文件的情形:
此时的容器内将会有 /etc/index.jsp 这个文件夹,此文件夹下有index.html 这个文件,也就是最终容器内有/etc/index.jsp/index.html这个文件。
volumeMounts: - name: conf mountPath: /etc/index.jsp # subPath: index.html ports: - containerPort: 8080 volumes: - name: conf configMap: name: cm-test items: - key: index.jsp path: index.html #挂载在容器后叫什么文件名
覆盖的情形:
此时的pod启动不了,启动失败,因为etc目录被覆盖了,/etc/目录下就只有一个index.html 文件了。
volumeMounts: - name: conf mountPath: /etc/ # subPath: index.html ports: - containerPort: 8080 volumes: - name: conf configMap: name: cm-test items: - key: index.jsp path: index.html #挂载在容器后叫什么文件名
正确的subPath挂载情形:
此时是挂载的文件,没有任何目录,文件名称是index.jsp,注意,这里使用了subPath,
volumeMounts: - name: conf mountPath: /etc/index.jsp subPath: index.html ports: - containerPort: 8080 volumes: - name: conf configMap: name: cm-test items: - key: index.jsp path: index.html #挂载在容器后叫什么文件名
root@tomcat-deployment-d74966946-f8kpm:/etc# ls -al index.jsp -rw-r--r-- 1 root root 156 Oct 12 12:55 index.jsp
不能正确挂载configMap的情形:
subPath和path修改的不一样了,此时没有覆盖,但只有/etc/index.jsp文件夹,cm的内容是完全找不到的。
volumeMounts: - name: conf mountPath: /etc/index.jsp subPath: index.html ports: - containerPort: 8080 volumes: - name: conf configMap: name: cm-test items: - key: index.jsp path: index.jsp #挂载在容器后叫什么文件名
root@tomcat-deployment-6dc7fc8cbd-v6wcp:/etc# ls -al index.jsp/ total 0 drwxrwxrwx 2 root root 6 Oct 12 13:00 . drwxr-xr-x 1 root root 23 Oct 12 13:00 ..
强烈推荐的做法:
是一直使用subPath并且subPath和path保持一致(注意了,注意了,这种subPath是推荐使用的,也应该一直使用的方法哦):
volumeMounts: - name: conf mountPath: /etc/index.jsp subPath: index.jsp ports: - containerPort: 8080 volumes: - name: conf configMap: name: cm-test items: - key: index.jsp path: index.jsp #挂载在容器后叫什么文件名