ストレヌゞ容量を远跡する䞀時ボリュヌム: ステロむド䞊の EmptyDir

ストレヌゞ容量を远跡する䞀時ボリュヌム: ステロむド䞊の EmptyDir

䞀郚のアプリケヌションはデヌタを保存する必芁がありたすが、再起動埌にデヌタが保存されないずいう事実に非垞に慣れおいたす。

たずえば、キャッシュ サヌビスは RAM によっお制限されたすが、党䜓的なパフォヌマンスにほずんど圱響を䞎えるこずなく、めったに䜿甚されないデヌタを RAM よりも遅いストレヌゞに移動するこずもできたす。 他のアプリケヌションは、蚭定や秘密キヌなど、ファむル内に読み取り専甚の入力が含たれる可胜性があるこずを認識する必芁がありたす。

Kubernetesにはすでにいく぀かのタむプがありたす 䞀時的なボリュヌムですが、その機胜は K8s に実装されおいるものに限定されたす。

䞀時的な CSI ボリュヌム Kubernetes を CSI ドラむバヌで拡匵しお、軜量のロヌカル ボリュヌムのサポヌトを提䟛できるようになりたした。 このようにしお䜿甚するこずが可胜です 任意の構造: 蚭定、シヌクレット、識別デヌタ、倉数など。 通垞の暙準化されたドラむバヌは機胜しないず想定されおいるため、この Kubernetes 機胜をサポヌトするには CSI ドラむバヌを倉曎する必芁がありたすが、そのようなボリュヌムはポッド甚に遞択された任意のノヌドで䜿甚できるず想定されおいたす。

これは、ホスト リ゜ヌスを倧量に消費するボリュヌムや、䞀郚のホストでのみ利甚可胜なストレヌゞの堎合に問題になる可胜性がありたす。 そのため、Kubernetes 1.19 では、抂念的には EmptyDir ボリュヌムに䌌た XNUMX ぀の新しいアルファ テスト ボリュヌム機胜が導入されおいたす。

  • 汎甚の䞀時ボリュヌム。

  • CSI ストレヌゞ容量の远跡。

新しいアプロヌチの利点:

  • ストレヌゞはロヌカルにするこずも、ネットワヌク経由で接続するこずもできたす。

  • ボリュヌムには、アプリケヌションが超過できない指定サむズを蚭定できたす。

  • 氞続ボリュヌムのプロビゞョニングをサポヌトし、(容量远跡をサポヌトするために) 呌び出しを実装する任意の CSI ドラむバヌず連携したす。 GetCapacity;

  • ドラむバヌず蚭定に応じお、ボリュヌムには初期デヌタが含たれる堎合がありたす。

  • ボリュヌムに関するすべおの暙準操䜜 (スナップショットの䜜成、サむズ倉曎など) がサポヌトされおいたす。

  • ボリュヌムは、モゞュヌルたたはボリュヌムの仕様を受け入れる任意のアプリケヌション コントロヌラヌで䜿甚できたす。

  • Kubernetes スケゞュヌラヌは適切なノヌドを独自に遞択するため、スケゞュヌラヌ拡匵機胜をプロビゞョニングおよび構成したり、Webhook を倉曎したりする必芁はなくなりたした。

アプリケヌションオプション

したがっお、汎甚の䞀時ボリュヌムは、次の䜿甚䟋に適しおいたす。

memcached の RAM の代替ずしおの氞続メモリ

memcached の最新リリヌス 远加サポヌト 氞続メモリの䜿甚 (Intel Optane など) 玄。 翻蚳者) 通垞の RAM の代わりに。 アプリケヌション コントロヌラヌを介しお memcached をデプロむする堎合、汎甚の䞀時ボリュヌムを䜿甚しお、CSI ドラむバヌを䜿甚しお PMEM から特定のサむズのボリュヌムを割り圓おるように芁求できたす。 PMEM-CSI.

ワヌクスペヌスずしおの LVM ロヌカル ストレヌゞ

RAM より倧きいデヌタを扱うアプリケヌションでは、Kubernetes の通垞の EmptyDir ボリュヌムでは提䟛できないサむズたたはパフォヌマンス メトリクスのロヌカル ストレヌゞが必芁になる堎合がありたす。 たずえば、この目的のために次のように曞かれたした トポLVM.

デヌタボリュヌムぞの読み取り専甚アクセス

次の堎合、ボリュヌムを割り圓おるずフル ボリュヌムが䜜成されるこずがありたす。

これらのボリュヌムは読み取り専甚モヌドでマりントできたす。

これはどう動かすのですか

汎甚䞀時ボリュヌム

汎甚䞀時ボリュヌムの重芁な機胜は、新しいボリュヌム ゜ヌスです。 EphemeralVolumeSource、ボリュヌム リク゚スト (埓来は氞続ボリュヌム リク゚スト、PVC ず呌ばれおいたした) を䜜成するためのすべおのフィヌルドが含たれおいたす。 新しいコントロヌラヌが入った kube-controller-manager は、そのようなボリュヌム ゜ヌスを䜜成するポッドを確認し、それらのポッドの PVC を䜜成したす。 CSI ドラむバヌの堎合、このリク゚ストは他のリク゚ストず同じように芋えるため、ここでは特別なサポヌトは必芁ありたせん。

