Depolama Kapasitesi Takibi ile Geçici Birimler: Steroidlerde EmptyDir

Depolama Kapasitesi Takibi ile Geçici Birimler: Steroidlerde EmptyDir

Bazı uygulamaların da veri depolaması gerekiyor ancak yeniden başlatmanın ardından verilerin kaydedilmeyeceği gerçeğinden oldukça rahatlar.

Örneğin, önbelleğe alma hizmetleri RAM ile sınırlıdır, ancak aynı zamanda nadiren kullanılan verileri RAM'den daha yavaş olan depolamaya taşıyabilir ve bu da genel performans üzerinde çok az etki yaratır. Diğer uygulamaların, dosyalarda ayarlar veya gizli anahtarlar gibi bazı salt okunur girişlerin bulunabileceğinin farkında olması gerekir.

Kubernetes'in zaten çeşitli türleri var geçici hacimlerancak işlevleri K8'lerde uygulananlarla sınırlıdır.

Geçici CSI hacimleri Hafif yerel birimlere destek sağlamak için Kubernetes'in CSI sürücüleriyle genişletilmesine izin verildi. Bu şekilde kullanmak mümkündür keyfi yapılar: ayarlar, sırlar, kimlik verileri, değişkenler vb. Normal standartlaştırılmış sürücülerin çalışmayacağı varsayıldığından, CSI sürücülerinin bu Kubernetes özelliğini destekleyecek şekilde değiştirilmesi gerekir; ancak bu tür birimlerin bölme için seçilen herhangi bir düğümde kullanılabileceği varsayılır.

Bu, önemli miktarda ana bilgisayar kaynaklarını tüketen birimler veya yalnızca bazı ana bilgisayarlarda kullanılabilen depolama için bir sorun olabilir. Bu nedenle Kubernetes 1.19, kavramsal olarak EmptyDir birimlerine benzeyen iki yeni alfa test birimi özelliği sunuyor:

  • genel amaçlı geçici hacimler;

  • CSI depolama kapasitesi takibi.

Yeni yaklaşımın avantajları:

  • depolama yerel olabilir veya bir ağ üzerinden bağlanabilir;

  • hacimler, uygulama tarafından aşılamayan belirli bir boyuta sahip olabilir;

  • kalıcı birimlerin sağlanmasını destekleyen ve (kapasite izlemeyi desteklemek için) çağrıyı uygulayan tüm CSI sürücüleri ile çalışır GetCapacity;

  • birimler, sürücüye ve ayarlara bağlı olarak bazı başlangıç ​​verilerine sahip olabilir;

  • birimle ilgili tüm standart işlemler (anlık görüntü oluşturma, yeniden boyutlandırma vb.) desteklenir;

  • birimler, bir modül veya birim belirtimini kabul eden herhangi bir uygulama denetleyicisiyle kullanılabilir;

  • Kubernetes zamanlayıcı uygun düğümleri kendi başına seçer; böylece zamanlayıcı uzantılarını sağlamaya ve yapılandırmaya veya web kancalarını değiştirmeye artık gerek kalmaz.

uygulamaları

Bu nedenle genel amaçlı geçici hacimler aşağıdaki kullanım durumları için uygundur:

Memcached için RAM'in yerine kalıcı bellek

Memcached'in son sürümleri destek eklendi kalıcı bellek kullanma (Intel Optane vb.), yakl. çevirmen) normal RAM yerine. Memcached'i bir uygulama denetleyicisi aracılığıyla dağıtırken, genel amaçlı geçici birimleri kullanarak belirli bir boyuttaki birimin PMEM'den CSI sürücüsü kullanılarak tahsis edilmesini talep edebilirsiniz. PMEM-CSI.

Çalışma alanı olarak LVM yerel depolama

RAM'den daha büyük verilerle çalışan uygulamalar, Kubernetes'teki normal EmptyDir birimlerinin sağlayamayacağı boyut veya performans ölçümlerine sahip yerel depolama gerektirebilir. Örneğin bu amaçla yazılmıştır. TopoLVM.

Veri birimleri için salt okunur erişim

Bir birimin tahsisi şu durumlarda tam birimin oluşturulmasıyla sonuçlanabilir:

