【问题标题】:i can't presist data in kubernetes volumes我无法在 kubernetes 卷中保存数据
【发布时间】:2021-02-17 23:27:19
【问题描述】:

我有一个应用程序可以记录实时流量并重放它们。

https://github.com/buger/goreplay

这是一个简单易用的应用程序,但是当我尝试将它与 kubernetes 一起使用时,我遇到了将数据保存在卷中的问题。

我想这样做:

  • 在 pod 1 中,我使用 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"

这是存储类的文件:

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 中创建的第一个文件!

提前谢谢你。

【问题讨论】:

  • 您确定不删除并重新创建持久卷吗?
  • 如果两个容器没有被调度在同一个节点上,hostPath 将指向不同的地方。不幸的是,大多数相对容易获得的卷类型不支持 ReadWriteMany 访问模式。您可以通过一个服务通过 HTTP 请求或消息队列发送其他数据来将其重组为根本不需要共享文件吗?
  • @DanielFarrell 两天后没有持久卷
  • @DavidMaze 我不确定你在提议什么,但我只想说我正在使用 minikube,所以我不认为有多个节点,对吧?
  • @DavidMaze 是的,我可以直接将请求从一个转发到另一个,并且我设法做到了,但是该应用程序提供了保存文件然后使用它的功能,我只是想应用它在 kubernetes 中,但是卷的东西似乎有点复杂

标签: docker kubernetes minikube persistent-volumes mounted-volumes


【解决方案1】:

我复制了它,看起来卷很好。

不好的是,你如何将文件路径传递给 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)。


更改它,它应该可以工作。

【讨论】:

  • 完美的答案,谢谢它的工作! :)
  • 您能否参考我刚才的调试方式?任何有关这方面的文档都会有所帮助
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2019-02-16
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多