如何将用户凭据传递到Kubernetes Pod内部的(用户限制的)已安装卷?

时间:2019-11-08 11:28:08

标签: kubernetes kubernetes-secrets

我正在尝试通过Kubernetes机密将用户凭据传递到Kubernetes Pod中已安装的受密码保护的目录。 NFS文件夹/mount/protected具有用户访问限制,即只有某些用户可以访问此文件夹。

这是我的Pod配置:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  volumes:
  - name: my-volume
    hostPath:
      path: /mount/protected
      type: Directory
    secret:
      secretName: my-secret
  containers:
  - name: my-container
    image: <...>
    command: ["/bin/sh"]
    args: ["-c", "python /my-volume/test.py"]
    volumeMounts:
    - name: my-volume
      mountPath: /my-volume

应用它时,出现以下错误:

The Pod "my-pod" is invalid:
* spec.volumes[0].secret: Forbidden: may not specify more than 1 volume type
* spec.containers[0].volumeMounts[0].name: Not found: "my-volume"

我根据以下指南创建了我的秘密:
https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#create-a-secret
所以基本上:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
data:
  username: bXktYXBw
  password: PHJlZGFjdGVkPg==

但是当我使用以下方式挂载文件夹/mount/protected时:

spec:
  volumes:
  - name: my-volume
    hostPath:
      path: /mount/protected
      type: Directory

运行安装此卷路径的Pod时,出现权限拒绝错误python: can't open file '/my-volume/test.py': [Errno 13] Permission denied

我的问题是如何告诉Pod它应该使用特定的用户凭据来访问此已装载的文件夹?

2 个答案:

答案 0 :(得分:2)

您正试图告诉Kubernetes,my-volume应该从两者获取主机路径和密钥,并且只能包含其中之一。

您不需要手动指定主机路径。 Kubernetes将找出适合放置Secret内容的地方,并且在您在容器内指定的mountPath上仍然可见。 (完全指定hostPath:通常是错误的,除非您可以保证路径与期望的内容一起存在于集群中的每个节点上。)

所以改变:

volumes:
- name: my-volume
  secret:
    secretName: my-secret
  # but no hostPath

答案 1 :(得分:0)

我最终想出了如何使用用于Kubernetes(https://github.com/fstab/cifs)的CIFS Flexvolume插件将用户凭据传递到Pod中的挂载目录。 使用此插件,每个用户都可以将其凭据传递到Pod。 用户只需要创建一个Kubernetes机密(cifs-secret),存储用户名/密码并将此机密用于Pod中的挂载即可。 然后按如下方式安装该卷:

  (...)
  volumes:
  - name: test
    flexVolume:
      driver: "fstab/cifs"
      fsType: "cifs"
      secretRef:
        name: "cifs-secret"
      options:
        networkPath: "//server/share"
        mountOptions: "dir_mode=0755,file_mode=0644,noperm"