Kubernetes - 将持久卷挂载为根目录
Kubernetes - Mounting Persistent Volume as root directory
我正在尝试创建一个新的 Kubernetes 部署,它将允许我在 Pod 重新启动或关闭时保留它的状态。就一些背景而言,Kubernetes 实例是一个托管的 Amazon EKS 集群,我正在尝试合并一个安装到 pod 的 Amazon EFS 支持的持久卷。
不幸的是,正如我现在所拥有的,PV 按需要安装到 /etc/
,但内容几乎是空的,除了一些在启动期间被修改的文件。
部署 yaml 如下所示:
kind: Deployment
apiVersion: apps/v1
spec:
replicas: 1
selector:
matchLabels:
app: testpod
template:
metadata:
creationTimestamp: null
labels:
app: testpod
spec:
volumes:
- name: efs
persistentVolumeClaim:
claimName: efs
containers:
- name: testpod
image: 'xxxxxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/testpod:latest'
args:
- /bin/init
ports:
- containerPort: 443
protocol: TCP
resources: {}
volumeMounts:
- name: efs
mountPath: /etc
subPath: etc
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
securityContext:
capabilities:
add:
- ALL
restartPolicy: Always
terminationGracePeriodSeconds: 60
dnsPolicy: ClusterFirst
securityContext: {}
schedulerName: default-scheduler
有什么可能出错的想法吗?我希望 /etc/ 填充图像的内容。
编辑:
这似乎在 Docker 中运行良好,方法是使用相同的映像,使用 docker volume create <name>
创建一个卷,然后将其安装为 -v <name>:/etc
。
我的猜测是容器中的挂载与操作系统中的挂载完全相同。如果你在 /etc
上挂载某些东西,你只需覆盖(更好的词 'cover')已经存在的东西之前..如果你挂载空 EFS 会有空文件夹
我尝试了您在 docker 中尝试的方法并且(令我感到惊讶)它按照您描述的方式工作..这可能是因为 docker 卷在技术上只是 kubernetes 卷声明之外的东西(尤其是由 EFS 支持)这解释了它:
tldr:如果 docker 卷为空文件将被镜像
我个人认为使用 k8s 和 EFS 无法实现您想要的目标
Kubernetes 没有 Docker 根据图像内容填充卷的功能。如果您创建一个新卷(无论是 emptyDir
卷还是基于 AWS EBS 或 EFS 等云存储的东西),它开始时都是空的,并隐藏容器中的所有内容。
因此,您不能在容器的大部分上安装卷;在您的应用程序的源树或 /etc
上安装卷将不起作用,如您所示。特别是对于 /etc
中的文件,更好的方法是使用 Kubernetes ConfigMap 来保存要添加到该目录的特定文件。 (将您的配置文件存储在源代码控制中,并将它们添加为部署序列的一部分;不要尝试将未跟踪的修改保存到已部署的文件中。)
我认为您可能对“nsfdsuds”感兴趣,潜在的是:它为 Kubernetes 容器建立了一个 overlayfs,其中 overlayfs 的可写顶层可以位于您选择的 PersistentVolume 上。
我正在尝试创建一个新的 Kubernetes 部署,它将允许我在 Pod 重新启动或关闭时保留它的状态。就一些背景而言,Kubernetes 实例是一个托管的 Amazon EKS 集群,我正在尝试合并一个安装到 pod 的 Amazon EFS 支持的持久卷。
不幸的是,正如我现在所拥有的,PV 按需要安装到 /etc/
,但内容几乎是空的,除了一些在启动期间被修改的文件。
部署 yaml 如下所示:
kind: Deployment
apiVersion: apps/v1
spec:
replicas: 1
selector:
matchLabels:
app: testpod
template:
metadata:
creationTimestamp: null
labels:
app: testpod
spec:
volumes:
- name: efs
persistentVolumeClaim:
claimName: efs
containers:
- name: testpod
image: 'xxxxxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/testpod:latest'
args:
- /bin/init
ports:
- containerPort: 443
protocol: TCP
resources: {}
volumeMounts:
- name: efs
mountPath: /etc
subPath: etc
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
securityContext:
capabilities:
add:
- ALL
restartPolicy: Always
terminationGracePeriodSeconds: 60
dnsPolicy: ClusterFirst
securityContext: {}
schedulerName: default-scheduler
有什么可能出错的想法吗?我希望 /etc/ 填充图像的内容。
编辑:
这似乎在 Docker 中运行良好,方法是使用相同的映像,使用 docker volume create <name>
创建一个卷,然后将其安装为 -v <name>:/etc
。
我的猜测是容器中的挂载与操作系统中的挂载完全相同。如果你在 /etc
上挂载某些东西,你只需覆盖(更好的词 'cover')已经存在的东西之前..如果你挂载空 EFS 会有空文件夹
我尝试了您在 docker 中尝试的方法并且(令我感到惊讶)它按照您描述的方式工作..这可能是因为 docker 卷在技术上只是 kubernetes 卷声明之外的东西(尤其是由 EFS 支持)这解释了它:
我个人认为使用 k8s 和 EFS 无法实现您想要的目标
Kubernetes 没有 Docker 根据图像内容填充卷的功能。如果您创建一个新卷(无论是 emptyDir
卷还是基于 AWS EBS 或 EFS 等云存储的东西),它开始时都是空的,并隐藏容器中的所有内容。
因此,您不能在容器的大部分上安装卷;在您的应用程序的源树或 /etc
上安装卷将不起作用,如您所示。特别是对于 /etc
中的文件,更好的方法是使用 Kubernetes ConfigMap 来保存要添加到该目录的特定文件。 (将您的配置文件存储在源代码控制中,并将它们添加为部署序列的一部分;不要尝试将未跟踪的修改保存到已部署的文件中。)
我认为您可能对“nsfdsuds”感兴趣,潜在的是:它为 Kubernetes 容器建立了一个 overlayfs,其中 overlayfs 的可写顶层可以位于您选择的 PersistentVolume 上。