स्टोरेज क्षमता ट्रॅकिंगसह तात्पुरते खंड: स्टेरॉईड्सवर रिक्त

स्टोरेज क्षमता ट्रॅकिंगसह तात्पुरते खंड: स्टेरॉईड्सवर रिक्त

Некоторым приложениям также нужно хранить данные, но они достаточно спокойно относятся к тому, что данные не будут сохранены после перезапуска.

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

कुबर्नेट्समध्ये आधीपासूनच अनेक प्रकार आहेत क्षणिक खंड, परंतु त्यांची कार्यक्षमता K8 मध्ये लागू केलेल्या गोष्टींपुरती मर्यादित आहे.

क्षणभंगुर тома CSI позволили расширять Kubernetes с помощью драйверов CSI для обеспечения поддержки легковесных локальных томов. Этим способом возможно применять произвольные структуры: настройки, секреты, данные для идентификации, переменные и так далее. CSI драйверы должны быть доработаны для поддержки этой функции Kubernetes, поскольку предполагается, что обычные стандартизированные драйверы не будут работать — но предполагается, что такие тома можно использовать на любом узле, выбранном для пода.

हे व्हॉल्यूमसाठी समस्या असू शकते जे महत्त्वपूर्ण होस्ट संसाधने वापरतात किंवा स्टोरेजसाठी जे काही होस्टवर उपलब्ध आहेत. म्हणूनच Kubernetes 1.19 ने दोन नवीन अल्फा चाचणी व्हॉल्यूम वैशिष्ट्ये सादर केली आहेत जी संकल्पनात्मकपणे EmptyDir व्हॉल्यूम्ससारखी आहेत:

  • सामान्य उद्देश क्षणिक खंड;

  • CSI स्टोरेज क्षमता ट्रॅकिंग.

नवीन पद्धतीचे फायदे:

  • स्टोरेज स्थानिक किंवा नेटवर्कद्वारे कनेक्ट केलेले असू शकते;

  • व्हॉल्यूममध्ये निर्दिष्ट आकार असू शकतो जो अनुप्रयोगाद्वारे ओलांडला जाऊ शकत नाही;

  • कोणत्याही सीएसआय ड्रायव्हर्ससह कार्य करते जे पर्सिस्टंट व्हॉल्यूमच्या तरतुदीला समर्थन देतात आणि (क्षमता ट्रॅकिंगला समर्थन देण्यासाठी) कॉलची अंमलबजावणी करतात GetCapacity;

  • व्हॉल्यूममध्ये ड्रायव्हर आणि सेटिंग्जवर अवलंबून काही प्रारंभिक डेटा असू शकतो;

  • все типовые операции с томом (создание снимка состояния, изменение размера и т.п.) поддерживаются;

  • тома можно использовать с любым контроллером приложений, принимающим спецификацию модуля или тома;

  • планировщик Kubernetes сам выбирает подходящие узлы, поэтому больше не нужно обеспечивать и настраивать расширения планировщика и изменять webhooks.

अर्ज पर्याय

Таким образом эфемерные тома общего назначения подходят для следующих вариантов применения:

मेमकॅशेडसाठी RAM चे बदली म्हणून पर्सिस्टंट मेमरी

मेमकॅशेडचे नवीनतम प्रकाशन समर्थन जोडले पर्सिस्टंट मेमरी वापरणे (Intel Optane इ., अंदाजे अनुवादक) नियमित रॅम ऐवजी. ऍप्लिकेशन कंट्रोलरद्वारे मेमकॅशेड डिप्लॉय करताना, तुम्ही सीएसआय ड्रायव्हरचा वापर करून पीएमईएम कडून दिलेल्या आकाराचा व्हॉल्यूम वाटप करण्याची विनंती करण्यासाठी सामान्य उद्देशाचे क्षणिक खंड वापरू शकता, उदाहरणार्थ PMEM-CSI.

Локальное хранилище LVM в качестве рабочего пространства

Приложения, работающие с данными, размер которых превышает размер оперативной памяти, могут запрашивать локальное хранилище с размером или метриками производительности, которые не могут обеспечить обычные тома EmptyDir от Kubernetes. К примеру, для этой цели был написан TopoLVM.

डेटा व्हॉल्यूमसाठी केवळ-वाचनीय प्रवेश

