Сақтау сыйымдылығын қадағалайтын эфемерлі көлемдер: стероидтардағы EmptyDir

Сақтау сыйымдылығын қадағалайтын эфемерлі көлемдер: стероидтардағы EmptyDir

Кейбір қолданбалар да деректерді сақтауды қажет етеді, бірақ олар қайта іске қосқаннан кейін деректер сақталмайтындығына өте ыңғайлы.

Мысалы, кэштеу қызметтері жедел жадпен шектеледі, бірақ сонымен бірге жалпы өнімділікке аз әсер ететін жедел жадқа қарағанда баяу сақтау үшін сирек қолданылатын деректерді жылжыта алады. Басқа қолданбалар файлдарда параметрлер немесе құпия кілттер сияқты тек оқуға арналған енгізулер болуы мүмкін екенін білуі керек.

Kubernetes қазірдің өзінде бірнеше түрі бар эфемерлік көлемдер, бірақ олардың функционалдығы K8 құрылғыларында жүзеге асырылатын нәрселермен шектеледі.

Эфемерлі CSI көлемдері жеңіл салмақты жергілікті томдарға қолдау көрсету үшін Kubernetes-ті CSI драйверлерімен кеңейтуге мүмкіндік берді. Осылайша қолдануға болады ерікті құрылымдар: параметрлер, құпиялар, сәйкестендіру деректері, айнымалылар және т.б. CSI драйверлері осы Kubernetes мүмкіндігін қолдау үшін өзгертілуі керек, өйткені әдеттегі стандартталған драйверлер жұмыс істемейді деп болжанады - бірақ мұндай көлемдер подкаст үшін таңдалған кез келген түйінде пайдаланылуы мүмкін деп болжанады.

Бұл маңызды хост ресурстарын тұтынатын көлемдер немесе кейбір хосттарда ғана қолжетімді сақтау үшін мәселе болуы мүмкін. Сондықтан Kubernetes 1.19 тұжырымдамалық түрде EmptyDir томдарына ұқсас екі жаңа альфа сынау көлемі мүмкіндіктерін ұсынады:

  • жалпы мақсаттағы эфемерлік көлемдер;

  • CSI сақтау сыйымдылығын қадағалау.

Жаңа тәсілдің артықшылықтары:

  • сақтау жергілікті болуы немесе желі арқылы қосылуы мүмкін;

  • көлемдер қолданба арқылы аспайтын көрсетілген өлшемге ие болуы мүмкін;

  • тұрақты көлемдерді қамтамасыз етуді қолдайтын және (сыйымдылықты бақылауды қолдау үшін) қоңырауды жүзеге асыратын кез келген CSI драйверлерімен жұмыс істейді. GetCapacity;

  • драйвер мен параметрлерге байланысты томдарда кейбір бастапқы деректер болуы мүмкін;

  • көлемі бар барлық стандартты операцияларға (суретті жасау, өлшемін өзгерту және т.б.) қолдау көрсетіледі;

  • томдарды модульді немесе көлемнің сипаттамасын қабылдайтын кез келген қолданба контроллерімен пайдалануға болады;

  • Kubernetes жоспарлаушысы қолайлы түйіндерді өзі таңдайды, сондықтан жоспарлаушы кеңейтімдерін қамтамасыз ету және конфигурациялау немесе веб-ілмектерді өзгерту қажет емес.

Өтініштер

Сондықтан жалпы мақсаттағы эфемерлі көлемдер келесі пайдалану жағдайлары үшін жарамды:

Memcached үшін жедел жадты ауыстыру ретінде тұрақты жад

memcached соңғы шығарылымдары қосымша қолдау тұрақты жадты пайдалану (Intel Optane және т.б., шамамен. аудармашы) кәдімгі ЖЖҚ орнына. Қолданба контроллері арқылы жад кэштелген қолданбаларды орналастыру кезінде CSI драйверін пайдаланып, берілген өлшемнің көлемін PMEM жүйесінен бөлуді сұрау үшін жалпы мақсаттағы эфемерлі томдарды пайдалана аласыз, мысалы PMEM-CSI.

