我无法保存 kubernetes 卷中的数据
i can't presist data in kubernetes volumes
我有一个应用程序可以记录实时流量并重播它们。
https://github.com/buger/goreplay
这是一个简单易用的应用程序,但是当我尝试将它与 kubernetes 一起使用时,我遇到了卷中持久数据的问题。
我想这样做:
- 在第一个 pod 中,我使用了 goreplay 容器和其他只有一个简单 python 服务器的容器...工作是 goreplay 将监听来自外部到服务器的请求并保存它们到一个文件,这是部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: goreplay-deployment
labels:
app: goreplay-app
spec:
replicas: 1
selector:
matchLabels:
app: goreplay-app
template:
metadata:
labels:
app: goreplay-app
spec:
containers:
- name: goreplay
image: feiznouri/goreplay:2.0
args:
- "--input-raw"
- ":3000"
- "--output-file=requests_docker.gor"
volumeMounts:
- name: data
mountPath: /var/lib/goreplay
- name: myserver
image: feiznouri/python-server:1.1
args:
- "3000"
ports:
- name: server-port
containerPort: 3000
volumes:
- name: data
persistentVolumeClaim:
claimName: goreplay-claim
通常这会创建文件。
问题是当我删除部署并创建一个它的工作是读取文件并将保存请求转发到服务器时,它找不到文件,显然我使用的卷有误,这是假设查找和读取文件的第二个部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: goreplay-deployment
labels:
app: goreplay-app
spec:
replicas: 1
selector:
matchLabels:
app: goreplay-app
template:
metadata:
labels:
app: goreplay-app
spec:
containers:
- name: goreplay
image: feiznouri/goreplay:2.0
args:
- "--input-file"
- "requests_docker_0.gor"
- "--output-http=http://localhost:3000"
volumeMounts:
- name: data
mountPath: /var/lib/goreplay
- name: myserver
image: feiznouri/python-server:1.1
args:
- "3000"
ports:
- name: server-port
containerPort: 3000
volumes:
- name: data
persistentVolumeClaim:
claimName: goreplay-claim
PS:这是持久卷的 yaml 文件:
apiVersion: v1
kind: PersistentVolume
metadata:
name: goreplay-volume
labels:
type: local
spec:
storageClassName: custum
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/mnt/data"
这是用于存储的文件 class :
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: custom
provisioner: k8s.io/minikube-hostpath
reclaimPolicy: Retain
volumeBindingMode: Immediate
这是持久卷声明:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: goreplay-claim
spec:
storageClassName: custum
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Mi
我怎样才能完成这项工作并找到并使用我在第二个 pod 中创建的第一个文件!
提前致谢。
我复制了它,看起来卷很好。
不好的是如何将文件路径传递给 goreplay。
这是我所做的:
kubectl exec -it goreplay-deployment-899c49f95-7qdh4 -c goreplay sh
/home/goreplay # ps auxwf
PID USER TIME COMMAND
1 root 0:00 ./gor --input-raw :3000 --output-file=requests_docker.gor
36 root 0:00 sh
42 root 0:00 ps auxwf
/home/goreplay # ls /proc/1/cwd -l
lrwxrwxrwx 1 root root 0 Feb 19 09:44 /proc/1/cwd -> /home/goreplay
让我解释一下您在这里看到的内容。我执行到 goreplay 容器并检查了 goreplay 进程的 PID (PID=1)。接下来,我通过检查 /proc/1/cwd
符号链接来检查这个进程的当前工作目录是什么。如您所见,它已链接到 /home/goreplay
.
它告诉我们什么?
它告诉我们 --output-file=requests_docker.gor
正在使 goreplay 将文件保存在 /home/goreplay/requests_docker.gor
中(因为您指定的是相对于进程当前工作目录的路径,而不是使用指向卷的绝对路径)。它应该设置为:
--output-file=/var/lib/gorepath/requests_docker.gor
因为它是安装卷的目录。
同样适用于第二次部署。您应该指定:
--input-file=/var/lib/goreplay/requests_docker_0.gor`
以便它从卷中读取而不是从 pod 的主目录 (/home/goreplay
) 中读取。
更改它,它应该可以工作。
我有一个应用程序可以记录实时流量并重播它们。
https://github.com/buger/goreplay
这是一个简单易用的应用程序,但是当我尝试将它与 kubernetes 一起使用时,我遇到了卷中持久数据的问题。
我想这样做:
- 在第一个 pod 中,我使用了 goreplay 容器和其他只有一个简单 python 服务器的容器...工作是 goreplay 将监听来自外部到服务器的请求并保存它们到一个文件,这是部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: goreplay-deployment
labels:
app: goreplay-app
spec:
replicas: 1
selector:
matchLabels:
app: goreplay-app
template:
metadata:
labels:
app: goreplay-app
spec:
containers:
- name: goreplay
image: feiznouri/goreplay:2.0
args:
- "--input-raw"
- ":3000"
- "--output-file=requests_docker.gor"
volumeMounts:
- name: data
mountPath: /var/lib/goreplay
- name: myserver
image: feiznouri/python-server:1.1
args:
- "3000"
ports:
- name: server-port
containerPort: 3000
volumes:
- name: data
persistentVolumeClaim:
claimName: goreplay-claim
通常这会创建文件。
问题是当我删除部署并创建一个它的工作是读取文件并将保存请求转发到服务器时,它找不到文件,显然我使用的卷有误,这是假设查找和读取文件的第二个部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: goreplay-deployment
labels:
app: goreplay-app
spec:
replicas: 1
selector:
matchLabels:
app: goreplay-app
template:
metadata:
labels:
app: goreplay-app
spec:
containers:
- name: goreplay
image: feiznouri/goreplay:2.0
args:
- "--input-file"
- "requests_docker_0.gor"
- "--output-http=http://localhost:3000"
volumeMounts:
- name: data
mountPath: /var/lib/goreplay
- name: myserver
image: feiznouri/python-server:1.1
args:
- "3000"
ports:
- name: server-port
containerPort: 3000
volumes:
- name: data
persistentVolumeClaim:
claimName: goreplay-claim
PS:这是持久卷的 yaml 文件:
apiVersion: v1
kind: PersistentVolume
metadata:
name: goreplay-volume
labels:
type: local
spec:
storageClassName: custum
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/mnt/data"
这是用于存储的文件 class :
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: custom
provisioner: k8s.io/minikube-hostpath
reclaimPolicy: Retain
volumeBindingMode: Immediate
这是持久卷声明:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: goreplay-claim
spec:
storageClassName: custum
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Mi
我怎样才能完成这项工作并找到并使用我在第二个 pod 中创建的第一个文件!
提前致谢。
我复制了它,看起来卷很好。
不好的是如何将文件路径传递给 goreplay。
这是我所做的:
kubectl exec -it goreplay-deployment-899c49f95-7qdh4 -c goreplay sh
/home/goreplay # ps auxwf
PID USER TIME COMMAND
1 root 0:00 ./gor --input-raw :3000 --output-file=requests_docker.gor
36 root 0:00 sh
42 root 0:00 ps auxwf
/home/goreplay # ls /proc/1/cwd -l
lrwxrwxrwx 1 root root 0 Feb 19 09:44 /proc/1/cwd -> /home/goreplay
让我解释一下您在这里看到的内容。我执行到 goreplay 容器并检查了 goreplay 进程的 PID (PID=1)。接下来,我通过检查 /proc/1/cwd
符号链接来检查这个进程的当前工作目录是什么。如您所见,它已链接到 /home/goreplay
.
它告诉我们什么?
它告诉我们 --output-file=requests_docker.gor
正在使 goreplay 将文件保存在 /home/goreplay/requests_docker.gor
中(因为您指定的是相对于进程当前工作目录的路径,而不是使用指向卷的绝对路径)。它应该设置为:
--output-file=/var/lib/gorepath/requests_docker.gor
因为它是安装卷的目录。
同样适用于第二次部署。您应该指定:
--input-file=/var/lib/goreplay/requests_docker_0.gor`
以便它从卷中读取而不是从 pod 的主目录 (/home/goreplay
) 中读取。
更改它,它应该可以工作。