使用 root 用户挂载 kubernetes pod 时权限被拒绝

Dol*_*hin 2 kubernetes

当我在 kubernetes v1.18 jenkins 的 master pod 中使用此命令挂载 nfs 文件系统时:

root@jenkins-67fff76bb6-q77xf:/# mount -t nfs -o v4 192.168.31.2:/infrastructure/jenkins-share-workspaces /opt/jenkins
mount: permission denied
root@jenkins-67fff76bb6-q77xf:/# 
Run Code Online (Sandbox Code Playgroud)

为什么我使用 root 用户时显示权限被拒绝?当我在另一台机器(不在docker中)中使用此命令时,它工作正常,显示服务器端工作正常。这是我在 yaml 中的 kubernetes jenkins master pod 安全文本配置:

securityContext:
        runAsUser: 0
        fsGroup: 0
Run Code Online (Sandbox Code Playgroud)

今天我尝试了另一个 kubernetes pod 并挂载 nfs 文件系统并抛出相同的错误。看来从主机挂载 NFS 工作正常,而从 kubernetes pod 挂载则存在渗透问题。为什么会出现这种情况呢?NFS 在这个 kubernetes pod 中通过 PVC 绑定 PV 工作正常,为什么它从 docker 挂载失败?我很困惑。

Mat*_*att 7

将 nfs 卷挂载到 pod 有两种方法

首先(直接在 pod 规范中):

kind: Pod
apiVersion: v1
metadata:
  name: pod-using-nfs
spec:
  volumes:
    - name: nfs-volume
      nfs: 
        server: 192.168.31.2
        path: /infrastructure/jenkins-share-workspaces
  containers:
    - name: app
      image: example
      volumeMounts:
        - name: nfs-volume
          mountPath: /var/nfs
Run Code Online (Sandbox Code Playgroud)

第二(创建持久化 nfs 卷和卷声明):

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  capacity:
    storage: 1Mi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.31.2
    path: "/infrastructure/jenkins-share-workspaces"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 1Mi
  volumeName: nfs

---
kind: Pod
apiVersion: v1
metadata:
  name: pod-using-nfs
spec:
  containers:
    - name: app
      image: example
      volumeMounts:
        - name: nfs
          mountPath: /opt/jenkins
  volumes:
    - name: nfs
      persistentVolumeClaim:
        claimName: nfs
Run Code Online (Sandbox Code Playgroud)

编辑:

上面的解决方案是首选解决方案,但如果您确实需要在容器中使用挂载,则需要向 pod 添加功能:

spec:
  containers:
  - securityContext:
      capabilities:
        add: ["SYS_ADMIN"]
Run Code Online (Sandbox Code Playgroud)