Для кластеров k8s (таких как GKE и т. д.), работающих у поставщиков облачных услуг, существует относительно полная поддержка томов хранения. Самостоятельно созданный кластер k8s часто вызывает больше проблем в этом отношении. После расследования было обнаружено, что использование томов nfs в самодельном кластере k8s является относительно простым и осуществимым решением. Сервер nfs может быть независимым от кластера k8s, что облегчает централизованное управление томами и файлами в кластере.
Эта статья включает в себя:
- Установить и настроить nfs-сервер
- Подключите общую папку NFS с помощью клиента NFS
- Создание объемов NFS в кластере K8S
В этой статье в качестве экспериментальной среды используется Ubuntu/Debian, для таких систем, как Centos, единственное отличие заключается в установке и настройке nfs.
Установить и настроить nfs-сервер
Справочное руководство:viimage.com/install-NFS…
sudo apt-get update
sudo apt install nfs-kernel-server
sudo mkdir -p /mnt/sharedfolder
sudo chown nobody:nogroup /mnt/sharedfolder
sudo chmod 777 /mnt/sharedfolder
sudo nano /etc/exports
Шаг 1: Установите nfs-kernel-server
sudo apt-get update
sudo apt install nfs-kernel-server
Шаг 2: Создайте каталог экспорта
Каталог экспорта — это каталог для совместного использования с клиентами nfs, этот каталог может быть любым каталогом в Linux. Здесь мы используем созданный новый каталог.
sudo mkdir -p /mnt/sharedfolder
Шаг 3: Назначьте доступ к серверу клиентам через выходной файл nfs
редактировать/etc/exports
документ
sudo vi /etc/exports
Добавляя конфигурацию в файл, можно назначать разные типы прав доступа:
- Формат конфигурации для назначения прав доступа отдельным клиентам:
/mnt/sharedfolder clientIP(rw,sync,no_subtree_check)
- Формат конфигурации для назначения прав доступа нескольким клиентам:
/mnt/sharedfolder client1IP(rw,sync,no_subtree_check)
/mnt/sharedfolder client2IP(rw,sync,no_subtree_check)
- Формат конфигурации для назначения доступа нескольким клиентам путем указания полного подмножества клиентов:
/mnt/sharedfolder subnetIP/24(rw,sync,no_subtree_check)
Пример:
Вот пример конфигурации с разрешениями на чтение и запись, назначенными клиенту 192.168.0.101.
/mnt/sharedfolder 192.168.0.101(rw,sync,no_subtree_check)
Шаг 4: Выведите общий каталог
Выполните команду для вывода общего каталога:
sudo exportfs -a
Перезапустите службу nfs-kernel-server, чтобы все настройки вступили в силу.
sudo systemctl restart nfs-kernel-server
подключить общую папку nfs с помощью клиента nfs
Вы можете использовать менеджер ресурсов win10 для подключения к серверу nfs для тестирования, или вы можете использовать linux для подключения для тестирования.
Вот еще один Ubuntu в локальной сети, чтобы установить совместный каталог NFS для тестирования:
Шаг 1: Установите nfs-common
nfs-common содержит программное обеспечение, необходимое клиенту nfs.
sudo apt-get update
sudo apt-get install nfs-common
Шаг 2. Создайте точку монтирования для общего каталога nfs.
sudo mkdir -p /mnt/sharedfolder_client
Шаг 3: Подключите общий каталог к клиенту
Формат команды монтирования:
sudo mount serverIP:/exportFolder_server /mnt/mountfolder_client
Согласно предыдущей конфигурации, команда Mount выглядит следующим образом:
sudo mount 192.168.100.5:/mnt/sharedfolder /mnt/sharedfolder_client
При настройке вам необходимо заполнить в соответствии с фактическими IP-адресом сервера NFS.
Шаг 4. Проверьте соединение
Вы можете скопировать файл в общий каталог, и файл будет виден на других машинах.
Вручную создайте том nfs в кластере k8s
Справочное руководство:medium.com/@no special/крутой звонок…
Создать pv на основе nfs
nfs.yaml
:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
labels:
name: mynfs # name can be anything
spec:
storageClassName: manual # same storage class as pvc
capacity:
storage: 200Mi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.1.7 # ip addres of nfs server
path: "/srv/nfs/mydata2" # path to directory
Разверните nfs.yaml:
$ kubectl apply -f nfs.yaml
$ kubectl get pv,pvc
persistentvolume/nfs-pv 100Mi RWX Retain Available
создать пвх
Создайте файл объявления постоянного тома и разверните его.Следует отметить, что accessModes должны быть согласованы с ранее созданным pv
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteMany # must be the same as PersistentVolume
resources:
requests:
storage: 50Mi
развертывать
$ kubectl apply -f nfs_pvc.yaml
$ kubectl get pvc,pv
persistentvolumeclaim/nfs-pvc Bound nfs-pv 100Mi RWX
создать модуль
Создайте простое развертывание nginx, используя этот pvc,nfs-pod.yaml
:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: nginx
name: nfs-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: nfs-test
persistentVolumeClaim:
claimName: nfs-pvc # same name of pvc that was created
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nfs-test # name of volume should match claimName volume
mountPath: /usr/share/nginx/html # mount inside of contianer
Разверните Nginx:
$ kubectl apply -f nfs_pod.yaml
$ kubectl get po
nfs-nginx-6cb55d48f7-q2bvd 1/1 Running
Часто задаваемые вопросы: Не удалось создать POD - причина в отсутствии драйвера NFS
Ошибка создания пода с использованием тома nfs в k8s:
Причина: на узле не установлены пакеты, необходимые для монтирования клиента nfs.
root@k8s0:~# kubectl describe pod/nfs-nginx-766d4bf45f-n7dlt
Name: nfs-nginx-766d4bf45f-n7dlt
Namespace: default
Priority: 0
Node: k8s2/172.16.2.102
Start Time: Fri, 10 Jul 2020 18:04:58 +0800
Labels: app=nginx
pod-template-hash=766d4bf45f
Annotations: cni.projectcalico.org/podIP: 192.168.109.86/32
Status: Running
IP: 192.168.109.86
IPs:
IP: 192.168.109.86
Controlled By: ReplicaSet/nfs-nginx-766d4bf45f
Containers:
nginx:
Container ID: docker://88299398d40ead29e991e57c6bad5d0e6d0396c21c2e69b0d2afb4ab7cce6044
Image: nginx
Image ID: docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Port: <none>
Host Port: <none>
State: Running
Started: Fri, 10 Jul 2020 18:17:00 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/usr/share/nginx/html from nfs-test (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-mhtqt (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
nfs-test:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: nfs-pvc
ReadOnly: false
default-token-mhtqt:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-mhtqt
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/nfs-nginx-766d4bf45f-n7dlt to k8s2
Warning FailedMount 21m kubelet, k8s2 MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv --scope -- mount -t nfs 172.16.100.105:/mnt/sharedfolder /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv
Output: Running scope as unit run-r3892d691a70441eb975bc53bb7aeca72.scope.
mount: wrong fs type, bad option, bad superblock on 172.16.100.105:/mnt/sharedfolder,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)
In some cases useful info is found in syslog - try
dmesg | tail or so.
Warning FailedMount 21m kubelet, k8s2 MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv --scope -- mount -t nfs 172.16.100.105:/mnt/sharedfolder /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv
Output: Running scope as unit run-r8774f015f759436d843d408eb6c941ec.scope.
Решение:
Ubuntu/debian выполняется на узле k8s, и установлена поддержка клиента nfs.
sudo apt-get install nfs-common
Через некоторое время после завершения установки вы можете обнаружить, что модуль может работать нормально.
Проверьте, правильно ли k8s использует том nfs
Создайте тестовую веб-страницу в модуле nginx с именем файла index.html:
$ kubectl exec -it nfs-nginx-6cb55d48f7-q2bvd bash
#填入index.html内容用于测试
$ sudo vi /usr/share/nginx/html/index.html
this should hopefully work
Вы можете убедиться, что тот же файл теперь существует на сервере nfs и что nginx может его прочитать:
$ ls /srv/nfs/mydata$
$ cat /srv/nfs/mydata/index.html
this should hopefully work
# 将nginx pod通过nodeport暴露为服务,以使可通过浏览器访问
$ kubectl expose deploy nfs-nginx --port 80 --type NodePort
$ kubectl get svc
$ nfs-nginx NodePort 10.102.226.40 <none> 80:32669/TCP
Откройте браузер и введите
Этот пример: 192.168.99.157:32669
Удаление всех развертываний может убедиться, что тестовые файлы все еще присутствуют в нашем каталоге:
$ kubectl delete deploy nfs-nginx
$ kubectl delete pvc nf-pvc
--> kubectl delete svc nfs-nginx
$ ls /srv/nfs/mydata/
index.html