Сактоо сыйымдуулугуна көз салуу менен Эфемердик көлөмдөр: Стероиддерде EmptyDir

Сактоо сыйымдуулугуна көз салуу менен Эфемердик көлөмдөр: Стероиддерде EmptyDir

Кээ бир тиркемелер да маалыматтарды сакташы керек, бирок алар кайра күйгүзгөндөн кийин маалыматтар сакталбай тургандыгы менен абдан ыңгайлуу.

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

Kubernetes мурунтан эле бир нече түрү бар эфемердик көлөмдөр, бирок алардын функционалдуулугу K8s ишке ашырылган нерселер менен чектелет.

Эфемердик CSI көлөмү Жеңил жергиликтүү көлөмдөрдү колдоо үчүн Kubernetesти CSI драйверлери менен кеңейтүүгө мүмкүндүк берди. Ушундай жол менен колдонууга болот ыктыярдуу структуралар: орнотуулар, сырлар, идентификациялык маалыматтар, өзгөрмөлөр ж.б.у.с. CSI драйверлери бул Kubernetes функциясын колдоо үчүн өзгөртүлүшү керек, анткени кадимки стандартташтырылган драйверлер иштебейт деп болжолдонууда - бирок мындай көлөмдөрдү подколь үчүн тандалган каалаган түйүндө колдонсо болот деп болжолдонууда.

Бул олуттуу хост ресурстарын керектеген көлөмдөр үчүн же кээ бир хосттордо гана жеткиликтүү сактоо үчүн көйгөй болушу мүмкүн. Мына ошондуктан Kubernetes 1.19 концептуалдык жактан EmptyDir томдоруна окшош альфа тестирлөө көлөмүнүн эки жаңы өзгөчөлүгүн сунуштайт:

  • жалпы максаттагы эфемердик көлөмдөр;

  • CSI сактоо сыйымдуулугуна көз салуу.

Жаңы ыкманын артыкчылыктары:

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

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

  • туруктуу көлөмдөрдү камсыздоону колдогон жана (кубаттуулукка көз салууну колдоо үчүн) чалууларды ишке ашыруучу бардык CSI драйверлери менен иштейт GetCapacity;

  • көлөмдө драйверге жана орнотууларга жараша кээ бир баштапкы маалыматтар болушу мүмкүн;

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

  • томдорду модулду же көлөмдүн спецификациясын кабыл алган ар кандай колдонмо контроллери менен колдонсо болот;

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

өтүнмөлөр

Ошентип, жалпы максаттагы эфемердик көлөмдөр төмөнкүдөй учурларда ылайыктуу:

Memcached үчүн RAM үчүн алмаштыруу катары туруктуу эс

memcached акыркы релиздери кошумча колдоо туруктуу эс тутумун колдонуу (Intel Optane ж.б., болжол менен котормочу) кадимки RAM ордуна. Колдонмо контроллери аркылуу memcachedди жайылтууда, сиз жалпы максаттагы эфемердик томдорду колдонсоңуз болот, мисалы, CSI драйверин колдонуп, берилген өлчөмдөгү көлөмдү PMEMден бөлүштүрүүнү сурансаңыз болот. PMEM-CSI.

LVM жергиликтүү сактагычы иш мейкиндиги катары

RAMдан чоңураак берилиштер менен иштеген тиркемелер Кубернетестин кадимки EmptyDir көлөмдөрү камсыз кыла албаган өлчөмдөгү же аткаруу көрсөткүчтөрү менен жергиликтүү сактоону талап кылышы мүмкүн. Мисалы, ушул максатта жазылган TopoLVM.

Маалымат көлөмүн окуу үчүн гана мүмкүнчүлүк

Томду бөлүштүрүү төмөнкү учурларда толук томду түзүүгө алып келиши мүмкүн:

Бул томдорду окуу үчүн гана режиминде орнотсо болот.

Бул кандай иштейт

Жалпы максаттагы эфемердик томдор

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

Мындай PVC бар болсо, алар көлөмдөгү башка суроо-талаптар сыяктуу колдонсо болот. Атап айтканда, алар томду көчүрүп жатканда же томдон сүрөттү түзүүдө маалымат булагы катары кайрылса болот. ПВХ объекти да көлөмүнүн учурдагы абалын камтыйт.

Автоматтык түрдө түзүлгөн ПВХ аталыштары алдын ала аныкталган: алар тире менен бөлүнгөн поддон аталышынын жана томдун аталышынын айкалышы. Алдын ала аныкталган аталыштар ПВХ менен өз ара аракеттенүүнү жеңилдетет, анткени поддондун атын жана томдун атын билсеңиз, аны издөөнүн кереги жок. Жаман жагы - бул ысым мурунтан эле колдонулуп жаткан болушу мүмкүн, аны Kubernetes аныктайт жана натыйжада подкасттын башталышына бөгөт коюлган.

Көлөмү менен кошо жок кылынышын камсыз кылуу үчүн контроллер ээсинин астындагы көлөмгө суроо-талап кылат. Капчыгы жок кылынганда, стандарттуу таштанды чогултуу механизми иштейт, ал суроону да, көлөмдү да жок кылат.

