Доля PV в развертывании для Redis Re JSON не работает - PullRequest
0 голосов
/ 04 февраля 2020

Информация о кластере:

Версия Kubernetes: Major: "1", Minor: "17"

Используемое облако: bare-metal

Способ установки: minikube с kubectl

ОС хоста: Ubuntu 16.04

Вопрос:

Я создаю 3 копии и собираюсь создать JSON набор в одном из модулей. данные могут быть доступны только в этом модуле. У меня вопрос, как получить доступ к тому же набору и получить его из другого модуля.

Вот файл YAML:

apiVersion: v1
kind: Service
metadata:
  name: rejson
spec:
  ports:
  - port: 6379
  selector:
    app: rejson
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: rejson
spec:
  replicas: 3
  selector:
    matchLabels:
      app: rejson
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: rejson
    spec:
      containers:
      - image: redislabs/rejson
        args: ["--appendonly", "yes", "--save", "900", "1", "--save", "30", "2", "--loadmodule", "/usr/lib/redis/modules/rejson.so"] 
        name: rejson
        ports:
        - containerPort: 6379
          name: rejson
        volumeMounts:
        - name: rejson-persistent-storage
          mountPath: /data
      volumes:
      - name: rejson-persistent-storage
        persistentVolumeClaim: 
          claimName: rejson-pv-claim
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rejson-pv-claim
  labels:
    app: rejson
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

1 Ответ

1 голос
/ 04 февраля 2020

Проблема в вашем yaml - используемый режим доступа, вам следует изменить режим доступа на ReadWriteMany

Допустимые режимы доступа указаны ниже: См. Ссылку

ReadWriteOnce - том можно монтировать как чтение-запись одним узлом

ReadOnlyMany - том можно монтировать как чтение-запись только многими узлами

ReadWriteMany - том может быть смонтирован многими узлами в режиме чтения-записи

Проверьте этот самый базовый c пример того, как обмениваться содержимым файла между контейнерами в POD, созданном с помощью развертывания с использованием PV / PV C и находящемся между репликами при масштабировании развертывания.

Первый Создание постоянного тома См. ниже пример yaml с конфигурацией hostPath

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv-1
  labels:
    pv: my-pv-1
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /var/log/mypath

$ kubectl create -f pv.yaml
persistentvolume/my-pv-1 created

Второй создать постоянную заявку тома , используя приведенный ниже пример yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-claim-1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      pv: my-pv-1


$ kubectl create -f pvc.yaml
persistentvolumeclaim/my-pvc-claim-1 created

Убедитесь, что для pv и pv c STATUS установлено значение BOUND

$ kubectl get persistentvolume
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE
my-pv-1   1Gi        RWX            Retain           Bound    default/my-pvc-claim-1                         62s

$ kubectl get persistentvolumeclaims
NAME             STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc-claim-1   Bound    my-pv-1   1Gi        RWX                           58

Третий потребляет PV c в необходимых обоих стручках развертывания см. ниже пример yaml, где том смонтирован на двух модулях busy1 и busy2 развертывания с несколькими модулями, где файл, записанный в первом контейнере, доступен для чтения во втором.

multi-pod-deploy. yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: multipod
  name: multipod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: multipod
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: multipod
    spec:
      containers:
      - command:
        - sleep
        - "3600"
        image: busybox
        name: busy1
        volumeMounts:
        - name: vol
          mountPath: /var/log/mypath
      - command:
        - sleep
        - "3600"
        image: busybox
        name: busy2
        volumeMounts:
        - name: vol
          mountPath: /var/log/mypath
      volumes:
      - name: vol
        persistentVolumeClaim:
           claimName: my-pvc-claim-1


$ kubectl create -f multi-pod-deploy.yaml
deployment.apps/multipod created


$ kubectl get all
NAME                            READY   STATUS    RESTARTS   AGE
pod/multipod-5758475c69-fkl57   2/2     Running   0          36s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   37h

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/multipod   1/1     1            1           36s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/multipod-5758475c69   1         1         1       36s

Выполните тестирование, подключившись к контейнеру 1 и записав в файл путь монтирования.

$ kubectl exec -it multipod-5758475c69-fkl57 -c busy1 /bin/sh

/ # df -kh
Filesystem                Size      Used Available Use% Mounted on
overlay                  38.7G      4.1G     34.6G  11% /
tmpfs                    64.0M         0     64.0M   0% /dev
tmpfs                     7.8G         0      7.8G   0% /sys/fs/cgroup
/dev/vda1                38.7G      4.1G     34.6G  11% /dev/termination-log
/dev/vda1                38.7G      4.1G     34.6G  11% /etc/resolv.conf
/dev/vda1                38.7G      4.1G     34.6G  11% /etc/hostname
/dev/vda1                38.7G      4.1G     34.6G  11% /etc/hosts
shm                      64.0M         0     64.0M   0% /dev/shm
/dev/vda1                38.7G      4.1G     34.6G  11% /var/log/mypath
tmpfs                     7.8G     12.0K      7.8G   0% /var/run/secrets/kubernetes.io/serviceaccount
tmpfs                     7.8G         0      7.8G   0% /proc/acpi
tmpfs                    64.0M         0     64.0M   0% /proc/kcore
tmpfs                    64.0M         0     64.0M   0% /proc/keys
tmpfs                    64.0M         0     64.0M   0% /proc/timer_list
tmpfs                    64.0M         0     64.0M   0% /proc/timer_stats
tmpfs                    64.0M         0     64.0M   0% /proc/sched_debug
tmpfs                     7.8G         0      7.8G   0% /proc/scsi
tmpfs                     7.8G         0      7.8G   0% /sys/firmware

# cd /var/log/mypath/

/var/log/mypath # date >> file_in_container1.txt
/var/log/mypath # date >> file_in_container1.txt

/var/log/mypath # cat file_in_container1.txt
Tue Feb  4 10:25:32 UTC 2020
Tue Feb  4 10:25:34 UTC 2020

Теперь подключите второй контейнер в развертывание , и он должен увидеть файл сначала, как показано ниже

$ kubectl exec -it multipod-5758475c69-fkl57 -c busy2 /bin/sh

/ # cd /var/log/mypath/
/var/log/mypath # ls
date                     file_in_container1.txt   

/var/log/mypath # cat file_in_container1.txt
Tue Feb  4 10:25:32 UTC 2020
Tue Feb  4 10:25:34 UTC 2020

Теперь, когда мы масштабируем это развертывание и создаем больше реплик (, так как я использовал hostPath не NFS, я должен убедиться, что все реплики работают на одном узле )

$ kubectl scale deployment --replicas=2 multipod
deployment.apps/multipod scaled

$ kubectl get all -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE                NOMINATED NODE   READINESS GATES
pod/multipod-5758475c69-7xl9j   2/2     Running   0          47s   192.168.58.112   k8s-node02-calico   <none>           <none>
pod/multipod-5758475c69-fkl57   2/2     Running   0          21m   192.168.58.111   k8s-node02-calico   <none>           <none>

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   38h   <none>

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS    IMAGES            SELECTOR
deployment.apps/multipod   2/2     2            2           21m   busy1,busy2   busybox,busybox   app=multipod

NAME                                  DESIRED   CURRENT   READY   AGE   CONTAINERS    IMAGES            SELECTOR
replicaset.apps/multipod-5758475c69   2         2         2       21m   busy1,busy2   busybox,busybox   app=multipod,pod-template-hash=5758475c69

Новая реплика также может читать файлы, как и ожидалось .

$ kubectl exec -it multipod-5758475c69-7xl9j /bin/sh
Defaulting container name to busy1.
Use 'kubectl describe pod/multipod-5758475c69-7xl9j -n default' to see all of the containers in this pod.

/ # cd /var/log/mypath/
/var/log/mypath # ls
file_in_container1.txt

/var/log/mypath # cat file_in_container1.txt
Tue Feb  4 10:25:32 UTC 2020
Tue Feb  4 10:25:34 UTC 2020
/var/log/mypath #
...