3

按照本指南,我正在尝试在 GKE 的 pod 内运行 gcsfuse。下面是我正在使用的部署清单:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: gcsfuse-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: gcsfuse-test
    spec:
      containers:
        - name: gcsfuse-test
          image: gcr.io/project123/gcs-test-fuse:latest
          securityContext:
            privileged: true
            capabilities:
              add:
                - SYS_ADMIN
          lifecycle:
            postStart:
              exec:
                command: ["mkdir", "/mnt"]
                command: ["gcsfuse", "-o", "nonempty", "cloudsql-p8p", "/mnt"]
            preStop:
              exec:
                command: ["fusermount", "-u", "/mnt"]

但是,我想在我的 GKE 集群中不使用特权模式运行 gcsfuse。我认为(由于 SO 上的这些问题)可以使用某些标志运行 docker 映像,并且无需在特权模式下运行它。

GKE 中有什么方法可以在不以特权模式运行容器的情况下运行 gcsfuse 吗?

4

2 回答 2

3

特权模式意味着您已启用所有功能,请参阅https://stackoverflow.com/a/36441605。因此,在您的示例中添加 CAP_SYS_ADMIN 看起来是多余的。

您可以授予所有权限,也可以通过挂载 /dev/fuse 并仅授予 SYS_ADMIN 功能(这仍然是一个重要权限)来执行更细粒度的操作。

我认为我们可以将问题改写为:我们可以在没有 SYS_ADMIN 功能的情况下运行 GCSFuse 吗?

实际上它看起来不可行,你可以在这里找到相关的 docker 问题:https ://github.com/docker/for-linux/issues/321 。

对于大多数项目来说,这不会是一个硬性问题。您可能希望针对您的威胁模型采取行动,并确定它是否可能对您的生产构成安全风险。

于 2019-08-16T14:44:49.717 回答
2

现在终于可以在没有privileged: trueor的情况下挂载设备了CAP_SYS_ADMIN

你需要的是

  • 一个 Kubelet 设备管理器,它允许容器以安全的方式直接访问主机设备。设备管理器通过 Kubelet 设备 API 明确指定设备可用。我使用了这个隐藏的宝石:https ://gitlab.com/arm-research/smarter/smarter-device-manager 。

  • 定义设备管理器提供的设备列表- 添加/dev/YOUR_DEVICE_NAME到此列表中,请参见下面的示例。

  • 通过 pod 规范中的设备管理器请求设备resources.requests.smarter-devices/YOUR_DEVICE_NAME: 1

我花了相当长的时间来解决这个问题,所以我希望在这里分享信息能帮助其他人进行探索。

我在关于 /dev/fuse 的 Kubernetes Github 问题中写了我的详细发现。请参阅此评论中的示例设置以及该评论上方的更多技术细节。

于 2021-01-23T14:41:15.207 回答