中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行Docker和Kubernetes中使用Ceph RBD卷的原理分析

發布時間:2021-11-10 16:44:15 來源:億速云 閱讀:238 作者:柒染 欄目:云計算

如何進行Docker和Kubernetes中使用Ceph RBD卷的原理分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Docker或者Kubernetes中使用Ceph RBD塊設備,相比于在宿主機中,是否會對性能造成額外損失?帶著這些疑問對相關技術進行原理分析。

Linux中的Mount綁定傳播

Linux的Mount綁定關系

Linux Mount命名空間通過隔離文件系統掛載點對隔離文件系統提供支持,它是歷史上第一個 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/developerworks/library/l-mount-namespaces/)。所謂傳播事件,是指由一個掛載對象的狀態變化導致的其它掛載對象的掛載與解除掛載動作的事件。

  • 共享關系(Share Relationship)。如果兩個掛載對象具有共享關系,那么一個掛載對象中的掛載事件會傳播到另一個掛載對象,反之亦然。

  • 從屬關系(Slave Relationship)。如果兩個掛載對象形成從屬關系,那么一個掛載對象中的掛載事件會傳播到另一個掛載對象,但是反過來不行;在這種關系中,從屬對象是事件的接收者。

一個掛載狀態可能為如下的其中一種:

  • 共享掛載(Shared

  • 從屬掛載(Slave

  • 共享 / 從屬掛載(Shared And Slave

  • 私有掛載(Private

  • 不可綁定掛載(Unbindable

傳播事件的掛載對象稱為共享掛載(Shared Mount);接收傳播事件的掛載對象稱為從屬掛載(Slave Mount)。既不傳播也不接收傳播事件的掛載對象稱為私有掛載(Private Mount)。另一種特殊的掛載對象稱為不可綁定的掛載(Unbindable Mount),它們與私有掛載相似,但是不允許執行綁定掛載,即創建 Mount Namespace 時這塊文件對象不可被復制。

如何進行Docker和Kubernetes中使用Ceph RBD卷的原理分析

共享掛載的應用場景非常明顯,就是為了文件數據的共享所必須存在的一種掛載方式;從屬掛載更大的意義在于某些“只讀”場景;私有掛載其實就是純粹的隔離,作為一個獨立的個體而存在;不可綁定掛載則有助于防止沒有必要的文件拷貝,如某個用戶數據目錄,當根目錄被遞歸式的復制時,用戶目錄無論從隱私還是實際用途考慮都需要有一個不可被復制的選項。

  • 默認情況下,所有掛載都是私有的。設置為共享掛載的命令如下:

$ mount --make-shared <mount-object>

從共享掛載克隆的掛載對象也是共享的掛載;它們相互傳播掛載事件。

  • 設置為從屬掛載的命令如下:

$ mount --make-slave <shared-mount-object>

從從屬掛載克隆的掛載對象也是從屬的掛載,它也從屬于原來的從屬掛載的主掛載對象。

  • 將一個從屬掛載對象設置為共享 / 從屬掛載,可以執行如下命令或者將其移動到一個共享掛載對象下:

$ mount --make-shared <slave-mount-object>
  • 如果你想把修改過的掛載對象重新標記為私有的,可以執行如下命令:

$ mount --make-private <mount-object>
  • 通過執行以下命令,可以將掛載對象標記為不可綁定的:

$ mount --make-unbindable <mount-object>

Linux的Mount綁定測試

  • 查看本機塊設備:

$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 222.6G  0 disk 
├─sda1            8:1    0   200M  0 part /boot
└─sda2            8:2    0 222.4G  0 part 
  ├─centos-root 253:0    0 122.4G  0 lvm  /
  └─centos-home 253:1    0   100G  0 lvm  /home
  • 創建和綁定目錄:

$ mkdir /opt/tmp /mnt/tmp /mnt/tmp1 /mnt/tmp2
$ mount --bind /opt/tmp /mnt/tmp
$ mount --bind /mnt/tmp1 /mnt/tmp2
  • 查看綁定目錄的詳細信息:

$ cat /proc/self/mountinfo | grep /mnt/tmp
549 40 253:0 /opt/tmp /mnt/tmp rw,relatime shared:1 - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota
583 40 253:0 /mnt/tmp1 /mnt/tmp2 rw,relatime shared:1 - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota

可以看到兩個綁定目錄都是共享的,且共享ID1,父目錄在253:0設備上。

在Docker中使用數據卷的主要方式

參考文檔:

  1. Manage data in Docker;

  2. Use bind mounts。

  • Docker支持的掛載模式:

如何進行Docker和Kubernetes中使用Ceph RBD卷的原理分析

  • 創建一個數據卷(卷掛載):

$ docker run --rm -it -v /data1 centos:7 bash
# Or
$ docker run --rm -it -v data1:/data1 centos:7 bash
# Or
$ docker run --rm -it --mount target=/data1 centos:7 bash
# Or
$ docker run --rm -it --mount type=volume,target=/data1 centos:7 bash
# Or
$ docker run --rm -it --mount type=volume,source=data1,target=/data1 centos:7 bash

$ docker ps | awk 'NR==2 {print $1}' | xargs -i docker inspect -f '{{.State.Pid}}' {} | xargs -i cat /proc/{}/mountinfo | grep data
1029 1011 253:0 /var/lib/docker/volumes/239be79a64f7fa6ec815b1d9f2a7773a678ee5c8c1150f03ca81b0d5177b36a0/_data /data1 rw,relatime master:1 - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota
  • 映射一個外部卷(綁定掛載):

$ docker run --rm -it -v /opt:/data2 centos:7 bash
# Or
$ docker run --rm -it --mount type=bind,source=/opt,target=/data2 centos:7 bash

$ docker ps | awk 'NR==2 {print $1}' | xargs -i docker inspect -f '{{.State.Pid}}' {} | xargs -i cat /proc/{}/mountinfo | grep data
1029 1011 253:0 /opt /data2 rw,relatime - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota
  • 使用數據型容器(卷掛載):

$ docker create --name vc -v /data1 centos:7
$ docker run --rm -it --volumes-from vc centos:7 bash

$ docker ps | awk 'NR==2 {print $1}' | xargs -i docker inspect -f '{{.State.Pid}}' {} | xargs -i cat /proc/{}/mountinfo | grep data
1029 1011 253:0 /var/lib/docker/volumes/fe71f2d0ef18beb92cab7b99afcc5f501e47ed18224463e8c1aa1e8733003803/_data /data1 rw,relatime master:1 - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota
  • 帶打包數據的容器(卷掛載):

編輯Dockerfile

FROM busybox:latest
ADD htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs

創建容器

$ mkdir htdocs
$ echo `date` > htdocs/test.txt
$ docker build -t volume-test .

$ docker create --name vc2 -v /data1 volume-test
$ docker run --rm -it --volumes-from vc2 volume-test sh
/ # cat /proc/self/mountinfo  | grep htdocs
1034 1011 253:0 /var/lib/docker/volumes/54f47af60b8fb25602f022dcd8ad5b3e1a93a2d20c1045184a70391d9bed69b6/_data /usr/local/apache2/htdocs rw,relatime master:1 - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota

$ docker ps | awk 'NR==2 {print $1}' | xargs -i docker inspect -f '{{.State.Pid}}' {} | xargs -i cat /proc/{}/mountinfo | grep htdocs
1034 1011 253:0 /var/lib/docker/volumes/54f47af60b8fb25602f022dcd8ad5b3e1a93a2d20c1045184a70391d9bed69b6/_data /usr/local/apache2/htdocs rw,relatime master:1 - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota
  • 使用臨時外部卷(臨時掛載):

$ docker run --rm -it --mount type=tmpfs,target=/data1 centos:7 bash

$ docker ps | awk 'NR==2 {print $1}' | xargs -i docker inspect -f '{{.State.Pid}}' {} | xargs -i cat /proc/{}/mountinfo | grep data
1029 1011 0:160 / /data1 rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,seclabel

在Docker中使用塊設備的相關測試

  • 在容器內通過綁定掛載使用宿主機的塊設備,只能使用已經在宿主機格式化和掛載好的目錄:

$ docker run --rm -it -v /data1 -v /opt:/data2 centos:7 bash
[root@4282b3df2417 /]# mount | grep data
/dev/sdb1 on /data2 type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda1 on /data1 type xfs (rw,relatime,attr2,inode64,noquota)

$ docker inspect 4282b3df2417 | grep -i pid 
            "Pid": 12797,
            "PidMode": "",
            "PidsLimit": 0,

$ cat /proc/12797/mounts | grep data
/dev/sdb1 /data2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sda1 /data1 xfs rw,relatime,attr2,inode64,noquota 0 0
  • 在容器內通過共享設備使用塊設備,可以讀寫,但是不能掛載:

$ docker run --rm -it --device /dev/sdc:/dev/sdc centos:7 bash

[root@55423f5eaeea /]# mkfs -t minix /dev/sdc
21856 inodes
65535 blocks
Firstdatazone=696 (696)
Zonesize=1024
Maxsize=268966912

[root@55423f5eaeea /]# mknod /dev/sdd b 8 48
[root@55423f5eaeea /]# mkfs -t minix /dev/sdd
mkfs.minix: cannot open /dev/sdd: Operation not permitted

[root@55423f5eaeea /]# rm /dev/sdc
rm: remove block special file '/dev/sdc'? y

[root@55423f5eaeea /]# mknod /dev/sdc b 8 32
[root@55423f5eaeea /]# mkfs -t minix /dev/sdc
21856 inodes
65535 blocks
Firstdatazone=696 (696)
Zonesize=1024
Maxsize=268966912

[root@55423f5eaeea /]# mount /dev/sdc mnt/
[root@55423f5eaeea /]# mount: permission denied

[root@55423f5eaeea /]# dd if=/dev/sdc of=/dev/null bs=512 count=10
10+0 records in
10+0 records out
5120 bytes (5.1 kB) copied, 0.000664491 s, 7.7 MB/s

[root@55423f5eaeea /]# dd if=/dev/zero of=/dev/sdc bs=512 count=10
10+0 records in
10+0 records out
5120 bytes (5.1 kB) copied, 0.00124138 s, 4.1 MB/s
  • 在容器內通過特權模式使用塊設備,可以讀寫和掛載:

$ docker run --rm -it --privileged=true centos:7 bash

[root@b5c40e199476 /]# mount /dev/sdc mnt
[root@b5c40e199476 /]# mkfs -t minix /dev/sdc
mount: unknown filesystem type 'minix'

[root@b5c40e199476 /]# yum install -y xfsprogs

[root@b5c40e199476 /]# mkfs.xfs /dev/sdc -f
meta-data=/dev/sdc               isize=512    agcount=4, agsize=6553600 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=26214400, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=12800, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@b5c40e199476 /]# mount /dev/sdc mnt
[root@b5c40e199476 /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          30G   19G   12G  62% /
tmpfs           910M     0  910M   0% /dev
tmpfs           910M     0  910M   0% /sys/fs/cgroup
/dev/sda1        30G   19G   12G  62% /etc/hosts
shm              64M     0   64M   0% /dev/shm
/dev/sdc        100G   33M  100G   1% /mnt

[root@b5c40e199476 /]# echo `date` > /mnt/time.txt
[root@b5c40e199476 /]# cat /mnt/time.txt 
Wed Mar 6 12:23:05 UTC 2019

Kubernetes中的塊設備使用和實現

  • 查看kublet初始化根目錄/var/lib/kubelet時的源碼,可以看到kubelet使用syscall.MS_SHARED|syscall.MS_REC標志,該目錄下下所有的Mount都默認共享(相當于執行mount --make-rshared /var/lib/kubelet):

// pkg/kubelet/kubelet.go
// setupDataDirs creates:
// 1.  the root directory
// 2.  the pods directory
// 3.  the plugins directory
// 4.  the pod-resources directory
func (kl *Kubelet) setupDataDirs() error {
...
    if err := kl.mounter.MakeRShared(kl.getRootDir()); err != nil {
		return fmt.Errorf("error configuring root directory: %v", err)
	}
...
}

// pkg/util/mount/nsenter_mount.go
func (n *NsenterMounter) MakeRShared(path string) error {
	return doMakeRShared(path, hostProcMountinfoPath)
}

// pkg/util/mount/mount_linux.go
// doMakeRShared is common implementation of MakeRShared on Linux. It checks if
// path is shared and bind-mounts it as rshared if needed. mountCmd and
// mountArgs are expected to contain mount-like command, doMakeRShared will add
// '--bind <path> <path>' and '--make-rshared <path>' to mountArgs.
func doMakeRShared(path string, mountInfoFilename string) error {
	shared, err := isShared(path, mountInfoFilename)
	if err != nil {
		return err
	}
	if shared {
		klog.V(4).Infof("Directory %s is already on a shared mount", path)
		return nil
	}

	klog.V(2).Infof("Bind-mounting %q with shared mount propagation", path)
	// mount --bind /var/lib/kubelet /var/lib/kubelet
	if err := syscall.Mount(path, path, "" /*fstype*/, syscall.MS_BIND, "" /*data*/); err != nil {
		return fmt.Errorf("failed to bind-mount %s: %v", path, err)
	}

	// mount --make-rshared /var/lib/kubelet
	if err := syscall.Mount(path, path, "" /*fstype*/, syscall.MS_SHARED|syscall.MS_REC, "" /*data*/); err != nil {
		return fmt.Errorf("failed to make %s rshared: %v", path, err)
	}

	return nil
}
  • 創建一個使用PVC創建RBDPod

$ echo 'apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
spec:
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
      - name: nginx-test-vol1
        mountPath: /data/
        readOnly: false
  volumes:
  - name: nginx-test-vol1
    persistentVolumeClaim:
      claimName: nginx-test-vol1-claim' | kubectl create -f -
pod/nginx-test created
  • 查看PVC的狀態:

$ kubectl get pvc
NAME                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-test-vol1-claim   Bound    pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54   10Gi       RWO            ceph-rbd       114s

$ kubectl describe pvc nginx-test-vol1-claim
Name:          nginx-test-vol1-claim
Namespace:     default
StorageClass:  ceph-rbd
Status:        Bound
Volume:        pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/rbd
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      10Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Events:
  Type       Reason                 Age    From                         Message
  ----       ------                 ----   ----                         -------
  Normal     ProvisioningSucceeded  6m36s  persistentvolume-controller  Successfully provisioned volume pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54 using kubernetes.io/rbd
Mounted By:  nginx-test
  • 查看PV的狀態:

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                           STORAGECLASS   REASON   AGE
pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54   10Gi       RWO            Delete           Bound    default/nginx-test-vol1-claim   ceph-rbd                105s

$ kubectl describe pv pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54
Name:            pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54
Labels:          <none>
Annotations:     kubernetes.io/createdby: rbd-dynamic-provisioner
                 pv.kubernetes.io/bound-by-controller: yes
                 pv.kubernetes.io/provisioned-by: kubernetes.io/rbd
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    ceph-rbd
Status:          Bound
Claim:           default/nginx-test-vol1-claim
Reclaim Policy:  Delete
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        10Gi
Node Affinity:   <none>
Message:         
Source:
    Type:          RBD (a Rados Block Device mount on the host that shares a pod's lifetime)
    CephMonitors:  [172.29.201.125:6789 172.29.201.126:6789 172.29.201.201:6789]
    RBDImage:      kubernetes-dynamic-pvc-db7fcd29-446c-11e9-af81-6c92bf74be54
    FSType:        
    RBDPool:       k8s
    RadosUser:     k8s
    Keyring:       /etc/ceph/keyring
    SecretRef:     &SecretReference{Name:ceph-k8s-secret,Namespace:,}
    ReadOnly:      false
Events:            <none>
  • 查看創建和映射的RBD

$ rbd ls -p k8s
kubernetes-dynamic-pvc-db7fcd29-446c-11e9-af81-6c92bf74be54

$ lsblk | grep rbd0
rbd0            252:0    0    10G  0 disk /var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/volumes/kubernetes.io~rbd/pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54
  • 查看RBD的掛載信息:

$ cat /proc/self/mountinfo | grep rbd0
313 40 252:0 / /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/k8s-image-kubernetes-dynamic-pvc-db7fcd29-446c-11e9-af81-6c92bf74be54 rw,relatime shared:262 - ext4 /dev/rbd0 rw,seclabel,stripe=1024,data=ordered
318 40 252:0 / /var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/volumes/kubernetes.io~rbd/pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54 rw,relatime shared:262 - ext4 /dev/rbd0 rw,seclabel,stripe=1024,data=ordered

可以看到RBD被掛載在兩個位置,一個是PodVolume目錄,還有一個是RBD插件目錄,而且這兩個目錄都是shared:262,說明這兩個目錄是被綁定的。

  • 查看RBD掛載目錄的位置:

$ cat /proc/self/mountinfo | grep "^40 "
40 0 253:0 / / rw,relatime shared:1 - xfs /dev/mapper/centos-root rw,seclabel,attr2,inode64,noquota

可以看到RBD掛載在253:0設備上,這是宿主機的根目錄所掛載的位置。

  • 查看Pod掛載的卷目錄:

$ cat /proc/self/mountinfo | grep 18a8fb7b-446d-11e9-bbd8-6c92bf74be54
303 40 0:56 / /var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/volumes/kubernetes.io~secret/default-token-zn95h rw,relatime shared:233 - tmpfs tmpfs rw,seclabel
318 40 252:0 / /var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/volumes/kubernetes.io~rbd/pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54 rw,relatime shared:262 - ext4 /dev/rbd0 rw,seclabel,stripe=1024,data=ordered

$ cat /proc/self/mountinfo | grep shared:233
303 40 0:56 / /var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/volumes/kubernetes.io~secret/default-token-zn95h rw,relatime shared:233 - tmpfs tmpfs rw,seclabel

可以看到Pod掛載了兩個卷,除了之前的RBD,還有就是一個存放Secret的卷。

  • 查看PodDocker容器中掛載目錄:

$ docker inspect $(docker ps | grep nginx_nginx-test | awk '{print $1}') | grep Mounts -A33
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/volumes/kubernetes.io~rbd/pvc-d6f6b6f8-446c-11e9-bbd8-6c92bf74be54",
                "Destination": "/data",
                "Mode": "Z",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/volumes/kubernetes.io~secret/default-token-zn95h",
                "Destination": "/var/run/secrets/kubernetes.io/serviceaccount",
                "Mode": "ro,Z",
                "RW": false,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/etc-hosts",
                "Destination": "/etc/hosts",
                "Mode": "Z",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/18a8fb7b-446d-11e9-bbd8-6c92bf74be54/containers/nginx/190cc168",
                "Destination": "/dev/termination-log",
                "Mode": "Z",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

可以看到Docker的這些卷最后都是通過Bind掛載的,而且Mount廣播使用的是rprivate屬性。

  • 看看Pod的容器內Mount情況:

$ docker exec -it $(docker ps | grep nginx_nginx-test | awk '{print $1}') df -h
Filesystem               Size  Used Avail Use% Mounted on
overlay                  123G  4.7G  118G   4% /
tmpfs                     64M     0   64M   0% /dev
tmpfs                    189G     0  189G   0% /sys/fs/cgroup
/dev/rbd0                9.8G   37M  9.7G   1% /data
/dev/mapper/centos-root  123G  4.7G  118G   4% /etc/hosts
shm                       64M     0   64M   0% /dev/shm
tmpfs                    189G   12K  189G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                    189G     0  189G   0% /proc/acpi
tmpfs                    189G     0  189G   0% /proc/scsi
tmpfs                    189G     0  189G   0% /sys/firmware

$ docker exec -it $(docker ps | grep nginx_nginx-test | awk '{print $1}') cat /proc/self/mountinfo | grep -e rbd -e serviceaccount
617 599 252:0 / /data rw,relatime - ext4 /dev/rbd0 rw,seclabel,stripe=1024,data=ordered
623 599 0:56 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,seclabel

可以看到Pod的容器內的確主要掛載了RBDSecret兩個目錄。

分析總結

  1. Docker中,無論使用哪種方式使用數據卷,實際上都是利用的Linux的的mount --bind綁定掛載功能實現。

  2. Kubernetes中使用RBD卷時,首先通過rbd map到宿主機并進行格式化,然后mount到宿主機目錄,最后把這個宿主機目錄mount --bind到容器的指定目錄中使用。

根據原理分析可以初步推斷:在宿主機中測試RBD讀寫性能和在DockerKubernetes中分別測試的性能沒有本質區別,DockerKubernetes本身不會對RBD性能造成影響(之后我又使用Fio對其進行完整的性能測試,和這個結論也是一致的)。

關于如何進行Docker和Kubernetes中使用Ceph RBD卷的原理分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通道| 昆山市| 屏东县| 凤庆县| 皮山县| 乌拉特中旗| 库伦旗| 富平县| 册亨县| 上饶县| 抚宁县| 光山县| 南宫市| 蓝山县| 屏东市| 沭阳县| 清原| 明溪县| 永福县| 育儿| 庄河市| 余干县| 石渠县| 元谋县| 嘉峪关市| 邢台县| 灵石县| 肇州县| 安丘市| 砚山县| 商水县| 宜黄县| 绥棱县| 肥乡县| 定日县| 南漳县| 兴和县| 临沧市| 峡江县| 贵德县| 吉林省|