Bu birimler salt okunur modda monte edilebilir.

Bu nasıl çalışıyor

Genel Amaçlı Geçici Birimler

Genel amaçlı geçici birimlerin önemli bir özelliği yeni birim kaynağıdır. EphemeralVolumeSourceBir hacim isteği oluşturmak için tüm alanları içerir (geçmişte kalıcı hacim isteği, PVC olarak adlandırılır). Yeni denetleyici kube-controller-manager Böyle bir hacim kaynağı oluşturan bölmelere bakar ve ardından bu bölmeler için bir PVC oluşturur. CSI sürücüsü için bu istek diğerleriyle aynı görünmektedir, dolayısıyla burada özel bir desteğe gerek yoktur.

Bu tür PVC'ler mevcut olduğu sürece hacimdeki diğer talepler gibi kullanılabilirler. Özellikle, bir birim kopyalanırken veya bir birimden anlık görüntü oluşturulurken bunlara veri kaynağı olarak başvurulabilir. PVC nesnesi ayrıca birimin mevcut durumunu da içerir.

Otomatik olarak oluşturulan PVC'lerin adları önceden tanımlanmıştır: bunlar, kısa çizgiyle ayrılmış olarak bölme adı ve birim adının birleşimidir. Önceden tanımlanmış adlar PVC ile etkileşimi kolaylaştırır çünkü bölme adını ve birim adını biliyorsanız onu aramanıza gerek kalmaz. Dezavantajı ise adın zaten kullanımda olması ve bunun Kubernetes tarafından algılanması ve bunun sonucunda kapsülün başlatılmasının engellenmesidir.

Birimin bölmeyle birlikte silinmesini sağlamak için denetleyici, sahibinin altındaki birime bir istekte bulunur. Pod silindiğinde, hem isteği hem de birimi silen standart çöp toplama mekanizması çalışır.

İstekler, depolama sınıfının normal mekanizması aracılığıyla depolama sürücüsü tarafından eşleştirilir. Her ne kadar anında ve geç bağlanmaya sahip sınıflar (aka WaitForFirstConsumer) destekleniyor, geçici hacimler için kullanılması mantıklıdır WaitForFirstConsumer, daha sonra zamanlayıcı, bir düğüm seçerken hem düğüm kullanımını hem de depolama kullanılabilirliğini dikkate alabilir. Burada yeni bir özellik ortaya çıkıyor.

Depolama Kapasitesi Takibi

Tipik olarak zamanlayıcının CSI sürücüsünün birimi nerede oluşturacağı konusunda hiçbir bilgisi yoktur. Programlayıcının bu bilgiyi talep etmek için doğrudan sürücüyle iletişime geçmesinin de bir yolu yoktur. Bu nedenle, zamanlayıcı, birimlere erişilebilecek olanı bulana kadar (geç bağlama) veya konum seçimini tamamen sürücüye bırakana (hemen bağlama) kadar düğümleri yoklar.

Yeni API CSIStorageCapacityAlfa aşamasında olan , gerekli verilerin zamanlayıcının kullanımına sunulabilmesi için vbd'de saklanmasına olanak tanır. Genel amaçlı geçici birimlere yönelik desteğin aksine, sürücüyü dağıttığınızda depolama kapasitesi izlemeyi etkinleştirmeniz gerekir: external-provisioner Sürücüden alınan kapasite bilgisini normal yolla yayınlamalıdır. GetCapacity.

Zamanlayıcının, geç bağlamayı kullanan, ilişkisiz bir birime sahip bir bölme için bir düğüm seçmesi gerekiyorsa ve sürücü, dağıtım sırasında bayrağı ayarlayarak bu özelliği etkinleştirdiyse CSIDriver.storageCapacity, yeterli depolama kapasitesine sahip olmayan düğümler otomatik olarak atılacaktır. Bu, hem genel amaçlı geçici hem de kalıcı birimler için işe yarar ancak parametreleri Kubernetes tarafından okunamadığı için CSI geçici birimleri için geçerli değildir.

Her zamanki gibi, bölmeler planlanmadan önce hemen bağlantılı birimler oluşturulur ve bunların yerleşimi depolama sürücüsü tarafından seçilir; dolayısıyla yapılandırma sırasında external-provisioner Varsayılan olarak, bu veriler zaten kullanılmayacağından anında bağlama içeren depolama sınıfları atlanır.