LVM жергілікті жады жұмыс кеңістігі ретінде

ЖЖҚ көлемінен үлкен деректермен жұмыс істейтін қолданбалар Kubernetes ұсынған тұрақты EmptyDir көлемдері қамтамасыз ете алмайтын өлшем немесе өнімділік көрсеткіштері бар жергілікті жадты қажет етуі мүмкін. Мысалы, осы мақсатта жазылған TopoLVM.

Деректер көлеміне тек оқуға рұқсат

Томды бөлу келесі жағдайларда толық томды жасауға әкелуі мүмкін:

Бұл томдарды тек оқуға арналған режимде орнатуға болады.

Бұл қалай жұмыс істейді

Жалпы мақсаттағы эфемерлік томдар

Жалпы мақсаттағы эфемерлі томдардың негізгі ерекшелігі жаңа көлем көзі болып табылады, EphemeralVolumeSource, көлем сұрауын жасау үшін барлық өрістерді қамтитын (тарихи түрде тұрақты көлем сұрауы, PVC деп аталады). Жаңа контроллер kube-controller-manager осындай көлем көзін жасайтын бөтелкелерге қарайды, содан кейін сол бөтелкелер үшін ПВХ жасайды. CSI драйвері үшін бұл сұрау басқаларға ұқсайды, сондықтан мұнда арнайы қолдау қажет емес.

Мұндай ПВХ бар болғанша, оларды көлемдегі кез келген басқа сұраулар сияқты пайдалануға болады. Атап айтқанда, оларға томды көшіру немесе томнан суретті жасау кезінде деректер көзі ретінде сілтеме жасауға болады. ПВХ нысаны сонымен қатар көлемнің ағымдағы күйін қамтиды.

Автоматты түрде жасалған ПВХ атаулары алдын ала анықталған: олар сызықшамен бөлінген подкаст атауы мен том атауының тіркесімі. Алдын ала анықталған атаулар ПВХ-мен өзара әрекеттесуді жеңілдетеді, себебі подвод атауы мен том атауын білсеңіз, оны іздеудің қажеті жоқ. Кемшілігі - бұл атау бұрыннан қолданыста болуы мүмкін, оны Кубернетес анықтайды және нәтижесінде подкасттың іске қосылуына тыйым салынады.

Дыбыс қосқышпен бірге жойылуын қамтамасыз ету үшін контроллер иесінің астындағы дыбыс деңгейіне сұрау жасайды. Пост жойылған кезде стандартты қоқыс жинау механизмі жұмыс істейді, ол сұрауды да, көлемді де жояды.

Сұраныстарды сақтау драйвері сақтау класының қалыпты механизмі арқылы сәйкестендіреді. Бірден және кеш байланыстырылатын сабақтар (aka WaitForFirstConsumer) қолдау көрсетіледі, эфемерлі томдар үшін оны пайдалану мағынасы бар WaitForFirstConsumer, содан кейін жоспарлаушы түйінді таңдау кезінде түйінді пайдалануды да, сақтаудың қолжетімділігін де қарастыра алады. Мұнда жаңа мүмкіндік пайда болады.

Сақтау сыйымдылығын қадағалау

Әдетте жоспарлаушыда CSI драйвері көлемді қай жерде жасайтынын білмейді. Сондай-ақ жоспарлаушының бұл ақпаратты сұрау үшін жүргізушімен тікелей байланысу мүмкіндігі жоқ. Сондықтан, жоспарлаушы томдарға қол жеткізуге болатын біреуін тапқанша (кеш байлау) немесе орынды таңдауды толығымен драйверге қалдырмайынша (жедел байланыстыру) түйіндерді сұрайды.

