4.1 селектор
В PVC PV может быть дополнительно отфильтрован с помощью селектора тегов. Только PV, которые соответствуют селектору, будут связаны с PVC. Селектор состоит из следующих элементов:
- matchLabels: PVC будет выбирать только те фотокамеры, которые имеют такую же метку, как эта;
- matchExpressions: выражения соответствия состоят из ключей, значений и операторов. Операторы включают In, NotIn, Exists и DoesNotExist. Могут быть выбраны только те PV, которые соответствуют выражению.
Если matchLabels и matchExpressions установлены одновременно, будет выполнена сумма, то есть будут выбраны только те PV, которые соответствуют вышеуказанным требованиям соответствия.
Deleting PV and PVC — an example
So, we have a pod running:
$ kk get pod pv-static-podNAME READY STATUS RESTARTS AGEpv-static-pod 1/1 Running 0 19s
Which is using a PVC:
$ kk get pvc pvc-staticNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpvc-static Bound pv-static 50Gi RWO gp2 19h
And this PVC is bound to the PV:
$ kk get pv pv-staticNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-static 50Gi RWO Retain Bound default/pvc-static gp2 19h
And our PV has its set to Retain — so, after we will drop its PVC and PV all data must be kept.
Let’s check — add some data:
$ kk exec -ti pv-static-pod bashroot@pv-static-pod:/# echo Test > /usr/share/nginx/html/test.txtroot@pv-static-pod:/# cat /usr/share/nginx/html/test.txtTest
Exit from the pod and delete it, and then its PVC:
$ kubectl delete pod pv-static-podpod “pv-static-pod” deletedkubectl delete pvc pvc-staticpersistentvolumeclaim “pvc-static” deleted
Check the PV’s status:
$ kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-static 50Gi RWO Retain Released default/pvc-static gp2 25s
== Released, and at this moment we are not able to attach this volume again via a new PVC.
Let’s check — create a PVC again:
$ kubectl apply -f pvc-static.yamlpersistentvolumeclaim/pvc-static created
Create a pod:
$ kubectl apply -f pv-pod-stat.yamlpod/pv-static-pod created
And check its PVC status:
$ kubectl get pvc pvc-staticNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpvc-static Pending pv-static 0 gp2 59s
The is Pending.
Delete the pod, PVC and at this time — delete the PersistentVolume too:
$ kubectl delete -f pv-pod-stat.yamlpod “pv-static-pod” deleted$ kubectl delete -f pvc-static.yamlpersistentvolumeclaim “pvc-static” deleted$ kubectl delete -f pv-static.yamlpersistentvolume “pv-static” deleted
Create all over again:
$ kubectl apply -f pv-static.yamlpersistentvolume/pv-static created$ kubectl apply -f pvc-static.yamlpersistentvolumeclaim/pvc-static created$ kubectl apply -f pv-pod-stat.yamlpod/pv-static-pod created
Check the PVC:
$ kubectl get pvc pvc-staticNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpvc-static Bound pv-static 50Gi RWO gp2 27s
And check the data we’ve added earlier:
$ kubectl exec -ti pv-static-pod cat /usr/share/nginx/html/test.txtTest
All good — the data is still in its place.
4.3 PVCКак объем хранения
Контейнеры используют PVC для доступа к хранилищу, и они должны находиться в том же пространстве имен, что и блоки, которые их используют. Модуль выбирает подходящий PVC в том же пространстве имен, использует PVC для получения тома для хранения и подключает PV к хосту и модулю.
справочный материал
1. Адрес «Настройка модуля для использования PersistentVolume для хранилища»: https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
2. Постоянные тома: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
3. Адрес «Постоянное хранилище»: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/persistent-storage.md.
4. Адрес «PersistentVolume v1 core»: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#persistentvolume-v1-core
Создать под
Следующим шагом является создание модуля с использованием PersistentVolumeClaim в качестве тома.
Вот конфигурационный файл модуля:
Обратите внимание, что файл конфигурации модуля указывает PersistentVolumeClaim, но не указывает PersistentVolume. С точки зрения капсулы претензия — это том
Создайте контейнер:
Убедитесь, что контейнер запущен:
Используйте оболочку, чтобы войти внутрь работающего контейнера:
Проверьте в оболочке, применяет ли nginx файл index.html, предоставленный из тома пути к хосту:
Вывод показывает содержимое, записанное в том index.html пути к хосту:
3.5 CNI и таблица маршрутизации
Когда CNI (например, ) терпит сбой на любом из узлов, то он нарушает маршрутизацию и сетевое подключение в кластере K8s, часто локально для подверженного сбою узла/узлов.
Как и в случае с , проблему может решить либо перезапуск контейнера на этом узле, либо контроллер . Аналогично всем прочим рабочим нагрузкам кластера Поды CNI тоже очень уязвимы для сбоев.
Заключение
Kubernetes — это сложная платформа, отладка которой вызывает массу сложностей. В этой статье мы видели, как всего одно застывшее состояние, например , может быть вызвано разными причинами, начиная с не обнаружения IP и заканчивая проблемами монтирования дисков. Обычно это обусловлено огромным числом движущихся частей платформы и их глобальными взаимосвязями.
Мы рассмотрели три категории проблем и проанализировали многие связанные с ними неполадки:
- Застревание Pod в состоянии .
- и периодические перезапуски.
- Проблемы с сетью.
Это помогло нам разобраться во внутренних процессах и лучше представить, где стоит искать решение возникающих проблем, которые в мире Kubernetes нередкое явление.
- Kubernetes: сэкономьте до 50% с вытесняемыми объектами
- Kubernetes: безопасное управление секретами с GitOps
- Практичные Canary-релизы в Kubernetes с Argo Rollouts
Читайте нас в Telegram, VK и
Create a Pod
The next step is to create a Pod that uses your PersistentVolumeClaim as a volume.
Here is the configuration file for the Pod:
Notice that the Pod’s configuration file specifies a PersistentVolumeClaim, but
it does not specify a PersistentVolume. From the Pod’s point of view, the claim
is a volume.
Create the Pod:
Verify that the container in the Pod is running;
Get a shell to the container running in your Pod:
In your shell, verify that nginx is serving the file from the
hostPath volume:
The output shows the text that you wrote to the file on the
hostPath volume:
If you see that message, you have successfully configured a Pod to
use storage from a PersistentVolumeClaim.
2.5 Переработка
Стратегия утилизации PV объясняет кластеру, как следить за выпуском объемов из ПВХ. В настоящее время доступны три стратегии:Держать, перерабатыватьилиУдалить, Политика хранения позволяет повторно использовать этот ресурс. Когда PVC может поддерживать его, политика удаления будет одновременно удалять содержимое хранилища на томе и томе AWS EBS / GCE PD или Cinder. Если плагин может поддерживать его, стратегия утилизации выполнит базовую операцию стирания (rm -rf / thevolume / *), и этот том можно будет повторно применить.
2.5.1 удержание
Политика утилизации позволяет перерабатывать ресурсы вручную. Когда PVC удален, PV все равно будет сохранен, и том хранилища будет считаться освобожденным. Однако он недоступен для других PVC, поскольку предыдущие данные остаются в данных. Администраторы могут вручную перезаписывать тома хранения, выполнив следующие действия:
1) Удалить PV: после удаления PV соответствующие ресурсы хранения во внешних объектах все еще там;
2) вручную удалить данные, оставленные во внешнем хранилище;
3) Удалите ресурсы хранения вручную. Если вам нужно повторно использовать эти ресурсы хранения, вам нужно создать новый PV.
2.5.2 циркуляция
Предупреждение: эта стратегия будет заброшена. Рекомендуется следовать модели динамического обеспечения.
Recycling выполняет базовую команду стирания на томе хранилища: rm -rf / thevolume / *, делая данные доступными для нового PVC.
2.5.3 Удалить
Для плагинов томов хранения, которые поддерживают стратегию удаления восстановления, удаление удалит PV из Kubernetes, а также удалит активы хранилища из связанных внешних устройств, таких как AWS EBS, GCE PD, Azure Disk или Cinder.
3. Постоянный объем хранения
В Kubernetes PV реализован с помощью различных плагинов, в настоящее время поддерживаются следующие типы плагинов:
- GCEPersistentDisk
- AWSElasticBlockStore
- AzureFile
- AzureDisk
- FC (Fibre Channel)
- FlexVolume
- Flocker
- NFS
- iSCSI
- RBD (Ceph Block Device)
- CephFS
- Cinder (OpenStack block storage)
- Glusterfs
- VsphereVolume
- Quobyte Volumes
- HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
- VMware Photon
- Portworx Volumes
- ScaleIO Volumes
- StorageOS
Объем постоянного хранилища можно сделать через файл конфигурации YAML и указать, какой тип подключаемого модуля используется. Ниже приведен файл конфигурации YAML для тома постоянного хранения. В этом файле конфигурации требуется место для хранения 5 Ги.Filesystem ,Режим доступаReadWriteOnceПереработайте постоянный том хранения с помощью стратегии Recycle recycle, укажите класс хранения как медленный и используйте тип плагина nfs. Следует отметить, что служба NFS должна присутствовать.
NFS хранилище в качестве Persistence Volume
Для простоты я взял в качестве хранилища PV nfs сервер. Для него не существует встроенного Provisioner, как к примеру, для Ceph. Возможно в будущем я рассмотрю более сложный пример с применением хранилища на основе ceph. Но перед этим надо будет написать статью про установку и работу с ceph.
Создаем yaml файл pv-nfs.yaml с описанием Persistence Volume на основе NFS.
apiVersion: v1 kind: PersistentVolume metadata: name: my-nfs-share spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: server: 10.1.4.39 path: /mnt/nfs
Reclaim Policy
persistentVolumeReclaimPolicy — что будет происходить с pv после удаления pvc. Могут быть 3 варианта:
- Retain — pv удален не будет.
- Recycle — pv будет очищен.
- Delete — pv будет удален.
Так как у нас нет Provisioner для nfs, удалять автоматически pv не получится. Так что у нас только 2 варианта — либо оставлять данные (retain), либо очищать том (recycle).
Все остальное и так понятно, описывать не буду. Добавляем описанный pv в кластер kubernetes.
# kubectl apply -f pv-nfs.yml
Проверяем список pv и pvc
# kubectl get pv # kebectl get pvc
Мы просили в pvc только 1 Гб хранилища, но в pv было только хранилище с 10 Гб и оно было выдано. Как я и говорил раньше. Так что в случае ручного создания PV и PVC нужно самим следить за размером PV.
Удалить StatefulSet.
StatefulSet поддерживает каскадное удаление и некаскадное удаление. В режиме некаскадного удаления можно удалить только StatefulSet без удаления Pod, но при каскадном удалении удаляются все.
После некаскадного удаления StatefulSet, если Pod удален, исходный Pod больше не будет загружен, но будет создан новый Pod. Но если StatefulSet воссоздан, существующие поды будут реорганизованы в соответствии с правилами.
Некоторые распределенные системы не хотят управлять запуском и остановкой модулей по порядку, поэтому после версии 1.7 он предоставляетЭтот параметр по умолчанию, Можно установить наТаким образом, создание Pod не должно ждать, но оно будет создано и удалено одновременно.
4.2 Хранениекатегория
Если PVC использует поле storageClassName для указания класса хранения, к PVC могут быть привязаны только те PV, которые указывают тот же класс хранения. Для ПВХ, классы хранения не нужны. В зависимости от способа установки вы можете использовать менеджер надстроек для развертывания StorageClass по умолчанию в кластере Kubernetes во время процесса установки. Когда для PVC указывается селектор, а для StorageClass указывается, при сопоставлении PV берется AND между ними: то есть, могут совпадать только те PV, которые удовлетворяют как классу хранения, так и требуемому значению тега.
3.1 Kube-proxy и таблицы IP
Главная назначение — облегчать взаимодействие между и его конечными точками в бэкенд (). Поэтому, если ваш находится на узле, имеющем сложности с подключением к IP сервиса, и возникают ошибки истечения времени подключения или отказа подключения, проблему зачастую может решить простой перезапуск , потому что, как и в случае с любой другой рабочей нагрузкой, возможно, контейнер на этом узле дал сбой.
Ядро является основным компонентом маршрутизации трафика между сервисами и Подами в бэкенд, включая сообщение через . задействует таблицу IP-адресов для установки правил, облегчающих балансировку нагрузки и маскировку, в связи с чем эти таблицы нужно смотреть в первую очередь, если ваши могут связываться с IP других , но не с .
Подключаем хранилище к поду
Теперь подключим наш PVC в виде volume к какому-нибудь поду. Опишем его в конфиге pod-with-nfs.yaml
kind: Pod apiVersion: v1 metadata: name: pod-with-nfs spec: containers: - name: app image: alpine volumeMounts: - name: data mountPath: /mnt/nfs command: ["/bin/sh"] args: volumes: - name: data persistentVolumeClaim: claimName: fileshare
Применяем.
# kubectl apply -f pod-with-nfs.yaml
Затем проверяйте статус запущенного пода.
# kubectl get pod NAME READY STATUS RESTARTS AGE pod-with-nfs 0/1 ContainerCreating 0 80s
У меня он не стартовал. Я решил посмотреть из-за чего.
# kubectl describe pod pod-with-nfsУвидел в самом конце в разделе Messages ошибку:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedMount 4m10s kubelet, kub-node-1 MountVolume.SetUp failed for volume "my-nfs-share" : mount failed: exit status 32 Mounting command: systemd-run Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/3918714a-87eb-4e66-81cb-0f311461f47d/volumes/kubernetes.io~nfs/my-nfs-share --scope -- mount -t nfs 10.1.4.39:/mnt/nfs /var/lib/kubelet/pods/3918714a-87eb-4e66-81cb-0f311461f47d/volumes/kubernetes.io~nfs/my-nfs-share Output: Running scope as unit run-980498.scope. mount: wrong fs type, bad option, bad superblock on 10.1.4.39:/mnt/nfs, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount. helper program) In some cases useful info is found in syslog - try dmesg | tail or so.
Я сразу понял в чем проблема. На ноде, где стартовал под, не были установлены утилиты для работы с nfs. В моем случае система была Centos и я их установил.
# yum install nfs-utils nfs-utils-lib
После этого в течении минуты pod запустился. Зайдем в его консоль и посмотрим, подмонтировалась ли nfs шара.
# kubectl exec -it pod-with-nfs sh
Как видите, все в порядке. Попробуем теперь что-то записать в шару. Снова заходим на под и создаем текстовый файл.
# kubectl exec -it pod-with-nfs sh # echo "test text" >> /mnt/nfs/test.txt
Теперь запустим еще один под и подключим ему этот же pvc. Для этого просто немного изменим предыдущий под, обозвав его pod-with-nfs2.
kind: Pod apiVersion: v1 metadata: name: pod-with-nfs2 spec: containers: - name: app image: alpine volumeMounts: - name: data mountPath: /mnt/nfs command: ["/bin/sh"] args: volumes: - name: data persistentVolumeClaim: claimName: fileshare
Запускаем под и заходим в него.
# kubectl apply -f pod-with-nfs2.yaml # kubectl exec -it pod-with-nfs2 sh # cat /mnt/nfs/test.txt test text
Все в порядке, файл на месте. С внешними хранилищем в Kubernetes закончили. Расскажу дальше, как можно работать с локальными дисками нод, если вы хотите их так же пустить в работу.
Pod nodeAffinity
Next, we need to determine an AWS AvailabilityZone where is our AWS EBS for the Static PV was created:
$ aws ec2 — profile arseniy — region us-east-2 describe-volumes — volume-ids vol-0928650905a2491e2 — query '.AvailabilityZone]' — output textus-east-2a
us-east-2a — okay, then we need to create a pod on a Kubernetes Worker Node in the same AvailabilityZone.
Create a manifest:
apiVersion: v1kind: Podmetadata: name: pv-static-podspec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: failure-domain.beta.kubernetes.io/zone operator: In values: - us-east-2a volumes: - name: pv-static-storage persistentVolumeClaim: claimName: pvc-static containers: - name: pv-static-container image: nginx ports: - containerPort: 80 name: "nginx" volumeMounts: - mountPath: "/usr/share/nginx/html" name: pv-static-storage
As opposed to the Dynamic PVC — here we’ve used the to specify that we want to use a node from the s-east-2a AZ.
Create that pod:
$ kk apply -f pv-pod-stat.yamlpod/pv-static-pod created
Check events:
0s Normal Scheduled Pod Successfully assigned default/pv-static-pod to ip-10–3–47–58.us-east-2.compute.internal0s Normal SuccessfulAttachVolume Pod AttachVolume.Attach succeeded for volume “pv-static”0s Normal Pulling Pod Pulling image “nginx”0s Normal Pulled Pod Successfully pulled image “nginx”0s Normal Created Pod Created container pv-static-container0s Normal Started Pod Started container pv-static-container
Partitions in the pod:
$ kk exec -ti pv-static-pod bashroot@pv-static-pod:/# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTnvme0n1 259:0 0 50G 0 disk|-nvme0n1p1 259:1 0 50G 0 part /etc/hosts`-nvme0n1p128 259:2 0 1M 0 partnvme1n1 259:3 0 50G 0 disk /usr/share/nginx/html
nvme1n1 is mounted, all works.
Контроль доступа
Настройка идентификатора группы хранения (GID) позволяет модулям использовать только один и тот же GID для операций записи. Несоответствие или отсутствие GID приведет к ошибкам определения разрешений. Чтобы уменьшить потребность в координации с пользователями, администраторы могут использовать GID для аннотирования PersistentVolume. Затем GID автоматически добавляется к любому модулю, который использует PersistentVolume.
Используйте аннотацию pv.beta.kubernetes.io/gid как следующий пример:
Когда модуль использует постоянный том с аннотацией GID, аннотированный GID будет применяться ко всем контейнерам модуля таким же образом, как и GID, указанный в контексте безопасности модуля. Каждый GID, полученный из аннотаций PersistentVolume или спецификаций подов, будет применяться к первому процессу, запущенному в каждом контейнере.
Примечание. Когда модуль использует PersistentVolume, GID, связанный с PersistentVolume, не существует в самом ресурсе модуля.
Dynamic PersistentVolumeClaim
Let’s describe a pod which will use our dynamic PVC:
apiVersion: v1kind: Podmetadata: name: pv-dynamic-podspec: volumes: - name: pv-dynamic-storage persistentVolumeClaim: claimName: pvc-dynamic containers: - name: pv-dynamic-container image: nginx ports: - containerPort: 80 name: "nginx" volumeMounts: - mountPath: "/usr/share/nginx/html" name: pv-dynamic-storage
Here:
- : a PVC name which will be requested when a pod will be created
- : mount the pv-dynamic-storage volume to the directory in the pod
Create it:
$ kubectl apply -f pv-pods.yamlpod/pv-dynamic-pod created
Check again our PVC:
$ kubectl get pvc pvc-dynamicNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpvc-dynamic Bound pvc-6d024b40-a239–4c35–8694-f060bd117053 5Gi RWO gp2 21h
Now we can see a new Volume with the ID pvc-6d024b40-a239–4c35–8694-f060bd117053 — check it:
$ kubectl describe pvc pvc-dynamicName: pvc-dynamicNamespace: defaultStorageClass: gp2Status: BoundVolume: pvc-6d024b40-a239–4c35–8694-f060bd117053…Finalizers: [kubernetes.io/pvc-protection]Capacity: 5GiAccess Modes: RWOVolumeMode: FilesystemEvents: <none>Mounted By: pv-dynamic-pod
Check that volume:
$ kubectl describe pv pvc-6d024b40-a239–4c35–8694-f060bd117053Name: pvc-6d024b40-a239–4c35–8694-f060bd117053…StorageClass: gp2Status: BoundClaim: default/pvc-dynamicReclaim Policy: DeleteAccess Modes: RWOVolumeMode: FilesystemCapacity: 5GiNode Affinity:Required Terms:Term 0: failure-domain.beta.kubernetes.io/zone in failure-domain.beta.kubernetes.io/region in Message:Source:Type: AWSElasticBlockStore (a Persistent Disk resource in AWS)VolumeID: aws://us-east-2b/vol-040a5e004876f1a40FSType: ext4Partition: 0ReadOnly: falseEvents: <none>
And the AWS EBS vol-040a5e004876f1a40:
$ aws ec2 — profile arseniy — region us-east-2 describe-volumes — volume-ids vol-040a5e004876f1a40 — output json{“Volumes”: [{“Attachments”: [{“AttachTime”: “2020–07–30T11:08:29.000Z”,“Device”: “/dev/xvdcy”,“InstanceId”: “i-0a3225e9fe7cb7629”,“State”: “attached”,“VolumeId”: “vol-040a5e004876f1a40”,“DeleteOnTermination”: false}],…
Check inside of the pod:
$ kk exec -ti pv-dynamic-pod bashroot@pv-dynamic-pod:/# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTnvme0n1 259:0 0 50G 0 disk|-nvme0n1p1 259:1 0 50G 0 part /etc/hosts`-nvme0n1p128 259:2 0 1M 0 partnvme1n1 259:3 0 5G 0 disk /usr/share/nginx/html
nvme1n1 — here is our partition.
Let’s write some data:
root@pv-dynamic-pod:/# echo Test > /usr/share/nginx/html/index.html
Drop the pod:
$ kk delete pod pv-dynamic-podpod “pv-dynamic-pod” deleted
Re-create it:
$ kubectl apply -f pv-pods.yamlpod/pv-dynamic-pod created
Check the data:
$ kk exec -ti pv-dynamic-pod cat /usr/share/nginx/html/index.htmlTest
Everything is still in its place.
2.2 Описание параметров PVC
- : Режим доступа; описывает права доступа приложений пользователя к ресурсам хранилища.
- RWO: ReadWriteOnce, позволяет монтировать только один узел для чтения и записи;
- ROX: ReadOnlyMany, позволяющий монтировать несколько узлов и использовать их только для чтения;
- RWX: ReadWriteMany, позволяет монтировать несколько узлов для чтения и записи;
- : Размер хранилища запроса ресурса;
- : Режим тома хранилища, укажите имя объекта ресурса StorageClass, PV с определенной категорией могут быть привязаны только к PVC, запрашивающему эту категорию; (динамическое хранилище); конечно, его также можно установить на, PV, которые не установили определенный тип, могут быть связаны (статическое хранилище) только с PVC, которые не запрашивают какой-либо тип.
- : Условия выбора PV, связывание PV может быть выполнено путем сопоставления меток; это также может быть выполненоВыполнить описание метки условия;
3 Жизненный цикл ПВХ
PVC также имеет в общей сложности 4 стадии жизненного цикла: доступный / связанный / освобожденный / неудачный.
- Доступен: статус «Доступен», без привязки к PV;
- Bound: состояние привязки, он был привязан к PV;
- Выпущено: состояние освобождено, связанный PV удален, ресурс освобожден, но не повторно используется кластером;
- Сбой: состояние сбоя, сбой автоматического восстановления ресурсов;
4 Общие команды для PVC
- Создать (yaml way)
- удалять
- Посмотреть все ПВХ
- Посмотреть ПВХ
- смотрите подробности Примечание. Если в определенном пространстве имен, указанная выше команда может быть добавлена
StorageClass
The parameter will set the storage type.
Both PVC and PV must have the same class, otherwise, a PVC will not find a PV, and STATUS of such a PVC will be Pending.
If a PVC has no set — then a default value will be used:
$ kubectl get storageclass -o wideNAME PROVISIONER AGEgp2 (default) kubernetes.io/aws-ebs 65d
During this, if the is not set for a PV — this PV will be crated without class, and our PVC with the default class will not be able to use this PV with the «Cannot bind to requested volume «pvname»: storageClassName does not match» error:
…Events:Type Reason Age From Message — — — — — — — — — — — — -Warning VolumeMismatch 12s (x17 over 4m2s) persistentvolume-controller Cannot bind to requested volume “pvname”: storageClassName does not match…
See documentation and here>>>.
Create a PersistentVolume
In this exercise, you create a hostPath PersistentVolume. Kubernetes supports
hostPath for development and testing on a single-node cluster. A hostPath
PersistentVolume uses a file or directory on the Node to emulate network-attached storage.
In a production cluster, you would not use hostPath. Instead a cluster administrator
would provision a network resource like a Google Compute Engine persistent disk,
an NFS share, or an Amazon Elastic Block Store volume. Cluster administrators can also
use
to set up
dynamic provisioning.
Here is the configuration file for the hostPath PersistentVolume:
The configuration file specifies that the volume is at on the
cluster’s Node. The configuration also specifies a size of 10 gibibytes and
an access mode of , which means the volume can be mounted as
read-write by a single Node. It defines the
for the PersistentVolume, which will be used to bind
PersistentVolumeClaim requests to this PersistentVolume.
Create the PersistentVolume:
View information about the PersistentVolume:
The output shows that the PersistentVolume has a of . This
means it has not yet been bound to a PersistentVolumeClaim.
3.3 Conntrack
Проблемы в могут вести к вылетам подключений и несогласованности сетевого траффика. Коротко говоря, используется ядром Linux для поддержания состояний подключения и логических потоков в системе. Это значит, что если ваше приложение, например, раскрывает внешний IP, и к нему выполняется миллион подключений, то состояние этих подключений и логические потоки отслеживаются в таблице ядра . При этом вполне разумно, что такие таблицы предусматривают жесткие лимиты, и если эти лимиты превышаются, то сеть приходит в беспорядок.
В RHEL лимиты подключений для можно проверить так:
$ sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_maxnet.netfilter.nf_conntrack_count = 167012net.netfilter.nf_conntrack_max = 262144
Create a PersistentVolume
Write a manifest file, let’s call it :
apiVersion: v1kind: PersistentVolumemetadata: name: pv-staticspec: capacity: storage: 5Gi accessModes: - ReadWriteOnce storageClassName: gp2 awsElasticBlockStore: fsType: ext4 volumeID: vol-0928650905a2491e2
Here:
- : storage size
- : access type, here it is the , which means that this PV can be attached to an only one WorkerNode at the same time
- : storage access, see below
- : used device type
- : a filesystem type to be created on this volume
- : an AWS EBS disc ID
Create the PersistentVolume:
$ kubectl apply -f pv-static.yamlpersistentvolume/pv-static created
Check it:
$ kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-static 5Gi RWO Retain Available 69s