Настройка системы хранения для докеризованного приложения julia в кластере Kubernetes

# #julia #google-cloud-storage #storage #google-kubernetes-engine

Вопрос:

Я развернул julia app (сборка с докером) в кластере kubernetes (GKE), который использует структуру локальной файловой системы (он создаст папку «тест» в homedir() для хранения данных). Для локального тестирования он работает без проблем. Поскольку модули в kubernetes не могут хранить данные для последующего доступа и подвержены потере данных. Я пытаюсь настроить систему хранения для кластера kubernetes, чтобы мое приложение могло хранить файлы за пределами модулей.

У меня есть несколько вопросов, которые нужно прояснить:

  1. Будет ли создание общего каталога и добавление файлов, которые я использую для локальной разработки, работать на кластерах? Пример хранения данных показан ниже:
 cd(homedir())
mkdir("test")
open("$(mkpath("$(joinpath(homedir(), "test"))\$run_number"))\$run.jls", "w") do io
        serialize(io, run_data)
end
 
  1. Каков наилучший вариант хранения на kubernetes? В настоящее время я работаю над сценариями постоянных томов и утверждений о постоянных томах с использованием постоянных дисков. Похоже, это работает неправильно.

Добавление Файла Yaml

 ---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "app"
  namespace: "default"
  labels:
    app: "app"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: "app"
  template:
    metadata:
      labels:
        app: "app"
    spec:
      containers:
      - name: "app-sha256-1"
        image: "gcr.io/project-1234/github.com/user/app@sha256:b17b8159668d44fec3d"
        ports:
        - containerPort: 8080
---
apiVersion: "autoscaling/v2beta1"
kind: "HorizontalPodAutoscaler"
metadata:
  name: "app-hpa-y3ay"
  namespace: "default"
  labels:
    app: "app"
spec:
  scaleTargetRef:
    kind: "Deployment"
    name: "app"
    apiVersion: "apps/v1"
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: "Resource"
    resource:
      name: "cpu"
      targetAverageUtilization: 80

---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "app-service"
  namespace: "default"
  labels:
    app: "app"
spec:
  ports:
  - protocol: "TCP"
    port: 8080
    targetPort: 8080
  selector:
    app: "app"
  type: "LoadBalancer"
  loadBalancerIP: ""

---
apiVersion: "extensions/v1beta1"
kind: "Ingress"
metadata:
  name: "ingress"
  namespace: "default"
spec:
  backend:
    serviceName: "app-service"
    servicePort: 8080

---
apiVersion: v1
kind: PersistentVolume
metdata:
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 100G
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: test-pvc
    namespace: default
    resourceVersion: "51"
    uid: 26-39-47-a1-00
  gcePersistentDisk:
    fsType: ext4
    pdName: test-disk
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard-rwo
  volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 100G
  storageClassName: standard-rwo
  volumeMode: Filesystem
  volumeName: test-pv
 

Обновить:

Во-первых, я хотел бы представить свои выводы по этому 1st вопросу: из исследований следует, что метод, используемый для записи и чтения данных в локальной среде разработки, может быть непосредственно использован в облаке.

Я создал persistent volume и persistent volume claim для приложения, как показано в yaml. В большинстве учебных пособий показана реализация этого на одном модуле, однако у меня запущено 3 модуля. Должен ли я вручную редактировать yaml для каждого модуля или я могу сделать это непосредственно во время развертывания ? Спасибо, с нетерпением ждем предложений!!

Комментарии:

1. Не могли бы вы уточнить, с какой проблемой вы столкнулись, когда пытались использовать PersistentVolume в качестве хранилища в своем приложении. Пожалуйста, обратитесь к этой документации по постоянному объему и различным вариантам хранения в GKE.

2. @GoliNikitha спасибо за ответ. Я создал постоянный том и утверждаю, что файлы yaml, приведенная выше конфигурация yaml дает представление о моей реализации. Однако мои модули все еще не могут получить доступ к фотоэлектрическим элементам через пвх.

3. В режиме Readwritemany том может быть смонтирован как для чтения, так и для записи многими узлами. Ресурсы PersistentVolume, поддерживаемые постоянными дисками вычислительного ядра, не поддерживают этот режим доступа . Поскольку вы не можете подключать постоянные диски в режиме записи на несколько узлов одновременно. Дополнительную информацию о режимах доступа см. в этой документации.

Ответ №1:

Если вы хотите хранить данные локально в модуле после удаления модуля, он также будет удален. Лучший подход-использовать базу данных/облачное хранилище/хранилище файлов в соответствии с вашими требованиями(GKE не подходит для приложений с набором состояний )

Но если вы все еще хотите это сделать, вам следует использовать что-то под названием набор с отслеживанием состояния в GKE, обратитесь к этой документации для получения дополнительной информации.