Kubernetes zamanlayıcı potansiyel olarak güncel olmayan bilgilerle çalışmaya zorlandığından, birim oluşturulduğunda her durumda kapasitenin mevcut olacağının garantisi yoktur, ancak yeniden denemeden oluşturulma şansı yine de artar.

NB Daha ayrıntılı bilgi alabilir, güvenli bir şekilde "kedi standında pratik yapabilirsiniz" ve tamamen anlaşılmaz bir durum durumunda yoğun kurslarda nitelikli teknik destek yardımı alabilirsiniz - Kubernetes Üssü 28-30 Eylül'de ve daha ileri düzey uzmanlar için yapılacak Kubernetes Mega 14–16 Ekim.

güvenlik

CSISDepolama Kapasitesi

CSIStorageCapacity nesneleri ad alanlarında bulunur; her CSI sürücüsünü kendi ad alanında kullanıma sunarken, verilerin nereden geldiği açık olduğundan, RBAC haklarını o alandaki CSIStorageCapacity ile kısıtlamanız önerilir. Kubernetes bunu zaten kontrol etmiyor ve genellikle sürücüler aynı ad alanına yerleştiriliyor, dolayısıyla sonuçta sürücülerin çalışması ve yanlış veri yayınlamaması bekleniyor (ve kartımın başarısız olduğu yer burası, yaklaşık. sakallı bir şakaya dayanan çevirmen)

Genel Amaçlı Geçici Birimler

Kullanıcıların bir bölme oluşturma hakları varsa (doğrudan veya dolaylı olarak), birimde istek oluşturma hakları olmasa bile genel amaçlı geçici birimler de oluşturabileceklerdir. Bunun nedeni, RBAC izin kontrollerinin kullanıcıya değil, PVC'yi oluşturan denetleyiciye uygulanmasıdır. Bu eklenecek ana değişikliktir hesabınızaGüvenilmeyen kullanıcıların birim oluşturma hakkına sahip olmaması gereken kümelerde bu özelliği etkinleştirmeden önce.

Örnek

kendi şube PMEM-CSI, QEMU sanal makinelerinde bir Kubernetes 1.19 kümesini alfa aşamasındaki tüm özelliklerle çalıştırmak için gerekli tüm değişiklikleri içerir. Sürücü kodu değişmedi, yalnızca dağıtım değişti.

Uygun bir makinede (Linux, normal bir kullanıcı kullanabilir) liman işçisi, Bakmak burada ayrıntılar) bu komutlar kümeyi getirecek ve PMEM-CSI sürücüsünü yükleyecektir:

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

Her şey işe yaradıktan sonra çıktı, kullanım talimatlarını içerecektir:

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 nesnelerinin insanlar tarafından okunması amaçlanmamıştır, bu nedenle bazı işlemler gereklidir. Golang şablon filtreleri depolama sınıflarını gösterecektir; bu örnek adı, topolojiyi ve kapasiteyi gösterecektir:

$ 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

Tek bir nesne aşağıdaki içeriğe sahiptir:

$ 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>

Tek bir genel amaçlı geçici birime sahip bir demo uygulaması oluşturmaya çalışalım. Dosya içeriği 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

Yukarıdaki talimatlarda gösterildiği gibi oluşturduktan sonra artık ek bir bölmemiz ve PVC'miz var:

$ 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 sahibi - altında:

$ 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
...

Beklendiği gibi güncellenen bilgiler 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

Başka bir uygulamanın 26620Mi'den fazlasına ihtiyacı varsa zamanlayıcı bunu dikkate almayacaktır. pmem-csi-pmem-govm-worker1 her halükârda.

Sırada ne var?

Her iki özellik de halen geliştirilme aşamasındadır. Alfa testi sırasında çeşitli uygulamalar açıldı. İyileştirme teklifi bağlantıları, beta aşamasına geçmek için yapılması gereken çalışmaların yanı sıra hangi alternatiflerin halihazırda değerlendirilip reddedildiğini belgelemektedir:

Kaynak: habr.com

Yorum ekle