Хадгалах багтаамжийг хянах түр зуурын хэмжээ: Стероид дээрх EmptyDir

Хадгалах багтаамжийг хянах түр зуурын хэмжээ: Стероид дээрх EmptyDir

Зарим програмууд нь мөн өгөгдөл хадгалах шаардлагатай байдаг, гэхдээ дахин ачаалсны дараа өгөгдөл хадгалагдахгүй байх нь маш таатай байдаг.

Жишээлбэл, кэшийн үйлчилгээ нь RAM-аар хязгаарлагддаг боловч RAM-аас удаан хадгалахад ховор хэрэглэгддэг өгөгдлийг зөөж, ерөнхий гүйцэтгэлд бага нөлөө үзүүлдэг. Бусад програмууд файлд тохиргоо эсвэл нууц түлхүүр гэх мэт зөвхөн унших боломжтой оролт байж болзошгүйг анхаарах хэрэгтэй.

Kubernetes аль хэдийн хэд хэдэн төрөлтэй түр зуурын хэмжээ, гэхдээ тэдний үйл ажиллагаа нь K8-д хэрэгжсэн зүйлээр хязгаарлагддаг.

Түр зуурын CSI хэмжээ Кубернетесийг CSI драйверуудтай өргөтгөх боломжийг олгосон бөгөөд энэ нь орон нутгийн хөнгөн эзлэхүүнийг дэмжих боломжийг олгосон. Ийм байдлаар ашиглах боломжтой дурын бүтэц: тохиргоо, нууц, таних өгөгдөл, хувьсагч гэх мэт. Ердийн стандартчилагдсан драйверууд ажиллахгүй гэж үздэг тул CSI драйверуудыг Кубернетесийн энэхүү функцийг дэмжихийн тулд өөрчлөх шаардлагатай - гэхдээ ийм эзэлхүүнийг pod-д сонгосон дурын зангилаанд ашиглаж болно гэж үздэг.

Энэ нь ихээхэн хэмжээний хостын нөөцийг ашигладаг эзэлхүүнүүдийн хувьд эсвэл зөвхөн зарим хост дээр байдаг хадгалалтын хувьд асуудал байж болох юм. Тийм ч учраас Kubernetes 1.19 нь EmptyDir-тэй ижил төстэй альфа тестийн эзлэхүүний хоёр шинэ функцийг танилцуулж байна:

  • ерөнхий зориулалтын түр зуурын хэмжээ;

  • CSI хадгалах багтаамжийг хянах.

Шинэ аргын давуу талууд:

  • хадгалах сан нь дотоод эсвэл сүлжээгээр холбогдсон байж болно;

  • хэмжээ нь програмаас хэтрэх боломжгүй тодорхой хэмжээтэй байж болно;

  • Байнгын эзлэхүүний хангамжийг дэмждэг аливаа CSI драйверуудтай ажилладаг ба (хүч чадлын хяналтыг дэмжихийн тулд) дуудлагыг хэрэгжүүлдэг. GetCapacity;

  • боть нь драйвер болон тохиргооноос хамааран зарим анхны өгөгдөлтэй байж болно;

  • эзлэхүүнтэй бүх стандарт үйлдлүүд (агшин зуурын зураг үүсгэх, хэмжээг өөрчлөх гэх мэт) дэмжигддэг;

  • эзлэхүүнийг модуль эсвэл эзлэхүүний тодорхойлолтыг хүлээн авдаг аливаа програмын хянагчтай ашиглаж болно;

  • Kubernetes хуваарь гаргагч нь тохирох зангилаануудыг өөрөө сонгодог тул хуваарийн өргөтгөлүүдийг хангах, тохируулах, вэб дэгээг өөрчлөх шаардлагагүй болсон.

Програмын сонголтууд

Тиймээс ерөнхий зориулалтын түр зуурын хэмжээ нь дараах тохиолдолд тохиромжтой.

Тогтмол санах ой нь memcach-д зориулсан RAM-ийг орлох

memcached-ийн хамгийн сүүлийн хувилбарууд нэмэлт дэмжлэг байнгын санах ой ашиглах (Intel Optane гэх мэт, ойролцоогоор. орчуулагч) ердийн RAM-ийн оронд. Програмын хянагчаар дамжуулан memcach-ийг байрлуулахдаа та ерөнхий зориулалтын түр зуурын эзлэхүүнийг ашиглаж, өгөгдсөн хэмжээний эзлэхүүнийг PMEM-ээс CSI драйвер ашиглан хуваарилахыг хүсэх боломжтой. PMEM-CSI.

LVM локал хадгалах санг ажлын талбар болгон