жаңа API CSIStorageCapacityальфа сатысында тұрған , жоспарлаушыға қолжетімді болуы үшін қажетті деректерді etcd ішінде сақтауға мүмкіндік береді. Жалпы мақсаттағы эфемерлі томдарға қолдау көрсетуден айырмашылығы, драйверді қолданған кезде жад көлемін бақылауды қосу керек: external-provisioner қалыпты арқылы жүргізушіден алынған сыйымдылық туралы ақпаратты жариялау керек GetCapacity.

Жоспарлағыш кеш байлауды пайдаланатын қосылмаған көлемі бар подколь үшін түйінді таңдауы қажет болса және жалаушаны орнату арқылы жалаушаны орнату арқылы драйвер бұл мүмкіндікті қосса CSIDriver.storageCapacity, содан кейін сақтау сыйымдылығы жеткіліксіз түйіндер автоматты түрде жойылады. Бұл жалпы мақсаттағы эфемерлі және тұрақты томдар үшін де жұмыс істейді, бірақ CSI эфемерлі томдары үшін емес, өйткені олардың параметрлерін Кубернетес оқи алмайды.

Әдеттегідей, тікелей байланыстырылған томдар подкладкалар жоспарланғанға дейін жасалады және олардың орналасуын сақтау драйвері таңдайды, сондықтан конфигурациялау кезінде external-provisioner Әдепкі бойынша, дереу байланыстыруы бар сақтау сыныптары өткізіліп жіберіледі, себебі бұл деректер бәрібір пайдаланылмайды.

Kubernetes жоспарлаушысы ықтимал ескірген ақпаратпен жұмыс істеуге мәжбүр болғандықтан, көлем жасалған кез келген жағдайда сыйымдылық қолжетімді болатынына кепілдік жоқ, бірақ оның қайталанусыз жасалу мүмкіндігі соған қарамастан артады.

NB Сіз толығырақ ақпарат ала аласыз, сондай-ақ «мысықтар стендінде жаттығу» жасай аласыз, ал мүлдем түсініксіз жағдай туындаған жағдайда, қарқынды курстарда білікті техникалық көмек ала аласыз - Кубернетес базасы 28-30 қыркүйекте өтеді, ал одан да жоғары мамандар үшін Kubernetes Mega 14–16 қазан.

Қауіпсіздік

CSIStorageCapacity

CSIStorageCapacity нысандары аттар кеңістігінде орналасады; әрбір CSI драйверін өз аттар кеңістігінде шығарған кезде, деректердің қайдан келетіні анық болғандықтан, сол кеңістікте CSIStorageCapacity үшін RBAC құқықтарын шектеу ұсынылады. Кубернетес мұны бәрібір тексермейді және әдетте драйверлер бірдей аттар кеңістігіне қойылады, сондықтан ақыр соңында драйверлер жұмыс істейді және дұрыс емес деректерді жарияламайды (және бұл жерде менің картам сәтсіз болды, шамамен. сақалды әзілге негізделген аудармашы)

Жалпы мақсаттағы эфемерлік томдар

Пайдаланушылардың подкаст жасау құқықтары болса (тікелей немесе жанама), олар томға сұрау жасауға құқықтары болмаса да, жалпы мақсаттағы эфемерлік томдарды жасай алады. Себебі RBAC рұқсат тексерулері пайдаланушыға емес, ПВХ жасайтын контроллерге қолданылады. Бұл қосылатын негізгі өзгеріс есептік жазбаңызға, сенімсіз пайдаланушылардың том жасау құқықтары болмауы керек кластерлерде бұл мүмкіндікті қосу алдында.

Мысал:

Бөлек шырша PMEM-CSI альфа кезеңіндегі барлық мүмкіндіктері бар QEMU виртуалды машиналарында Kubernetes 1.19 кластерін іске қосу үшін барлық қажетті өзгерістерді қамтиды. Драйвер коды өзгерген жоқ, тек орналастыру өзгерді.

Сәйкес компьютерде (Linux, қалыпты пайдаланушы пайдалана алады Докер, қараңыз осында мәліметтер) бұл пәрмендер кластерді шығарады және 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

пікір қалдыру