因此,在对问题进行更长时间的考虑之后,我意识到我需要将所有内容保留在/opt/payara/appserver/glassfish/domains 下,以便保留通过管理 UI 进行的所有配置。但是,如果我只是使用指向该路径的 volumeMount 启动 pod,即
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: myapp
spec:
volumes:
- name: myapp-vol
persistentVolumeClaim:
claimName: myapp-rwo-pvc
containers:
- name: myapp
image: payara/server-full
imagePullPolicy: "Always"
ports:
- name: myapp-default
containerPort: 8080
- name: myapp-admin
containerPort: 4848
volumeMounts:
- mountPath: "/opt/payara/appserver/glassfish/domains"
和
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-rwo-pvc
labels:
app: dont-delete-autom
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
那么 Payara 服务器将无法成功启动,因为 Kubernetes 会将一个空的持久卷挂载到该位置。然而,Payara 需要配置文件,这些文件最初位于 /opt/payara/appserver/glassfish/domains 中。
我需要做的是为该卷提供默认位于该文件夹中的数据。但是,当访问 PV 的唯一方法是将其安装到 pod 中时,该怎么做呢?
首先,我将上述部署缩放为 0:
kubectl scale --replicas=0 deployment/myapp
这将删除所有访问持久卷的 pod。
然后我创建了一个“配置”pod,它将之前创建的持久卷挂载到 /tmp 中。
apiVersion: v1
kind: Pod
metadata:
labels:
app: myapp
name: pv-provisioner
namespace: default
spec:
containers:
- image: payara/server-full
imagePullPolicy: Always
name: pv-provisioner
ports:
- containerPort: 8080
name: myapp-default
protocol: TCP
- containerPort: 4848
name: myapp-admin
protocol: TCP
volumeMounts:
- mountPath: "/tmp"
name: myapp-vol
resources:
limits:
cpu: "2"
memory: 2Gi
requests:
cpu: 500m
memory: 128Mi
volumes:
- name: myapp-vol
persistentVolumeClaim:
claimName: myapp-rwo-pvc
然后我使用以下命令首先将必要的数据从“配置”pod 复制到本地文件夹 /tmp,然后从 /tmp 复制回持久卷(之前安装到 pv-provisioner:/tmp)。没有直接从 pod:/a 复制到 pod:/b 的选项
kubectl cp pv-provisioner:/opt/payara/appserver/glassfish/domains/. tmp
kubectl cp tmp/. pv-provisioner:/tmp
因此,原始 payara 容器中 /opt/payara/appserver/glassfish/domains/ 下存储的所有内容现在都被复制到由持久卷声明“myapp-rwo-pvc”标识的持久卷中。
为了完成它,我删除了配置 pod 并扩展了部署:
kubectl delete pod pv-provisioner
kubectl scale --replicas=3 deployment/myapp
payara 服务器现在已成功启动,并且通过管理 UI 进行的任何配置(包括 .war 部署)都会保留下来,这样 payara pod 就可以随时被终止,重启后一切都和以前一样。
谢谢阅读。