只让kubernetes部署的一个pod进行下载,并且只进行读取



我有一个docker容器,它首先下载文件,然后使用它们,我想让我的应用程序可扩展,所以我使用了kubernetes depyments,并创建了一个持久卷,这样部署的所有pod都有一个共享存储。我不想让每个pod都下载文件,我只想让第一个运行的pod下载,其他pod只读取id我的docker容器start.sh文件包含这两个命令:

python download.py
gunicorn my_application.wsgi:application --bind 0.0.0.0:8000

我的部署的配置文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 3
selector:
matchLabels:
component: api
template:
metadata:
labels:
component: api
spec:
volumes:
- name: api-storage
persistentVolumeClaim:
claimName: storage-persistent-volume-claim
containers:
- name: dispatch-model
image: dockeris/my-app-image:latest
ports:
- containerPort: 8000
volumeMounts:
- name: api-storage
mountPath: /dispatch_server/Assets/Data
subPath: data_storage
imagePullSecrets:
- name: regcred 

关于如何解决这个问题,有什么建议吗

最简单的方法就是将此文件构建到Docker映像中。

# At image-build time
RUN ./download.py
# Don't need to separately download at container startup time
CMD gunicorn my_application.wsgi:application --bind 0.0.0.0:8000

这不需要PersistentVolumeClaim、共享存储或任何其他特殊的东西。只要有文件的更新副本,就需要触发CI系统,但这应该是相当常规的。与部署管理的任何其他内容一样,可以运行使用两个不同版本文件的Pod,也可以回滚到使用旧版本文件的设置。

但是,如果文件是多个千兆字节,并且将其构建为图像真的没有意义,该怎么办?有一堆问题你需要思考:

  • 在稳定状态下(系统已成功运行数月(,文件何时以及如何更新
  • 如果多个进程试图同时进行更新,会发生什么情况
  • 从机制上讲,只要浏览一下Kubernetes卷类型的列表,您是否可以访问支持ReadWriteMany访问的内容

在一条评论中,@Eugene建议找一份工作,这可能是一个合理的方法。作业将只有一个副本在运行,这有助于解决并发问题,您可以随时删除和重新创建它。如果这有利于您的特定设置,作业可以运行与主服务相同的映像,并且您可以覆盖它运行的命令。

apiVersion: batch/v1
kind: Job
metadata:
name: downloader
spec:
template:
spec:
volumes: [ ... ]
containers:
- name: downloader
image: registry.example.com/my-application:20220103
args: # overrides Dockerfile CMD, one word to a list item
- /app/downloader.py
volumeMounts: [ ... ]

最新更新