RAM-аас том хэмжээтэй өгөгдөлтэй ажилладаг програмууд нь Kubernetes-ийн ердийн EmptyDir-н хэмжээ эсвэл гүйцэтгэлийн хэмжүүр бүхий дотоод санах ойг шаардаж болно. Жишээлбэл, энэ зорилгоор үүнийг бичсэн TopoLVM.

Өгөгдлийн хэмжээг зөвхөн унших боломжтой

Эзлэхүүнийг хуваарилах нь дараахь тохиолдолд бүрэн хэмжээний эзлэхүүнийг бий болгоход хүргэдэг.

Эдгээр эзлэхүүнийг зөвхөн унших горимд суулгаж болно.

Яаж энэ ажлыг хийдэг

Ерөнхий зориулалтын түр зуурын боть

Ерөнхий зориулалтын түр зуурын ботьуудын гол онцлог нь шинэ боть эх үүсвэр, EphemeralVolumeSource, эзлэхүүний хүсэлтийг үүсгэх бүх талбаруудыг агуулсан (түүхэнд байнгын эзэлхүүний хүсэлт, PVC гэж нэрлэдэг). Шинэ хянагч орж ирлээ kube-controller-manager ийм эзэлхүүний эх үүсвэрийг бий болгож буй хонхорцогуудыг харж, дараа нь тэдгээр хонхорцогт зориулж PVC үүсгэдэг. CSI драйверын хувьд энэ хүсэлт бусадтай адилхан харагддаг тул энд тусгай дэмжлэг хэрэггүй.

Ийм PVC-ууд байгаа бол тэдгээрийг эзлэхүүн дээрх бусад хүсэлтийн нэгэн адил ашиглаж болно. Ялангуяа, эзлэхүүнийг хуулах эсвэл боть дээрээс хормын хувилбар үүсгэх үед тэдгээрийг мэдээллийн эх сурвалж болгон ашиглаж болно. PVC объект нь эзлэхүүний одоогийн төлөвийг агуулна.

Автоматаар үүсгэгдсэн PVC-ийн нэрсийг урьдчилан тодорхойлсон байдаг: тэдгээр нь хонгилын нэр болон ботьны нэрний хослол бөгөөд зураасаар тусгаарлагдсан байна. Урьдчилан тодорхойлсон нэрс нь PVC-тэй харилцахад хялбар болгодог, учир нь хэрэв та подволкны нэр болон эзлэхүүний нэрийг мэддэг бол үүнийг хайх шаардлагагүй болно. Сул тал нь нэр нь аль хэдийн ашиглагдаж байж болох бөгөөд үүнийг Кубернетес илрүүлсэн бөгөөд үүний үр дүнд подыг эхлүүлэхийг хориглодог.

Эзлэхүүнийг подтой хамт устгасан эсэхийг шалгахын тулд хянагч эзэмшигчийн доор байгаа эзлэхүүн рүү хүсэлт гаргадаг. Подыг устгах үед хог цуглуулах стандарт механизм ажилладаг бөгөөд энэ нь хүсэлт болон эзлэхүүнийг хоёуланг нь устгадаг.

Хүсэлтийг хадгалах ангийн ердийн механизмаар дамжуулан хадгалах драйвер тааруулдаг. Хэдийгээр шууд болон хожуу холболттой ангиуд (aka WaitForFirstConsumer) дэмжигдсэн тул түр зуурын ботьуудын хувьд ашиглах нь утга учиртай WaitForFirstConsumer, дараа нь хуваарилагч зангилааг сонгохдоо зангилааны ашиглалт болон хадгалах боломжтой байдлыг харгалзан үзэж болно. Энд шинэ функц гарч ирнэ.

Хадгалах багтаамжийг хянах

Ихэвчлэн хуваарь гаргагч нь CSI драйвер хаана эзлэхүүнийг үүсгэх талаар ямар ч мэдлэггүй байдаг. Мөн хуваарь гаргагч жолоочтой шууд холбогдож энэ мэдээллийг авах боломжгүй. Тиймээс, хуваарь гаргагч нь боть руу хандах боломжтой нэгийг олох хүртэл (хожуу холболт) эсвэл байршлын сонголтыг бүхэлд нь драйверд үлдээх хүртэл (нэн даруй холбох) цэгүүдийг санал болгодог.

шинэ API CSIStorageCapacity, альфа шатанд байгаа нь шаардлагатай өгөгдлийг etcd-д хадгалах боломжийг олгодог бөгөөд ингэснээр үүнийг төлөвлөгчид ашиглах боломжтой болно. Ерөнхий зориулалтын түр зуурын эзлэхүүний дэмжлэгээс ялгаатай нь та драйверийг байрлуулахдаа хадгалах багтаамжийн хяналтыг идэвхжүүлэх ёстой: external-provisioner жолоочоос хүлээн авсан хүчин чадлын мэдээллийг хэвийн байдлаар нийтлэх ёстой GetCapacity.

