摘要:一個(gè)卷的掛載傳播由中的字段控制。此模式等同于內(nèi)核文檔中描述的掛載傳播。此卷掛載的行為與掛載相同。掛載傳播可能很危險(xiǎn)。所謂傳播事件,是指由一個(gè)掛載對(duì)象的狀態(tài)變化導(dǎo)致的其它掛載對(duì)象的掛載與解除掛載動(dòng)作的事件。
Mount propagation
掛載傳播允許將Container掛載的卷共享到同一Pod中的其他Container,甚至可以共享到同一節(jié)點(diǎn)上的其他Pod。
一個(gè)卷的掛載傳播由Container.volumeMounts中的mountPropagation字段控制。它的值是:
None 此卷掛載不會(huì)接收到任何后續(xù)掛載到該卷或是掛載到該卷的子目錄下的掛載。以類似的方式,在主機(jī)上不會(huì)顯示Container創(chuàng)建的裝載。這是默認(rèn)模式。
此模式等同于Linux內(nèi)核文檔中所述的 private 傳播。
HostToContainer 此卷掛載將會(huì)接收到任何后續(xù)掛載到該卷或是掛載到該卷的子目錄下的掛載。
換句話說,如果主機(jī)在卷掛載中掛載任何內(nèi)容,則Container將看到它掛載在那里。
類似地,如果任何具有 Bidirectional 掛載傳播設(shè)置的Pod掛載到同一個(gè)卷中,那么具有HostToContainer掛載傳播的Container將會(huì)看到它。
此模式等同于Linux內(nèi)核文檔中描述的rslave掛載傳播。
Bidirectional 此卷掛載的行為與HostToContainer掛載相同。此外,Container創(chuàng)建的所有卷掛載都將傳播回主機(jī)和所有使用相同卷的Pod的所有容器。
此模式的典型用例是具有Flexvolume或CSI驅(qū)動(dòng)程序的Pod需要使用hostPath 卷模式 在主機(jī)上掛載內(nèi)容。
此模式等同于Linux內(nèi)核文檔中描述的rshared安裝傳播。
PS:
Bidirectional 掛載傳播可能很危險(xiǎn)。它可能會(huì)損壞主機(jī)操作系統(tǒng),因此只允許在特權(quán)容器中使用它。強(qiáng)烈建議您熟悉Linux內(nèi)核行為。此外,容器在容器中創(chuàng)建的任何卷裝入必須在終止時(shí)由容器銷毀(卸載)。
Bidirectional一些使用場(chǎng)景:
在不同的pod之間共享設(shè)備,其中掛載發(fā)生在pod中,但是在pod之間共享。
從容器內(nèi)部附加設(shè)備。例如,從容器內(nèi)部附加ISCSI設(shè)備。這時(shí)候因?yàn)槿绻萜魉赖簦鳈C(jī)將不能獲得所需的信息(除非使用雙向安裝傳播)來正確刷新寫入和分離設(shè)備。
sampledeployment: containers: - image: gcr.io/google_containers/busybox:1.24 name: reader volume: - mount: /usr/test-pod store: local-vol propagation: bidirectional name: local-test-reader version: extensions/v1beta1 volumes: local-vol: pvc:example-local-claim配置
在掛載傳播可以在某些部署(CoreOS,RedHat / Centos,Ubuntu)上正常工作之前,必須在Docker中正確配置掛載共享,如下所示。
編輯Docker的systemdservice 文件。設(shè)置MountFlags如下:
MountFlags=shared
或者,如果存在,則刪除MountFlags = slave。然后重啟Docker守護(hù)進(jìn)程:
$ sudo systemctl daemon-reload $ sudo systemctl restart docker具體案例
之所以關(guān)注這塊,是由于我們?cè)趯?shí)際使用k8s的過程中遇到了相關(guān)的問題。
我們?nèi)萜鳂I(yè)務(wù)日志的收集有很大一部分通過sidecar的方式,mount日志到主機(jī)某個(gè)目錄。由于我們的日志量非常大,即使我們每個(gè)主機(jī)掛載了1T的硬盤,經(jīng)常會(huì)寫滿這張盤。所以我們實(shí)現(xiàn)了一個(gè)log-tracer的項(xiàng)目,專門用于根據(jù)pod的日志掛載信息clear過期的日志。通過daemonset方式部署。
但是如果設(shè)置mount為private的話,缺乏廣播通知。在實(shí)際新增pod后,有一部分的日志掛載是無法感測(cè)到,因而也無法徹底清理。
究其深層次分析,該特性并不是k8s或是docker實(shí)現(xiàn)的。本質(zhì)上是mount namespace 的特性。
mount namespace通過隔離文件系統(tǒng)掛載點(diǎn)對(duì)隔離文件系統(tǒng)提供支持,它是歷史上第一個(gè)Linux namespace,所以它的標(biāo)識(shí)位比較特殊,就是CLONE_NEWNS。隔離后,不同mount namespace中的文件結(jié)構(gòu)發(fā)生變化也互不影響。你可以通過/proc/[pid]/mounts查看到所有掛載在當(dāng)前namespace中的文件系統(tǒng),還可以通過/proc/[pid]/mountstats看到mount namespace中文件設(shè)備的統(tǒng)計(jì)信息,包括掛載文件的名字、文件系統(tǒng)類型、掛載位置等等。
進(jìn)程在創(chuàng)建mount namespace時(shí),會(huì)把當(dāng)前的文件結(jié)構(gòu)復(fù)制給新的namespace。新namespace中的所有mount操作都只影響自身的文件系統(tǒng),而對(duì)外界不會(huì)產(chǎn)生任何影響。這樣做非常嚴(yán)格地實(shí)現(xiàn)了隔離,但是某些情況可能并不適用。比如父節(jié)點(diǎn)namespace中的進(jìn)程掛載了一張CD-ROM,這時(shí)子節(jié)點(diǎn)namespace拷貝的目錄結(jié)構(gòu)就無法自動(dòng)掛載上這張CD-ROM,因?yàn)檫@種操作會(huì)影響到父節(jié)點(diǎn)的文件系統(tǒng)。
2006 年引入的掛載傳播(mount propagation)解決了這個(gè)問題,掛載傳播定義了掛載對(duì)象(mount object)之間的關(guān)系,系統(tǒng)用這些關(guān)系決定任何掛載對(duì)象中的掛載事件如何傳播到其他掛載對(duì)象(參考自:http://www.ibm.com/developerw...)。所謂傳播事件,是指由一個(gè)掛載對(duì)象的狀態(tài)變化導(dǎo)致的其它掛載對(duì)象的掛載與解除掛載動(dòng)作的事件。
共享關(guān)系(share relationship)。如果兩個(gè)掛載對(duì)象具有共享關(guān)系,那么一個(gè)掛載對(duì)象中的掛載事件會(huì)傳播到另一個(gè)掛載對(duì)象,反之亦然。
從屬關(guān)系(slave relationship)。如果兩個(gè)掛載對(duì)象形成從屬關(guān)系,那么一個(gè)掛載對(duì)象中的掛載事件會(huì)傳播到另一個(gè)掛載對(duì)象,但是反過來不行;在這種關(guān)系中,從屬對(duì)象是事件的接收者。
一個(gè)掛載狀態(tài)可能為如下的其中一種:
共享掛載(shared)
從屬掛載(slave)
共享/從屬掛載(shared and slave)
私有掛載(private)
不可綁定掛載(unbindable)
在默認(rèn)情況下,所有掛載都是私有的。可以用以下命令將掛載對(duì)象顯式地標(biāo)為共享掛載:
mount --make-shared
例如,如果 / 上的掛載必須是共享的,那么執(zhí)行以下命令:
mount --make-shared /
從共享掛載克隆的掛載對(duì)象也是共享的掛載;它們相互傳播掛載事件。
通過執(zhí)行以下命令,可以顯式地將一個(gè)共享掛載轉(zhuǎn)換為從屬掛載:
mount --make-slave
從從屬掛載克隆的掛載對(duì)象也是從屬的掛載,它也從屬于原來的從屬掛載的主掛載對(duì)象。
通過執(zhí)行以下命令,可以將掛載對(duì)象標(biāo)為私有的:
mount --make-private
通過執(zhí)行以下命令,可以將掛載對(duì)象標(biāo)為不可綁定的:
mount --make-unbindable
最后,這些設(shè)置都可以遞歸地應(yīng)用,這意味著它們將應(yīng)用于目標(biāo)掛載之下的所有掛載。
mount --make-rshared /
將 / 之下的所有掛載轉(zhuǎn)換為共享掛載。
參考文獻(xiàn)官方文檔
Docker背后的內(nèi)核知識(shí)——Namespace資源隔離
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/33083.html
摘要:一個(gè)卷的掛載傳播由中的字段控制。此模式等同于內(nèi)核文檔中描述的掛載傳播。此卷掛載的行為與掛載相同。掛載傳播可能很危險(xiǎn)。所謂傳播事件,是指由一個(gè)掛載對(duì)象的狀態(tài)變化導(dǎo)致的其它掛載對(duì)象的掛載與解除掛載動(dòng)作的事件。 Mount propagation 掛載傳播允許將Container掛載的卷共享到同一Pod中的其他Container,甚至可以共享到同一節(jié)點(diǎn)上的其他Pod。一個(gè)卷的掛載傳播由Con...
摘要:一個(gè)卷的掛載傳播由中的字段控制。此模式等同于內(nèi)核文檔中描述的掛載傳播。此卷掛載的行為與掛載相同。掛載傳播可能很危險(xiǎn)。所謂傳播事件,是指由一個(gè)掛載對(duì)象的狀態(tài)變化導(dǎo)致的其它掛載對(duì)象的掛載與解除掛載動(dòng)作的事件。 Mount propagation 掛載傳播允許將Container掛載的卷共享到同一Pod中的其他Container,甚至可以共享到同一節(jié)點(diǎn)上的其他Pod。一個(gè)卷的掛載傳播由Con...
摘要:距離上一次版本發(fā)布三個(gè)月之隔,是今年的第三個(gè)主要版本。證書輪換證書輪換功能現(xiàn)已進(jìn)入狀態(tài)。這一功能可以在當(dāng)前證書到期時(shí)自動(dòng)續(xù)訂密鑰和服務(wù)器的證書。更多包含許多修復(fù)和內(nèi)部組件的改進(jìn),此次的更新明顯側(cè)重于穩(wěn)定核心以及使現(xiàn)有的功能成熟。 Kubernetes1.12已于今日全新發(fā)布!Kubelet證書輪換、資源配額優(yōu)先級(jí)、掛載命名空間、對(duì)Azure的增強(qiáng)支持等10大亮點(diǎn)功能,本文為你一一解讀!...
摘要:執(zhí)行容器內(nèi)部運(yùn)行的執(zhí)行工作作為容器的執(zhí)行驅(qū)動(dòng),負(fù)責(zé)創(chuàng)建容器運(yùn)行命名空間,負(fù)責(zé)容器資源使用的統(tǒng)計(jì)與限制,負(fù)責(zé)容器內(nèi)部進(jìn)程的真正運(yùn)行等。典型的在啟動(dòng)后,首先將設(shè)置為進(jìn)行一系列檢查然后將其切換為供用戶使用。 在https://segmentfault.com/a/11... 容器,隔離,云的概述。這篇對(duì)其中用途廣泛的docker,k8s做詳細(xì)介紹,并給出云搭建的生態(tài)環(huán)境體系。 docker ...
閱讀 1640·2023-04-25 20:36
閱讀 2049·2021-09-02 15:11
閱讀 1177·2021-08-27 13:13
閱讀 2653·2019-08-30 15:52
閱讀 4588·2019-08-29 17:13
閱讀 1001·2019-08-29 11:09
閱讀 1491·2019-08-26 11:51
閱讀 833·2019-08-26 10:56