Выделение тома может привести к созданию заполненного тома при:

हे व्हॉल्यूम केवळ-वाचनीय मोडमध्ये माउंट केले जाऊ शकतात.

या कसे कार्य करते

Эфемерные тома общего назначения

Ключевой особенностью эфемерных томов общего назначения является новый источник тома, EphemeralVolumeSource, व्हॉल्यूम रिक्वेस्ट तयार करण्यासाठी सर्व फील्ड समाविष्टीत आहे (ऐतिहासिकदृष्ट्या पर्सिस्टंट व्हॉल्यूम रिक्वेस्ट, PVC म्हणतात). मध्ये नवीन नियंत्रक kube-controller-manager просматривает поды, создающие такой источник тома, а затем создает PVC для этих подов. Для CSI драйвера этот запрос выглядит так же, как и остальные, поэтому здесь не нужно особенной поддержки.

Пока такие PVC существуют — могут использоваться, как и любые другие запросы на том. В частности они могут быть ссылкой в качестве источника данных при копировании тома или создании снимка с тома. Объект PVC также содержит текущее состояние тома.

स्वयंचलितपणे तयार केलेल्या PVC ची नावे पूर्वनिर्धारित आहेत: ते पॉड नाव आणि व्हॉल्यूम नावाचे संयोजन आहेत, हायफनने विभक्त केले आहेत. पूर्वनिर्धारित नावे PVC शी संवाद साधणे सोपे करतात कारण तुम्हाला पॉडचे नाव आणि व्हॉल्यूमचे नाव माहित असल्यास ते शोधण्याची गरज नाही. नकारात्मक बाजू अशी आहे की हे नाव आधीपासूनच वापरात आहे, जे कुबर्नेट्सने शोधले आहे आणि परिणामी पॉड सुरू होण्यापासून अवरोधित केले आहे.

पॉडसह व्हॉल्यूम हटवला गेला आहे याची खात्री करण्यासाठी, कंट्रोलर मालकाच्या खाली असलेल्या व्हॉल्यूमला विनंती करतो. जेव्हा पॉड हटविला जातो, तेव्हा मानक कचरा संकलन यंत्रणा कार्य करते, जी विनंती आणि आवाज दोन्ही हटवते.

स्टोरेज क्लासच्या सामान्य यंत्रणेद्वारे स्टोरेज ड्रायव्हरद्वारे विनंत्या जुळतात. जरी तात्काळ आणि उशीरा बंधनकारक असलेले वर्ग (उर्फ WaitForFirstConsumer) поддерживаются, для эфемерных томов имеет смысл использовать WaitForFirstConsumer, नंतर शेड्युलर नोड निवडताना नोड वापर आणि स्टोरेज उपलब्धता दोन्ही विचारात घेऊ शकतो. एक नवीन वैशिष्ट्य येथे दिसते.

Отслеживание емкости хранилища

सामान्यत: शेड्युलरला CSI ड्रायव्हर व्हॉल्यूम कोठे तयार करेल याची माहिती नसते. या माहितीची विनंती करण्यासाठी शेड्युलरला थेट ड्रायव्हरशी संपर्क साधण्याचा कोणताही मार्ग नाही. म्हणून, शेड्युलर पोल नोड्स जोपर्यंत त्याला एक व्हॉल्यूम शोधता येत नाही (उशीरा बंधनकारक) किंवा स्थानाची निवड पूर्णपणे ड्रायव्हरवर सोडते (तत्काळ बंधनकारक).

नवीन API CSIStorageCapacity, जे अल्फा स्टेजमध्ये आहे, आवश्यक डेटा etcd मध्ये संग्रहित करण्यास अनुमती देते जेणेकरून तो शेड्यूलरसाठी उपलब्ध असेल. सामान्य उद्देशाच्या तात्पुरत्या व्हॉल्यूमच्या समर्थनाच्या विपरीत, जेव्हा तुम्ही ड्रायव्हर तैनात करता, तेव्हा तुम्ही स्टोरेज क्षमता ट्रॅकिंग सक्षम करणे आवश्यक आहे: external-provisioner ड्रायव्हरकडून मिळालेली क्षमता माहिती सामान्य मार्गे प्रकाशित करावी GetCapacity.

