如何将用户凭据传递到 Kubernetes Pod 内的(用户限制的)安装卷?
How to pass user credentials to (user-restricted) mounted volume inside Kubernetes Pod?
我正在尝试通过 Kubernetes secret 将用户凭据传递到 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 它应该使用特定的用户凭据来访问这个安装的文件夹?
你试图告诉 Kubernetes my-volume
应该从 主机路径和 Secret 中获取它的内容,它只能有其中之一。
您不需要手动指定主机路径。 Kubernetes 会找到合适的地方来放置 Secret 内容,并且它仍然会在您在容器中指定的 mountPath
上可见。 (完全指定 hostPath:
通常是错误的,除非您可以保证该路径将在集群中的每个 节点上存在您期望的内容。)
所以改变:
volumes:
- name: my-volume
secret:
secretName: my-secret
# but no hostPath
我最终想出了如何使用 CIFS Flexvolume Plugin for Kubernetes (https://github.com/fstab/cifs) 将用户凭据传递到 Pod 中的挂载目录。
使用此插件,每个用户都可以将 her/his 凭据传递给 Pod。
用户只需创建一个 Kubernetes secret (cifs-secret
),存储 username/password 并将此 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"
我正在尝试通过 Kubernetes secret 将用户凭据传递到 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 它应该使用特定的用户凭据来访问这个安装的文件夹?
你试图告诉 Kubernetes my-volume
应该从 主机路径和 Secret 中获取它的内容,它只能有其中之一。
您不需要手动指定主机路径。 Kubernetes 会找到合适的地方来放置 Secret 内容,并且它仍然会在您在容器中指定的 mountPath
上可见。 (完全指定 hostPath:
通常是错误的,除非您可以保证该路径将在集群中的每个 节点上存在您期望的内容。)
所以改变:
volumes:
- name: my-volume
secret:
secretName: my-secret
# but no hostPath
我最终想出了如何使用 CIFS Flexvolume Plugin for Kubernetes (https://github.com/fstab/cifs) 将用户凭据传递到 Pod 中的挂载目录。
使用此插件,每个用户都可以将 her/his 凭据传递给 Pod。
用户只需创建一个 Kubernetes secret (cifs-secret
),存储 username/password 并将此 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"