Хэрэв хуваарь гаргагч нь хоцрогдсон холболтыг ашигладаг салангид эзэлхүүнтэй pod-д зангилаа сонгох шаардлагатай бол драйвер нь тугийг тохируулж байршуулах явцад энэ функцийг идэвхжүүлсэн бол CSIDriver.storageCapacity, дараа нь хангалттай хадгалах багтаамжгүй зангилаанууд автоматаар устгагдах болно. Энэ нь ерөнхий зориулалтын түр зуурын болон байнгын ботьуудын аль алинд нь ажилладаг боловч CSI түр зуурын ботьуудын хувьд биш, учир нь параметрүүдийг Кубернетес унших боломжгүй.

Ердийнх шиг, нэн даруй холбосон боть нь подкуудыг төлөвлөхөөс өмнө үүсгэгддэг бөгөөд тэдгээрийн байршлыг санах ойн драйвер сонгодог тул тохируулах үед external-provisioner Өгөгдмөл байдлаар, энэ өгөгдлийг ямар ч тохиолдолд ашиглахгүй тул шууд холбогдох хадгалах ангиудыг алгасдаг.

Kubernetes хуваарьлагч нь хуучирсан мэдээлэлтэй ажиллахаас өөр аргагүй тул эзлэхүүнийг үүсгэх үед багтаамжийг ашиглах боломжтой байх баталгаа байхгүй ч дахин оролдлогогүйгээр үүсгэх магадлал нэмэгддэг.

NB Та илүү нарийвчилсан мэдээлэл авахаас гадна "муурны тавцан дээр дадлага хийх" боломжтой бөгөөд бүрэн ойлгомжгүй нөхцөл байдал үүссэн тохиолдолд эрчимжүүлсэн сургалтанд мэргэшсэн техникийн туслалцаа авах боломжтой. Кубернетес бааз 28-р сарын 30-XNUMX-нд болох ба ахисан түвшний мэргэжилтнүүдэд зориулсан Kubernetes Mega 14-р сарын 16-XNUMX.

Аюулгүй байдал

CSIStorageCapacity

CSIStorageCapacity объектууд нэрийн талбарт байрладаг; CSI драйвер бүрийг өөрийн нэрийн талбарт оруулахдаа өгөгдөл хаанаас ирж байгаа нь ойлгомжтой тул тухайн орон зайд CSIStorageCapacity-д RBAC эрхийг хязгаарлахыг зөвлөж байна. Кубернетес үүнийг ямар ч байсан шалгадаггүй бөгөөд ихэвчлэн драйверуудыг ижил нэрийн талбарт оруулдаг тул эцэст нь драйверууд ажиллаж, буруу мэдээлэл нийтлэхгүй байх ёстой (мөн энд миний карт амжилтгүй болсон, ойролцоогоор. сахалтай хошигнол дээр үндэслэсэн орчуулагч)

Ерөнхий зориулалтын түр зуурын боть

Хэрэглэгчид под (шууд болон шууд бус) үүсгэх эрхтэй бол тухайн боть дээр хүсэлт үүсгэх эрхгүй байсан ч ерөнхий зориулалтын түр зуурын боть үүсгэх боломжтой. Учир нь RBAC зөвшөөрлийн шалгалтыг хэрэглэгчдэд бус харин PVC-ийг үүсгэдэг хянагчдад ашигладаг. Энэ бол нэмэх гол өөрчлөлт юм таны дансанд, итгэлгүй хэрэглэгчид эзлэхүүн үүсгэх эрхгүй байх ёстой кластерууд дээр энэ функцийг идэвхжүүлэхийн өмнө.

Жишээ нь:

Тусдаа салбар PMEM-CSI нь альфа үе шатанд байгаа бүх боломжуудтай QEMU виртуал машин дотор Kubernetes 1.19 кластер ажиллуулахад шаардлагатай бүх өөрчлөлтийг агуулдаг. Жолоочийн код өөрчлөгдөөгүй, зөвхөн байршуулалт өөрчлөгдсөн.

Тохиромжтой машин дээр (Linux, энгийн хэрэглэгч ашиглаж болно Docker, хар энд дэлгэрэнгүй) эдгээр тушаалууд нь кластерийг гаргаж ирэх ба 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 ямар ч тохиолдолд.

Дараа нь юу юм бэ?

Энэ хоёр онцлог шинж чанар нь хөгжиж байна. Альфа туршилтын явцад хэд хэдэн програм нээгдсэн. Сайжруулах саналын холбоосууд нь бета шатанд шилжихийн тулд хийх шаардлагатай ажлуудыг баримтжуулж, аль хувилбаруудыг аль хэдийн авч үзэж, татгалзсан болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх