Совместное использование PV при развертывании для Redis ReJSON не работает
Информация о кластере:
Версия Kubernetes: Major:"1", Minor:"17"
Используемое облако: голый металл
Способ установки: 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 ответ
Проблема с вашим yaml - это используемый режим доступа, вы должны изменить режим доступа на
ReadWriteMany
Доступны следующие режимы доступа: См. Ссылку
ReadWriteOnce
- том может быть смонтирован как чтение-запись одним узлом
ReadOnlyMany
- том может быть установлен только для чтения многими узлами
ReadWriteMany
- том можно монтировать как чтение-запись многими узлами
Посмотрите этот очень простой пример о том, как совместно использовать содержимое файла между контейнерами в POD, созданном посредством развертывания с использованием PV/PVC, и как оно используется репликами при масштабировании развертывания.
Сначала создайте постоянный том, см. Ниже пример 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 и pvc установлен на 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
В-третьих, потребляйте pvc в требуемых обоих модулях развертывания, см. Ниже пример 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 #