я не могу представить данные в кубернетских томах

У меня есть приложение, которое записывает живой трафик и воспроизводит его.

https://github.com/buger/goreplay

это простое приложение, но когда я попытался использовать его с кубернетами, у меня возникла проблема с сохранением данных в томах.

я хочу сделать это :

  • в модуле номер один я использую контейнер 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

как я могу заставить эту работу найти и использовать первый файл, который я создал во втором модуле!

заранее спасибо.


person feiz    schedule 17.02.2021    source источник
comment
вы уверены, что не удаляете и не воссоздаете постоянный том?   -  person Daniel Farrell    schedule 18.02.2021
comment
Если два контейнера не запланированы на одном и том же узле, hostPath будет относиться к разным местам. К сожалению, большинство типов томов, которые относительно легко получить, не поддерживают режим доступа ReadWriteMany. Можете ли вы реструктурировать это так, чтобы общие файлы вообще не нужны, может быть, одна служба отправляет другие данные через HTTP-запрос или очередь сообщений?   -  person David Maze    schedule 18.02.2021
comment
@DanielFarrell нет, постоянный том включен уже два дня   -  person feiz    schedule 18.02.2021
comment
@DavidMaze, я не уверен, что вы предлагаете, но я просто хочу сказать, что я использую minikube, поэтому я не думаю, что существует более одного узла, верно?   -  person feiz    schedule 18.02.2021
comment
@DavidMaze да, я могу напрямую перенаправить запрос от одного к другому, и мне удается это сделать, но приложение предлагает эту функцию сохранения в файлах, а затем использовать ее, и я просто хотел применить ее в кубернетах, но кажется, что объемы вещь немного сложная   -  person feiz    schedule 18.02.2021


Ответы (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 и проверил PID процесса goreplay (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`

так что он читает с тома, а не из домашнего каталога модуля (/home/goreplay).


Измените его, и он должен работать.

person Matt    schedule 19.02.2021
comment
отличный отличный ответ, спасибо, сработало! :) - person feiz; 21.02.2021
comment
не могли бы вы посоветовать мне, как отлаживать, как вы только что сделали? любые документы по этому поводу помогут - person feiz; 21.02.2021