有没有办法在 pod 中的容器之间共享现有数据?
Is there a way to share existing data between containers in a pod?
我在一个 pod 中有 2 个容器。
1.网络应用
2. Nginx
我想与 nginx 容器共享来自 Webapp 容器 /var/www/webapp/ 的数据。 /var/www/html
/var/www/webapp ( folder structure )
│ index.php
│
│
└───folder1
│ │ service1.php
│ │
│ └───subfolder1
│ │ app.php
│
└───folder2
│ service2.php
文件夹已正确挂载,但所有文件都丢失了。
apiVersion: apps/v1
kind: Deployment
spec:
volumes:
- name: webapp-data
persistentVolumeClaim:
claimName: webapp-data
containers:
- name: webapp
image: webapp
imagePullPolicy: Always
volumeMounts:
- name: webapp-data
mountPath: /var/www/webapp/
- name: nginx
imagePullPolicy: Always
image: nginx
volumeMounts:
- name: webapp-data
mountPath: /var/www/html/
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webapp-data
spec:
storageClassName: local
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
在 docker 下安装卷时,容器内的所有文件夹和文件都可用,但在 k8s 中不可用。
可能只是一个错误,但您指的是其中一个容器中名称为 blinger-main
的卷。使用这个:
apiVersion: apps/v1
kind: Deployment
spec:
volumes:
- name: webapp-data
persistentVolumeClaim:
claimName: webapp-data
containers:
- name: webapp
image: webapp
imagePullPolicy: Always
volumeMounts:
- name: webapp-data
mountPath: /var/www/webapp/
- name: nginx
imagePullPolicy: Always
image: nginx
volumeMounts:
- name: webapp-data
mountPath: /var/www/html/
Kubernetes 不会自动使用图像中的内容填充空卷。 (这与 docker run
不同。)您的应用程序需要弄清楚如何设置 shared-data 目录本身,如果它是空的。
对于标准数据库容器,这并不重要,因为它们通常以某种 initdb
类型调用开始,这将创建所需的文件结构。同样,如果您使用持久卷作为缓存或上传 space,也没关系。
对于您描述的用例,您希望一个容器只拥有另一个容器的文件副本,您实际上并不需要持久卷。我会使用 emptyDir volume that can be shared between the two containers, and then an init container 将数据复制到卷中。不要在应用程序内容上安装任何东西。
这大致看起来像(实际上使用 Deployment):
apiVersion: v1
kind: Pod
metadata:
name: ...
spec:
volumes:
- name: webapp-data
emptyDir: {}
initContainers:
- name: populate
image: webapp
volumeMounts:
- name: webapp-data
mountPath: /data
command: [cp, -a, /var/www/webapp, /data]
containers:
- name: webapp
image: webapp
# no volumeMounts; default command
- name: nginx
image: nginx
volumeMounts:
- name: webapp-data
mountPath: /var/www/html
使用此设置,两个容器 运行 在同一个 pod 中也不是硬性要求;您可以有一个 运行 是 back-end 服务的部署,以及 运行 是 nginx 的第二个部署(通过从 back-end 图像复制数据启动)。
(Kubernetes 文档中 Configure Pod Initialization 中的示例非常相似,但从外部站点获取 nginx 内容。)
我在一个 pod 中有 2 个容器。 1.网络应用 2. Nginx 我想与 nginx 容器共享来自 Webapp 容器 /var/www/webapp/ 的数据。 /var/www/html
/var/www/webapp ( folder structure )
│ index.php
│
│
└───folder1
│ │ service1.php
│ │
│ └───subfolder1
│ │ app.php
│
└───folder2
│ service2.php
文件夹已正确挂载,但所有文件都丢失了。
apiVersion: apps/v1
kind: Deployment
spec:
volumes:
- name: webapp-data
persistentVolumeClaim:
claimName: webapp-data
containers:
- name: webapp
image: webapp
imagePullPolicy: Always
volumeMounts:
- name: webapp-data
mountPath: /var/www/webapp/
- name: nginx
imagePullPolicy: Always
image: nginx
volumeMounts:
- name: webapp-data
mountPath: /var/www/html/
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webapp-data
spec:
storageClassName: local
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
在 docker 下安装卷时,容器内的所有文件夹和文件都可用,但在 k8s 中不可用。
可能只是一个错误,但您指的是其中一个容器中名称为 blinger-main
的卷。使用这个:
apiVersion: apps/v1
kind: Deployment
spec:
volumes:
- name: webapp-data
persistentVolumeClaim:
claimName: webapp-data
containers:
- name: webapp
image: webapp
imagePullPolicy: Always
volumeMounts:
- name: webapp-data
mountPath: /var/www/webapp/
- name: nginx
imagePullPolicy: Always
image: nginx
volumeMounts:
- name: webapp-data
mountPath: /var/www/html/
Kubernetes 不会自动使用图像中的内容填充空卷。 (这与 docker run
不同。)您的应用程序需要弄清楚如何设置 shared-data 目录本身,如果它是空的。
对于标准数据库容器,这并不重要,因为它们通常以某种 initdb
类型调用开始,这将创建所需的文件结构。同样,如果您使用持久卷作为缓存或上传 space,也没关系。
对于您描述的用例,您希望一个容器只拥有另一个容器的文件副本,您实际上并不需要持久卷。我会使用 emptyDir volume that can be shared between the two containers, and then an init container 将数据复制到卷中。不要在应用程序内容上安装任何东西。
这大致看起来像(实际上使用 Deployment):
apiVersion: v1
kind: Pod
metadata:
name: ...
spec:
volumes:
- name: webapp-data
emptyDir: {}
initContainers:
- name: populate
image: webapp
volumeMounts:
- name: webapp-data
mountPath: /data
command: [cp, -a, /var/www/webapp, /data]
containers:
- name: webapp
image: webapp
# no volumeMounts; default command
- name: nginx
image: nginx
volumeMounts:
- name: webapp-data
mountPath: /var/www/html
使用此设置,两个容器 运行 在同一个 pod 中也不是硬性要求;您可以有一个 运行 是 back-end 服务的部署,以及 运行 是 nginx 的第二个部署(通过从 back-end 图像复制数据启动)。
(Kubernetes 文档中 Configure Pod Initialization 中的示例非常相似,但从外部站点获取 nginx 内容。)