我是 Kubernetes 新手,我尝试从持久卷运行 Laravel 应用程序。我让它工作了,我现在可以从持久卷运行代码,并且我可以扩展它。
我在自己的 Pod 中运行 nginx,并共享相同的持久卷。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
tier: backend
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
tier: backend
template:
metadata:
labels:
app: nginx
tier: backend
spec:
volumes:
- name: laravel-pv-volume
persistentVolumeClaim:
claimName: laravel-pv-claim
- name: config
configMap:
name: nginx-config
items:
- key: config
path: site.conf
containers:
- name: nginx
image: nginx
volumeMounts:
- name: laravel-pv-volume
mountPath: /code
- name: config
mountPath: /etc/nginx/conf.d
ports:
- containerPort: 80
name: http
protocol: TCP
我的 Laravel 部署包括 initContainers,它具有将 Laravel 源代码从/var/www 复制到/code (持久卷路径)的命令
apiVersion: apps/v1
kind: Deployment
metadata:
name: php
labels:
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: php
tier: backend
template:
metadata:
labels:
app: php
tier: backend
spec:
volumes:
- name: laravel-pv-volume
persistentVolumeClaim:
claimName: laravel-pv-claim
containers:
- name: php
image: registry.digitalocean.com/xxx/laravel-test:3.0
volumeMounts:
- name: laravel-pv-volume
mountPath: /code
initContainers:
- name: install
imagePullPolicy: Always
image: registry.digitalocean.com/xxx/laravel-test:3.0
command: ["/bin/sh", "-c", "cp -R /var/www/. /code && chown -R www-data:www-data /code"]
volumeMounts:
- name: laravel-pv-volume
mountPath: /code
在 Laravel 图像更改和代码更新后,如何使用新代码创建新 pod,不知何故,我认为在此之后我应该为安装创建新的持久卷路径,该路径将为新 pod 运行代码,并且何时旧的 pod 将被终止,最后一个 pod 将从持久卷中删除“旧”代码。但我也不知道现在哪个 Pod 会是最后一个?
我的解决方法可能是,如果我的 Laravel 镜像更新到下一个版本,我将添加命令来清除/code 文件夹,但这不是最佳实践,并且会导致停机。
命令:["/bin/sh", "-c", "rm -rf/code/*"&& "cp -R/var/www/./code && chown -R www-data :www-data/code"]
最佳答案
我了解这些做法的来源。但你应该在 Kubernetes 上采取不同的做法。
Docker 镜像中的代码
当你更新你的 PHP 代码时,不要把它放在 PersistentVolume 上,而是构建一个新的 Docker 镜像,例如: docker build -t <myapp>:<new version> .
当您将镜像推送到注册表后,您可以更新 image:
Deployment
中的字段。避免将代码放在持久卷上,并且很可能您不需要在 Deployment
中声明持久卷。完全没有。
您很可能想要 COPY
命令 Dockerfile
将您的代码放入容器中,例如(不知道您的路径):
COPY code/ opt/app/myapp
关于php - Kubernetes:如何在持久卷中使用 php (Laravel) 应用程序并在拉取新镜像时更新代码更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65378012/