成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

非特權(quán) Pod 如何運(yùn)行用戶態(tài)文件系統(tǒng)

開發(fā) 前端
本文主要講解了非特權(quán) Pod 如何運(yùn)行用戶態(tài)文件系統(tǒng),主要需要給與掛載所需權(quán)限即 CAP_SYS_ADMIN? 并將宿主機(jī)的塊設(shè)備 /dev/fuse 掛載進(jìn) Pod 中,其中掛載塊設(shè)備需要做一些開發(fā)工作,實(shí)現(xiàn)一個(gè) Device Plugin。然后就可以愉快地在非特權(quán) Pod 中運(yùn)行 FUSE daemon 了。

FUSE(filesystem in userspace)是指用戶態(tài)的文件系統(tǒng)。通過 FUSE 內(nèi)核模塊的支持,開發(fā)者只需要根據(jù) FUSE 提供的接口實(shí)現(xiàn)具體的文件操作就可以實(shí)現(xiàn)一個(gè)文件系統(tǒng),F(xiàn)USE 包含一個(gè)內(nèi)核模塊和一個(gè)用戶空間守護(hù)進(jìn)程(FUSE daemon)。內(nèi)核模塊加載時(shí)被注冊(cè)成 Linux 虛擬文件系統(tǒng)的一個(gè) FUSE 文件系統(tǒng)驅(qū)動(dòng),此外還注冊(cè)了一個(gè) /dev/fuse 的塊設(shè)備。FUSE daemon 通過 /dev/fuse 讀取請(qǐng)求,并將結(jié)果寫入 /dev/fuse,這個(gè) FUSE 設(shè)備就充當(dāng)了 FUSE daemon 與內(nèi)核通信的橋梁。

在 Kubernetes 環(huán)境中,如果需要在 Pod 中運(yùn)行 FUSE daemon,通常是將其設(shè)置為特權(quán)容器。當(dāng) Pod 為特權(quán)時(shí),自然所有的權(quán)限都會(huì)有,甚至也直接享用宿主機(jī)的設(shè)備。但非特權(quán) Pod 想要運(yùn)行用戶態(tài)的文件系統(tǒng)有點(diǎn)困難,主要需要兩點(diǎn):

  1. 掛載權(quán)限;
  2. 對(duì) /dev/fuse 設(shè)備的讀寫權(quán)限;

本篇文章主要講解在沒有特權(quán)的情況下,如何在 Pod 中運(yùn)行用戶態(tài)文件系統(tǒng)。

掛載權(quán)限

首先,mount 屬于管理級(jí)別的系統(tǒng)調(diào)用,需要 CAP_SYS_ADMIN 權(quán)限,參考 capability 文檔:

CAP_SYS_ADMIN
              Note: this capability is overloaded; see Notes to kernel
              developers, below.

              * Perform a range of system administration operations
                including: quotactl(2), mount(2), umount(2),
                pivot_root(2), swapon(2), swapoff(2), sethostname(2),
                and setdomainname(2);

CAP_SYS_ADMIN 可以在 Pod 的 .securityContext.capabilities 中設(shè)置,如下:

securityContext:
      capabilities:
        add:
          - SYS_ADMIN

其次,有的系統(tǒng)開啟了 Linux 內(nèi)核安全模塊 AppArmor,默認(rèn)的 AppArmor 配置也是沒有 mount 權(quán)限的,需要額外配置 mount 權(quán)限,如下:

#include <tunables/global>

profile app flags=(attach_disconnected,mediate_deleted) {
  #include <abstractions/base>

  mount,
  umount,
  capability sys_admin, 
  ...
}

在每臺(tái)節(jié)點(diǎn)上配置好之后,在 pod 中加入 container.apparmor.security.beta.kubernetes.io/app: localhost/app 的注解,以聲明使用這份 AppArmor 配置,詳細(xì)信息可以參考《如何使用 AppArmor 限制應(yīng)用的權(quán)限》。

FUSE 設(shè)備

一個(gè)用戶態(tài)的文件系統(tǒng)包含一個(gè)內(nèi)核模塊和一個(gè)用戶空間 daemon 進(jìn)程。內(nèi)核模塊加載時(shí)被注冊(cè)成 Linux 虛擬文件系統(tǒng)的一個(gè) fuse 文件系統(tǒng)驅(qū)動(dòng)。此外,還注冊(cè)了一個(gè) /dev/fuse 的塊設(shè)備。該塊設(shè)備作為 fuse daemon 進(jìn)程與內(nèi)核通信的橋梁。而對(duì)于用戶空間的 fuse daemon 來說,訪問 /dev/fuse 設(shè)備是至關(guān)重要的。

在 Kubernetes 環(huán)境中,如果要將宿主機(jī)的某個(gè)塊設(shè)備掛載進(jìn) pod 中,可以使用 Device Plugins。而 Device Plugins 需要第三方服務(wù)自己提供,實(shí)現(xiàn)起來也比較簡(jiǎn)單。

