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