Данные Hyperledger Indy не монтируются в каталог томов Kubernetes - PullRequest
5 голосов
/ 26 апреля 2020

Я пытаюсь запустить indy-узлы в kubernetes. Эти инди-узлы являются узлами песочницы и записывают данные в каталог /var/lib/indy внутри контейнера. Когда я запускаю модуль с подключенным томом, он ничего не записывает в каталог томов. Хотя он создает каталог внутри тома, он все время пуст. Однако, когда я создаю модуль без опции монтирования тома, контейнер записывает данные в /var/lib/indy.

Ниже приведен Dockerfile:
Hastebin: https://hastebin.com/hitinefizi.nginx

Kubernetes Развертывание:

{{- $root := .}}
{{- range .Values.indy}}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  # namespace: {{$root.Values.namespace}}
  name: {{.name}}
spec:
  selector:
    matchLabels:
      name: {{.name}}
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        name: {{.name}}
    spec:
      containers:
        - name: {{.name}}
          image: {{.image}}
          volumeMounts:
            - name: {{$root.Values.pv.metadata.name}}
              mountPath: "/var/lib/indy/sandbox"
              subPath: "volume/indy/{{.name}}/sandbox"
          ports:
            - containerPort: {{ index .ports 0 }}
            - containerPort: {{ index .ports 1 }}
      nodeSelector:
        nodeType: {{$root.Values.hosts.blockchain}}
      volumes:
        - name: {{$root.Values.pv.metadata.name}}
          {{- if eq $root.Values.storage.type "nfs" }}
          persistentVolumeClaim:
            claimName: {{$root.Values.pvc.metadata.name}}
          {{- else }}
          hostPath:
            path: /var/kubeshare/
          {{- end }}
{{- end}}

Каталог внутри тома:

[root@centos1 kubeshare]# tree volume/indy/
volume/indy/
|-- indy-node1
|-- indy-node2
|-- indy-node3
`-- indy-node

Каталог /var/lib/indy внутри контейнера без тома:

root@indy-node1-587c4758bf-2hpp6:/var/lib/indy# tree -L 3
.
|-- plugins
`-- sandbox
    |-- data
    |   `-- Node1
    |-- domain_transactions_genesis
    |-- keys
    |   |-- Node1
    |   |-- Node1C
    |   |-- Node2
    |   |-- Node3
    |   `-- Node4
    |-- node1_additional_info.json
    |-- node1_info.json
    |-- node1_version_info.json
    `-- pool_transactions_genesis

Я не уверен, почему это происходит. Буду признателен за любую помощь / предложения.

Обновление: это то же самое, что происходит с docker -compose, когда я пытаюсь использовать локальный том.

1 Ответ

3 голосов
/ 27 апреля 2020

Монтаж в docker соответствует стандартному поведению монтажа на Linux. Linux mount команда документы говорят

The previous contents (if any) and owner and mode of dir become invisible, and as long as this filesystem remains mounted

То же самое происходит и в Docker. Если вы смонтируете локальный каталог или существующий с именем docker том, содержимое файловой системы в контейнере на месте монтирования будет затенено (или мы можем назвать его «переопределенным»).

Упрощенный пример того, что происходит

Имея dockerfile

FROM alpine:3.9.6

WORKDIR /home/root/greetings
RUN echo "hello world" > /home/root/greetings/english.txt
CMD sleep 60000

И соберите его docker build -t greetings:1.0 .

Теперь создайте следующее docker-compose.yml:

version: '3.7'

services:
  greetings:
    container_name: greetings
    image: greetings:1.0
    volumes:
      - ./empty:/home/root/greetings

и создайте пустой каталог empty рядом с ним.

Запустите его docker-compose up -d. Пока контейнер работает, давайте погрузимся в контейнер и посмотрим, как выглядит внутренняя структура файла. docker exec -ti greetings sh. Теперь, когда мы внутри, если вы запустите ls /home/root/greetings, вы увидите, что каталог пуст - хотя в Dockerfile мы запекли файл /home/root/greetings/english.txt в файловую систему образа.

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

Вы можете попробовать это, настроив docker-compose.yml на это

version: '3.7'

services:
  greetings:
    container_name: greetings
    image: greetings:1.0
    volumes:
      - greetingsvol:/home/root/greetings

volumes:
  greetingsvol:
    driver: local

и если вы повторите процедуру и сами запустите c в контейнер, вы увидите, что файл /home/root/greetings/english.txt все еще там.

Это потому, что когда вы cd сами в /home/root/greetings, вы смотрите не на фактическую файловую систему контейнера, а на смонтированное устройство - имя docker том - которое было инициализировано копией оригинальных файлов контейнера в данном месте. (Предполагая, что docker том greetingsvol ранее не существовал.)

Решение вашей проблемы

Вы монтируете каталог /var/kubeshare на своем хосте в контейнер /var/lib/indy/sandbox. Давайте посмотрим, что контейнер хранит в этом месте при запуске (indypool - это то, как я назвал встроенный образ песочницы indy на моем локальном хосте)

docker run --rm indypool ls /var/lib/indy/sandbox
domain_transactions_genesis
keys
pool_transactions_genesis

Так что, если вы смонтируете локальный каталог в /var/lib/indy/sandbox, он будет скрыть эти файлы, и пул не запустится (и, следовательно, не будет создавать файлы, такие как node1_additional_info.json et c).

Так что я думаю, что у вас есть 2 варианта:

  1. Если у вас нет веских причин не использовать именованные docker тома.
  2. Скопируйте исходные данные изображения из контейнера /var/lib/indy/sandbox в ваш /var/kubeshare. Тогда вы сохраните все остальное, как было. Таким образом, каталог будет затенен новой файловой системой, содержащей точно такие же данные, которые контейнер ожидает там найти.
...