我无法抵抗 Kubernetes 卷中的数据



我有一个记录实时流量并回放它们的应用程序。

https://github.com/buger/goreplay

这是一个简单的应用程序使用,但当我试图使用它与kubernetes我得到一个问题,在卷中持久化数据。

我想这样做:

  • 在pod 1中,我使用goreplay容器和其他容器,只有一个简单的python服务器…任务是监听来自外部服务器的请求,并将它们保存到一个文件中,这是部署文件:
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"

这是存储类的文件:

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正在将文件保存在/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)。


改变它,它应该工作。

最新更新