對(duì)于 FUSE 設(shè)備的 Device Plugins 來說,社區(qū)也有很多實(shí)現(xiàn),不過都大同小異,只需要在 Device Plugins 接口 Allocate 中將宿主機(jī)的 /dev/fuse 目錄掛載進(jìn)容器的 /dev/fuse 并給與 rwm 權(quán)限即可。比如:

func (m *FuseDevicePlugin) Allocate(ctx context.Context, reqs *pluginapi.AllocateRequest) (*pluginapi.AllocateResponse, error) {
 devs := m.devs
 var responses pluginapi.AllocateResponse

 for _, req := range reqs.ContainerRequests {
  for _, id := range req.DevicesIDs {
   log.Printf("Allocate device: %s", id)
   if !deviceExists(devs, id) {
    return nil, fmt.Errorf("invalid allocation request: unknown device: %s", id)
   }
  }
  response := new(pluginapi.ContainerAllocateResponse)
  response.Devices = []*pluginapi.DeviceSpec{
   {
    ContainerPath: "/dev/fuse",
    HostPath:      "/dev/fuse",
    Permissions:   "rwm",
   },
  }

  responses.ContainerResponses = append(responses.ContainerResponses, response)
 }

 return &responses, nil
}

上述 Device Plugins 的完整代碼實(shí)現(xiàn)詳見zwwhdls/node-device-plugin。

在 Pod 中使用只需要在 resources 中申明即可,比如:

apiVersion: v1
kind: Pod
metadata:
  name: fuse
spec:
  containers:
    - name: test
      image: centos
      command: [ "sleep",  "infinity" ]
      resources:
        limits:
          hdls.me/fuse: "1"
        requests:
          hdls.me/fuse: "1"

總結(jié)

本文主要講解了非特權(quán) Pod 如何運(yùn)行用戶態(tài)文件系統(tǒng),主要需要給與掛載所需權(quán)限即 CAP_SYS_ADMIN 并將宿主機(jī)的塊設(shè)備 /dev/fuse 掛載進(jìn) Pod 中,其中掛載塊設(shè)備需要做一些開發(fā)工作,實(shí)現(xiàn)一個(gè) Device Plugin。然后就可以愉快地在非特權(quán) Pod 中運(yùn)行 FUSE daemon 了。

責(zé)任編輯:武曉燕 來源: CS實(shí)驗(yàn)室
相關(guān)推薦

2021-07-21 20:24:29

Linux內(nèi)核漏洞權(quán)限

2022-03-25 12:31:49

Linux根文件內(nèi)核

2017-12-04 13:30:12

Linux文件系統(tǒng)鏈接

2020-07-22 14:53:06

Linux系統(tǒng)虛擬文件

2010-06-04 19:12:38

Hadoop文件系統(tǒng)

2019-01-29 10:43:59

Linux 系統(tǒng) 數(shù)據(jù)

2011-12-26 15:51:36

用戶訪問訪問管理

2020-11-19 08:44:35

Linux

2011-01-13 14:10:30

Linux文件系統(tǒng)

2016-12-21 15:17:20

2019-09-20 10:04:45

Linux系統(tǒng)虛擬文件

2018-08-24 10:10:25

Linux文件系統(tǒng)技術(shù)

2021-05-31 07:50:59

Linux文件系統(tǒng)

2013-05-27 14:46:06

文件系統(tǒng)分布式文件系統(tǒng)

2021-06-06 16:55:22

Linux文件系統(tǒng)

2021-04-12 05:44:44

Linux文件系統(tǒng)

2012-09-12 14:40:19

Lustre文件系統(tǒng)

2021-05-31 06:10:14

Btrfs文件系統(tǒng)Linux

2015-08-03 11:19:55

彈性文件系統(tǒng)AWS存儲(chǔ)

2022-02-24 09:39:22

Linux命令文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 福利av在线| 国产精品免费看 | 亚洲 欧美 日韩 在线 | 毛片视频观看 | 日韩精品极品视频在线观看免费 | 九九精品在线 | 少妇久久久久 | 国产91精品网站 | 久久高清亚洲 | 日韩电影一区二区三区 | 91国语清晰打电话对白 | 欧美无乱码久久久免费午夜一区 | 亚洲一区二区精品视频 | 这里只有精品999 | 华人黄网站大全 | 国产一区二区三区高清 | 亚洲国产精品一区二区三区 | 久久精品91久久久久久再现 | 成年人在线视频 | 一区二区三区四区毛片 | 亚洲精品一区二区冲田杏梨 | aaaa一级毛片 | 一区二区三区小视频 | 精品国产乱码久久久久久果冻传媒 | 国产98色在线 | 日韩 | 国产欧美性成人精品午夜 | 91麻豆精品国产91久久久久久久久 | 爱草在线| 欧洲一区二区视频 | 成人欧美一区二区三区色青冈 | 欧美激情五月 | 久久男人 | 午夜精品久久久久久久99黑人 | 韩日一区| 欧美日韩精品影院 | 国产在线拍偷自揄拍视频 | 久久久精品一区二区三区 | 九九热精品在线视频 | 日本网站免费观看 | 99tv成人影院| 综合色站导航 |