詳解k8s ConfigMap 中 subPath 字段和 items 字段
Kubernetes中什么是subPath
有時(shí),在單個(gè) Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 屬性可用于指定所引用的卷內(nèi)的
子路徑,而不是其根路徑。
這句話理解了,基本就懂subPath怎么用了,比如我們要替換nginx.cnf, 掛載的ConfigMap是一個(gè)文件夾,如果沒(méi)有subPath,那
/etc/nginx/nginx.cnf
將變成一個(gè)文件夾,subPath是用來(lái)指定卷內(nèi)子路徑的! 按照邏輯subPath應(yīng)該在volumes下進(jìn)行設(shè)置會(huì)比較合理,這可能就是它不好理解的根本原因。
什么時(shí)候應(yīng)該使用 subPath
- 場(chǎng)景一: 一個(gè)共享卷, 掛載多個(gè)路徑.
- 場(chǎng)景二: ConfigMap或Secret掛載到特定目錄的特定路徑, 而該目錄下已經(jīng)有其他文件且不希望被覆蓋掉
1. subPath字段的作用
在Linux中,將目錄A掛載到目錄B,則目錄B原有的文件都會(huì)被目錄A下的文件覆蓋。
那么在k8s中,如何將configmap掛載到容器中某個(gè)目錄的文件中呢?答案是使用subPath
。
subPath可以將configMap和secret作為文件掛載到容器中而不覆蓋掛載目錄下的文件。
話不多說(shuō),直接看一個(gè)例子。
制作案例鏡像:
dockerfile:
FROM busybox WORKDIR /workspace RUN touch a.txt b.txt c.txt
切換到dockerfile目錄下執(zhí)行:
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
可以看到,因?yàn)閜od1中是將configmap直接掛載到了容器的workspace目錄,由于Linux的目錄掛載特性(可以看這篇:什么是掛載,Linux掛載詳解),原來(lái)的workspace目錄下的文件將會(huì)被掛載過(guò)來(lái)的目錄下(可以將configmap看成一個(gè)目錄,因?yàn)槊總€(gè)key都是一個(gè)文件)的文件所覆蓋,因此workspace中只有configmap中的info和info2文件。如果不想被覆蓋,則要以文件的方式進(jìn)行掛載,如pod2.yaml中所示,注意mountPath和subPath的寫(xiě)法,subPath此時(shí)指的就是configMap中的key,也就是文件名。
2. items字段的作用
假如不想以key名作為配置文件名可以引入items 字段,在其中逐個(gè)指定要用相對(duì)路徑path替換的key:
volumes: - name: config configMap: name: configmap items: - key: info # 原文件名(key的名稱(chēng)) path: userinfo # 修改之后的文件名(key的名稱(chēng)) - key: info2 path: userinfo2
items還有一個(gè)作用,就是只有items下的key對(duì)應(yīng)的文件會(huì)被掛載到容器中。
比如pod1.yaml中不想把info和info2都掛載到workspace目錄下,而只需要掛載info到workspace目錄下,則可以將pod1.yaml的volumes字段修改為:
volumes: - name: config configMap: name: configmap items: - key: info path: info
到此這篇關(guān)于詳解k8s ConfigMap 中 subPath 字段和 items 字段的文章就介紹到這了,更多相關(guān)k8s subPath和 items內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rainbond調(diào)用Vue?React項(xiàng)目的后端接口
這篇文章主要為大家介紹了Rainbond調(diào)用Vue?React項(xiàng)目的后端接口問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04云原生技術(shù)kubernetes調(diào)度單位pod的使用詳解
這篇文章主要介紹了云原生技術(shù)kubernetes調(diào)度單位pod的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用K8S,感興趣的朋友可以了解下2021-03-03CentOS 7.9 升級(jí)內(nèi)核 kernel-ml-5.6.14版本的方法
這篇文章主要介紹了CentOS 7.9 升級(jí)內(nèi)核 kernel-ml-5.6.14版本,默認(rèn)內(nèi)核版本為3.10.0,現(xiàn)升級(jí)到 5.6.14 版本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10Kubernetes Dashboard 配置用戶(hù)名密碼方式登錄操作流程
為了K8s集群安全,默認(rèn)情況下Dashboard以Token的形式登錄的,那如果我們想以用戶(hù)名/密碼的方式登錄該怎么操作呢?其實(shí)只需要我們創(chuàng)建用戶(hù)并進(jìn)行 ClusterRoleBinding綁定即可,下面給大家分享Kubernetes Dashboard 配置用戶(hù)名密碼方式登錄操作流程,感興趣的朋友一起看看吧2024-06-06Istio 自動(dòng)注入 sidecar 失敗導(dǎo)致無(wú)法訪問(wèn)webhook服務(wù)的解決方法
最近工作中在部署Istio環(huán)境的過(guò)程中發(fā)現(xiàn)官方示例啟動(dòng)的pod不能訪問(wèn)不到Istio的webhook,這個(gè)問(wèn)題也是困擾了我一天,我把他歸類(lèi)到sidecar注入失敗的情況下,本文給大家分享問(wèn)題解決方法,感興趣的朋友跟隨小編一起看看吧2023-10-10