Если планировщику надо выбрать узел для пода с непривязанным томом, использующим позднее связывание, а драйвер при развертывании активировал эту функцию устанавливая флаг CSIDriver.storageCapacity, то будут автоматически отброшены узлы, у которых нету достаточно емкости хранилища. Это работает как для эфемерных общего назначения, так и постоянных томов, но не для эфемерных томов CSI, поскольку их параметры не могут быть считаны Kubernetes.

Как обычно, тома с немедленными связыванием создаются перед планированием подов, а их размещение выбирается драйвером хранилища, поэтому при настройке external-provisioner по-умолчанию пропускаются классы хранения с немедленным связыванием, поскольку эти данные все равно не будут использоваться.

kubernetes शेड्युलरला संभाव्य कालबाह्य माहितीसह कार्य करण्यास भाग पाडले जात असल्याने, व्हॉल्यूम तयार केल्यावर प्रत्येक बाबतीत क्षमता उपलब्ध होईल याची कोणतीही हमी नाही, परंतु तरीही पुन्हा प्रयत्न न करता तयार होण्याची शक्यता वाढते.

नो बॉल आपण अधिक तपशीलवार माहिती मिळवू शकता, तसेच सुरक्षितपणे "मांजरींच्या स्टँडवर सराव" करू शकता आणि पूर्णपणे समजण्याजोगे परिस्थिती असल्यास, गहन अभ्यासक्रमांमध्ये पात्र तांत्रिक समर्थन सहाय्य मिळवा - कुबर्नेट्स बेस 28-30 सप्टेंबर रोजी आयोजित केले जाईल आणि अधिक प्रगत तज्ञांसाठी Kubernetes मेगा ऑक्टोबर 14-16.

सुरक्षा

CSISstorage क्षमता

CSIStorageCapacity ऑब्जेक्ट्स नेमस्पेसमध्ये राहतात; प्रत्येक CSI ड्रायव्हरला त्याच्या स्वतःच्या नेमस्पेसमध्ये रोल आउट करताना, डेटा कुठून येत आहे हे स्पष्ट असल्यामुळे त्या जागेतील CSIStorageCapacity ला RBAC अधिकार प्रतिबंधित करण्याची शिफारस केली जाते. Kubernetes तरीही याची तपासणी करत नाही, आणि सामान्यतः ड्रायव्हर्सना त्याच नेमस्पेसमध्ये ठेवले जाते, त्यामुळे शेवटी ड्रायव्हर्सने काम करणे आणि चुकीचा डेटा प्रकाशित न करणे अपेक्षित असते (आणि इथेच माझे कार्ड अयशस्वी झाले, अंदाजे दाढीवाल्या विनोदावर आधारित अनुवादक)

Эфемерные тома общего назначения

Если пользователи имеют права для создания пода (напрямую или опосредованно) — они также смогут создать эфемерные тома общего назначения даже если у них нет прав на создание запроса на том. А все потому, что проверки прав RBAC применяются к контроллеру, который создает PVC, а не к пользователю. Это основное изменение, которое нужно добавить तुमच्या खात्यावर, हे वैशिष्ट्य क्लस्टरवर सक्षम करण्यापूर्वी जेथे अविश्वासू वापरकर्त्यांना व्हॉल्यूम तयार करण्याचे अधिकार नसावेत.

उदाहरण:

वेगळे शाखा PMEM-CSI मध्ये अल्फा स्टेजमधील सर्व वैशिष्ट्यांसह QEMU व्हर्च्युअल मशीनमध्ये Kubernetes 1.19 क्लस्टर चालविण्यासाठी सर्व आवश्यक बदल समाविष्ट आहेत. ड्रायव्हर कोड बदलला नाही, फक्त तैनाती बदलली आहे.

योग्य मशीनवर (लिनक्स, सामान्य वापरकर्ता वापरू शकतो गोदी कामगार, смотрите येथे детали) эти команды поднимут кластер и установят драйвер PMEM-CSI:

git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh

После того, как все отработает, вывод будет содержать инструкции для использования:

The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in.  Alternatively, use kubectl directly with the
following env variable:
   KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config

secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
   cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
   [...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -

Объекты CSIStorageCapacity не подразумевают чтение людьми, так что надо некая обработка. С помощью фильтров шаблона на Golang будут показаны классы хранилищ, в этом примере будут отображены имя, топология и емкость:

$ kubectl get 
        -o go-template='{{range .items}}{{if eq .storageClassName "pmem-csi-sc-late-binding"}}{{.metadata.name}} {{.nodeTopology.matchLabels}} {{.capacity}}
{{end}}{{end}}' 
        csistoragecapacities
csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 30716Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

Отдельный объект имеет такое содержимое:

$ kubectl describe csistoragecapacities/csisc-6cw8j
Name:         csisc-sqdnt
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  storage.k8s.io/v1alpha1
Capacity:     30716Mi
Kind:         CSIStorageCapacity
Metadata:
  Creation Timestamp:  2020-08-11T15:41:03Z
  Generate Name:       csisc-
  Managed Fields:
    ...
  Owner References:
    API Version:     apps/v1
    Controller:      true
    Kind:            StatefulSet
    Name:            pmem-csi-controller
    UID:             590237f9-1eb4-4208-b37b-5f7eab4597d1
  Resource Version:  2994
  Self Link:         /apis/storage.k8s.io/v1alpha1/namespaces/default/csistoragecapacities/csisc-sqdnt
  UID:               da36215b-3b9d-404a-a4c7-3f1c3502ab13
Node Topology:
  Match Labels:
    pmem-csi.intel.com/node:  pmem-csi-pmem-govm-worker1
Storage Class Name:           pmem-csi-sc-late-binding
Events:                       <none>

Давайте попробуем создать демонстрационное приложение с одним эфемерным томом общего назначения. Содержимое файла pmem-app-ephemeral.yaml:

# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app-inline-volume
spec:
  containers:
    - name: my-frontend
      image: intel/pmem-csi-driver-test:v0.7.14
      command: [ "sleep", "100000" ]
      volumeMounts:
      - mountPath: "/data"
        name: my-csi-volume
  volumes:
  - name: my-csi-volume
    ephemeral:
      volumeClaimTemplate:
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 4Gi
          storageClassName: pmem-csi-sc-late-binding

तयार केल्यानंतर, वरील सूचनांमध्ये दर्शविल्याप्रमाणे, आमच्याकडे आता अतिरिक्त पॉड आणि पीव्हीसी आहे:

$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP          NODE                         NOMINATED NODE   READINESS GATES
my-csi-app-inline-volume   1/1     Running   0          6m58s   10.36.0.2   pmem-csi-pmem-govm-worker1   <none>           <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME                                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
my-csi-app-inline-volume-my-csi-volume   Bound    pvc-c11eb7ab-a4fa-46fe-b515-b366be908823   4Gi        RWO            pmem-csi-sc-late-binding   9m21s

पीव्हीसी मालक - अंतर्गत:

$ kubectl get -o yaml pvc/my-csi-app-inline-volume-my-csi-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: pmem-csi.intel.com
    volume.kubernetes.io/selected-node: pmem-csi-pmem-govm-worker1
  creationTimestamp: "2020-08-11T15:44:57Z"
  finalizers:
  - kubernetes.io/pvc-protection
  managedFields:
    ...
  name: my-csi-app-inline-volume-my-csi-volume
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: Pod
    name: my-csi-app-inline-volume
    uid: 75c925bf-ca8e-441a-ac67-f190b7a2265f
...

साठी अपेक्षित अपडेट केलेली माहिती pmem-csi-pmem-govm-worker1:

csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 26620Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

Если другому приложению надо будет больше, чем 26620Mi, планировщик не будет брать в расчет pmem-csi-pmem-govm-worker1 कोणत्याही परिस्थितीत.

पुढील काय आहे?

दोन्ही वैशिष्ट्ये अद्याप विकासात आहेत. अल्फा चाचणी दरम्यान अनेक अनुप्रयोग उघडण्यात आले. सुधारणा प्रस्ताव दुवे बीटा टप्प्यावर जाण्यासाठी आवश्यक असलेल्या कामांचे दस्तऐवजीकरण करतात, तसेच कोणते पर्याय आधीच विचारात घेतले गेले आहेत आणि नाकारले गेले आहेत:

स्त्रोत: www.habr.com

एक टिप्पणी जोडा