Сурамдар сактоочу класстын кадимки механизми аркылуу сактоочу драйвер тарабынан дал келет. Дароо жана кеч милдеттүү класстар болсо да (ака WaitForFirstConsumer) колдоого алынат, эфемердик томдор үчүн аны колдонуунун мааниси бар WaitForFirstConsumer, анда пландоочу түйүндү тандоодо түйүндүн колдонулушун да, сактагычтын жеткиликтүүлүгүн да карай алат. Бул жерде жаңы функция пайда болот.

Сактагычтын сыйымдуулугуна көз салуу

Адатта пландоочу CSI драйвери көлөмдү кайда түзөрүн билбейт. Пландоочу бул маалыматты талап кылуу үчүн айдоочу менен түз байланыша албайт. Ошондуктан, пландоочу түйүндөрдү сурамжылоодо, ал томдорго жетүүгө боло турган (кеч байлашуу) же жайгашкан жерди тандоону толугу менен драйверге калтырганга чейин (дароо милдеттүү түрдө).

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

Эгерде пландоочуга кеч байланышты колдонуу менен байланыштырылбаган көлөмү бар поддон үчүн түйүн тандоо керек болсо жана драйвер желекти коюу менен бул функцияны иштетүү учурунда иштетсе CSIDriver.storageCapacity, анда жетиштүү сактоо сыйымдуулугу жок түйүндөр автоматтык түрдө жок кылынат. Бул жалпы максаттагы эфемердик жана туруктуу томдор үчүн иштейт, бирок CSI эфемердик томдору үчүн эмес, анткени алардын параметрлерин Kubernetes окуй албайт.

Адаттагыдай эле, дароо байланышкан томдор подкасттар пландаштырылганга чейин түзүлөт жана алардын жайгашуусу сактагыч драйвери тарабынан тандалат, ошондуктан конфигурациялоодо external-provisioner Демейки боюнча, дароо байланыштыруучу сактоо класстары өткөрүлүп жиберилет, анткени бул маалыматтар баары бир колдонулбайт.

Kubernetes пландоочусу потенциалдуу эскирип калган маалымат менен иштөөгө аргасыз болгондуктан, көлөм түзүлгөндө кубаттуулук ар бир учурда жеткиликтүү болот деген кепилдик жок, бирок анын кайра аракет кылбастан түзүлүү мүмкүнчүлүгү көбөйөт.

NB Сиз кененирээк маалымат ала аласыз, ошондой эле коопсуз "мышыктардын стендинде машыгыңыз", ал эми такыр түшүнүксүз кырдаалда интенсивдүү курстарда квалификациялуу техникалык жардам ала аласыз - Kubernetes базасы 28-30-сентябрда өткөрүлөт жана дагы алдыңкы адистер үчүн Kubernetes Mega 14–16-октябрь.

коопсуздук

CSIStorageCapacity

CSIStorageCapacity объекттери аттар мейкиндигинде жайгашат, ар бир CSI драйверин өзүнүн мейкиндигинде жайылтууда, ал мейкиндикте CSIStorageCapacity үчүн RBAC укуктарын чектөө сунушталат, анткени маалыматтар кайдан келип жатканы анык. Kubernetes баары бир муну текшербейт жана адатта айдоочулар бир эле аттар мейкиндигине коюлат, ошондуктан акырында драйверлер иштеши керек жана туура эмес маалыматтарды жарыялабайт (жана ушул жерде менин картам иштебей калды, болжол менен сакалчан тамашага негизделген котормочу)

Жалпы максаттагы эфемердик томдор

Колдонуучулардын подкастты түзүүгө укуктары болсо (түз же кыйыр түрдө), алар көлөмдө сурам түзүүгө укуктары жок болсо да, жалпы максаттагы эфемердик томдорду түзө алышат. Себеби RBAC уруксат текшерүүлөрү колдонуучуга эмес, PVC түзүүчү контроллерге колдонулат. Бул кошуу үчүн негизги өзгөртүү болуп саналат сиздин эсебиңизге, Ишенимсиз колдонуучулардын томдорду түзүүгө укугу болбошу керек болгон кластерлерде бул функцияны иштетүүдөн мурун.

мисал

Бөлөк бутак 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 объектилери адамдар тарабынан окууга арналбагандыктан, кээ бир иштетүү талап кылынат. Голанг шаблон чыпкалары сактоо класстарын көрсөтөт, бул мисал атын, топологиясын жана сыйымдуулугун көрсөтөт:

$ 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

Түзүлгөндөн кийин, жогорудагы нускамада көрсөтүлгөндөй, бизде азыр кошумча поддон жана PVC бар:

$ 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

PVC ээси - астында:

$ 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 ар кандай учурда.

Кийинкиси эмне?

Эки өзгөчөлүк дагы иштеп чыгууда. Альфа тестирлөө учурунда бир нече тиркемелер ачылган. Жакшыртуу сунушунун шилтемелери бета стадиясына өтүү үчүн аткарылышы керек болгон иштерди, ошондой эле кайсы альтернативалар буга чейин каралып, четке кагылганын документтештирет:

Source: www.habr.com

Комментарий кошуу