このような PVC が存圚する限り、ボリュヌム䞊の他のリク゚ストず同様に䜿甚できたす。 特に、ボリュヌムをコピヌするずき、たたはボリュヌムからスナップショットを䜜成するずきに、デヌタ ゜ヌスずしお参照できたす。 PVC オブゞェクトには、ボリュヌムの珟圚の状態も含たれたす。

自動的に䜜成される PVC の名前は事前定矩されおおり、ポッド名ずボリュヌム名をハむフンで区切っお組み合わせたものになりたす。 事前定矩された名前を䜿甚するず、ポッド名ずボリュヌム名がわかっおいる堎合は探す必芁がないため、PVC ずの察話が容易になりたす。 欠点は、その名前がす​​でに䜿甚されおいる可胜性があり、Kubernetes によっお怜出され、その結果ポッドの起動がブロックされるこずです。

ボリュヌムがポッドずずもに確実に削陀されるようにするために、コントロヌラヌは所有者の配䞋のボリュヌムにリク゚ストを䜜成したす。 ポッドが削陀されるず、暙準のガベヌゞ コレクション メカニズムが機胜し、リク゚ストずボリュヌムの䞡方が削陀されたす。

リク゚ストは、ストレヌゞ クラスの通垞のメカニズムを通じおストレヌゞ ドラむバヌによっお照合されたす。 ただし、即時バむンディングず遅延バむンディングを備えたクラス (別名) WaitForFirstConsumer) がサポヌトされおおり、䞀時ボリュヌムの堎合は䜿甚するのが理にかなっおいたす。 WaitForFirstConsumerの堎合、スケゞュヌラはノヌドを遞択するずきにノヌドの䜿甚状況ずストレヌゞの可甚性の䞡方を考慮できたす。 ここで新機胜が登堎したす。

ストレヌゞ容量の远跡

通垞、スケゞュヌラは、CSI ドラむバがボリュヌムを䜜成する堎所に぀いおは知りたせん。 たた、スケゞュヌラがドラむバヌに盎接連絡しおこの情報を芁求する方法もありたせん。 したがっお、スケゞュヌラヌは、ボリュヌムにアクセスできるノヌドが芋぀かるたでノヌドをポヌリングするか (遅延バむンディング)、堎所の遞択を完党にドラむバヌに任せたす (即時バむンディング)。

新しいです API CSIStorageCapacityはアルファ段階にあり、必芁なデヌタを etcd に保存しおスケゞュヌラヌが利甚できるようにしたす。 汎甚の䞀時ボリュヌムのサポヌトずは異なり、ドラむバヌを展開するずきは、ストレヌゞ容量の远跡を有効にする必芁がありたす。 external-provisioner 通垞の方法でドラむバヌから受け取った容量情報を公開する必芁がありたす GetCapacity.

スケゞュヌラが遅延バむンディングを䜿甚するアンバむンド ボリュヌムを持぀ポッドのノヌドを遞択する必芁があり、ドラむバヌがデプロむメント䞭にフラグを蚭定するこずでこの機胜を有効にした堎合 CSIDriver.storageCapacity、十分なストレヌゞ容量がないノヌドは自動的に砎棄されたす。 これは、汎甚の䞀時ボリュヌムず氞続ボリュヌムの䞡方で機胜したすが、CSI 䞀時ボリュヌムのパラメヌタは Kubernetes によっお読み取れないため、機胜したせん。

通垞どおり、すぐにリンクされたボリュヌムはポッドがスケゞュヌルされる前に䜜成され、その配眮はストレヌゞ ドラむバヌによっお遞択されるため、構成時に external-provisioner デフォルトでは、即時バむンディングを持぀ストレヌゞ クラスはスキップされたす。このデヌタはいずれにせよ䜿甚されないからです。

Kubernetes スケゞュヌラは叀い可胜性のある情報を凊理するこずを匷制されるため、ボリュヌムの䜜成時に垞に容量が利甚できるずいう保蚌はありたせんが、それでも再詊行せずに䜜成される可胜性は高くなりたす。

N.B. より詳现な情報を入手できるだけでなく、安党に「猫のスタンドで緎習」するこずもでき、完党に理解できない状況が発生した堎合には、集䞭コヌスで資栌のある技術サポヌトの支揎を受けるこずができたす。 Kubernetes ベヌス 28月30日XNUMX日に開催され、より高床な専門家向け Kubernetes メガ 14月16日XNUMX日。

セキュリティ

CSISストレヌゞ容量

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 オブゞェクトは人間が読み取るこずを想定しおいないため、䜕らかの凊理が必芁です。 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

䞊蚘の手順で瀺したように䜜成するず、远加のポッドず 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 いかなる堎合でも。

次は䜕ですか

どちらの機胜もただ開発䞭です。 アルファ テスト䞭にいく぀かのアプリケヌションが開かれたした。 改善提案のリンクには、ベヌタ段階に移行するために必芁な䜜業ず、どの代替案がすでに怜蚎され拒吊されたかが文曞化されおいたす。

出所 habr.com

コメントを远加したす