Подключаем удалённую samba-шару в качестве PersistentStorage в Kubernetes

от автора

Иногда хочется странного, но чаще ничего не хочется, а странного хочется кому-то другому. Вот и в этот раз появилась необходимость прицепить в pod кубера удалённую samba-шару с одного из виндовых серверов. Вызов брошен — вызов принят.

В качестве испытуемых возьмём компьютер в ОС Windows 10 и виртуалку с одно-нодовым кубер-кластером, который мы поднимали ранее.

Создание samba-шары

Запускаем PowerShell под администратором на нашей Win10 и последовательно выполняем команды.

Создаём пользователя:

$pass = ConvertTo-SecureString "smbp@ssword" -AsPlainText -Force New-LocalUser -Name smbuser -Password $pass
PowerShell - создание пользователя

PowerShell — создание пользователя

Создаём samba-шару:

mkdir $HOME\Desktop\share New-SmbShare -Name share -Path $HOME\Desktop\share -FullAccess smbuser
PowerShell - создание samba-шары

PowerShell — создание samba-шары

В только-что созданной samba-шаре создаём тестовый файл:

echo "test file 321" > $HOME\Desktop\share\testfile.txt

Проверяем доступность samba-шары на линуксовой виртуалке

mkdir /mnt/smb mount -t cifs //smb-host/share/ /mnt/smb -o username=smbuser,password=smbp@ssword ls –la /mnt/smb umount /mnt/smb
Содержимое подмонтированной samba-шары

Содержимое подмонтированной samba-шары

Подключение samba в качестве PersistentVolume

Устанавливаем в кубер-кластер csi-driver-smb:

helm repo add csi-driver-smb https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/charts helm install csi-driver-smb csi-driver-smb/csi-driver-smb --namespace csi-driver-smb --create-namespace kubectl get pods –n csi-driver-smb
Запуск в kubernetes samba-provisioner'a

Запуск в kubernetes samba-provisioner’a

Создаём namespace для наших экспериментов:

kubectl create namespace smb-example

Создаём Secret с кредами для подключения к нашей samba-шаре (помните создавали пользователя в Windows10?):

cat <<EOF | kubectl apply -f - --- apiVersion: v1 kind: Secret metadata:   name: smb-creds   namespace: smb-example stringData:   username: smbuser   password: smbp@ssword EOF

Создаём StorageClass, указывая в нём параметры подключения к samba-шаре:

cat <<EOF | kubectl apply -f - --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:   name: sc-smb provisioner: smb.csi.k8s.io parameters:   source: //172.20.0.1/share/   csi.storage.k8s.io/node-stage-secret-name: smb-creds   csi.storage.k8s.io/node-stage-secret-namespace: smb-example reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions:   - dir_mode=0777   - file_mode=0777   - uid=65534   - gid=65534 EOF

Создаём PersistentVolume:

cat <<EOF | kubectl apply -f - --- apiVersion: v1 kind: PersistentVolume metadata:   name: pv-smb   annotations:     pv.kubernetes.io/provisioned-by: smb.csi.k8s.io spec:   capacity:     storage: 1Gi   accessModes:     - ReadWriteMany   persistentVolumeReclaimPolicy: Delete   storageClassName: sc-smb   mountOptions:     - dir_mode=0777     - file_mode=0777     - uid=65534     - gid=65534   csi:     driver: smb.csi.k8s.io     volumeHandle: 172.20.0.1#share#     volumeAttributes:       source: //172.20.0.1/share/     nodeStageSecretRef:       name: smb-creds       namespace: smb-example EOF

Создаём PersistentVolumeClaim:

cat <<EOF | kubectl apply -f - --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: pvc-smb   namespace: smb-example spec:   accessModes:     - ReadWriteMany   resources:     requests:       storage: 1Gi   storageClassName: sc-smb EOF

Запускаем тестовый pod с samba-шарой примонтированной с помощью pvc:

cat <<EOF | kubectl apply -f - --- apiVersion: v1 kind: Pod metadata:   name: smb-example   namespace: smb-example spec:   containers:     - name: smb-example       image: debian       command: ["sleep","1000000"]       volumeMounts:         - name: smb-volume           mountPath: /mnt/smb           readOnly: false   volumes:     - name: smb-volume       persistentVolumeClaim:         claimName: pvc-smb

Проверка

Смотрим, что в итоге у нас получилось:

kubectl get sc kubectl get pv kubectl -n smb-example get pvc kubectl -n smb-example get pods

Проверяем точку монтирования в pod’е:

kubectl exec -it -n smb-example smb-example -- df -h /mnt/smb

Смотрим, что видно в подмонтированной папке:

kubectl exec -it -n smb-example smb-example -- ls -la /mnt/smb
Просмотр содержимого папки /mnt/smb

Просмотр содержимого папки /mnt/smb
kubectl exec -it -n smb-example smb-example -- cat /mnt/smb/testfile.txt
Просмотр содержимого файла /mnt/smb/testfile.txt

Просмотр содержимого файла /mnt/smb/testfile.txt

Создаём в pod’е новый тестовый файл:

kubectl exec -it -n smb-example smb-example -- echo "test echo from pod" > /mnt/smb/testfile2.txt kubectl exec -it -n smb-example smb-example -- ls -la /mnt/smb
Создали в поде новый тестовый файл /mnt/smb/testfile2.txt

Создали в поде новый тестовый файл /mnt/smb/testfile2.txt

Смотрим на результат в Windows 10

Созданный в kubernetes тестовый файл testfile2.txt

Созданный в kubernetes тестовый файл testfile2.txt

Получилось неплохо. Не очень сложно и вполне работоспособно. Данное решение можно например будет использовать для файлового обмена.


ссылка на оригинал статьи https://habr.com/ru/articles/867282/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *