ความจุติดตามไดรฟ์ข้อมูลชั่วคราว: EmptyDir บนเตียรอยด์

ความจุติดตามไดรฟ์ข้อมูลชั่วคราว: EmptyDir บนเตียรอยด์

แอปพลิเคชั่นบางตัวจำเป็นต้องจัดเก็บข้อมูลด้วย แต่ก็ค่อนข้างสบายใจที่ข้อมูลจะไม่ถูกบันทึกหลังจากรีสตาร์ท

ตัวอย่างเช่น บริการแคชถูกจำกัดโดย RAM แต่ยังสามารถย้ายข้อมูลที่ไม่ค่อยได้ใช้ไปยังที่จัดเก็บข้อมูลที่ช้ากว่า RAM โดยมีผลกระทบเพียงเล็กน้อยต่อประสิทธิภาพโดยรวม แอปพลิเคชันอื่นๆ จำเป็นต้องทราบว่าอาจมีอินพุตแบบอ่านอย่างเดียวในไฟล์ เช่น การตั้งค่าหรือคีย์ลับ

Kubernetes มีหลายประเภทอยู่แล้ว ปริมาณชั่วคราวแต่ฟังก์ชันการทำงานจะจำกัดเฉพาะสิ่งที่นำมาใช้ใน K8

ชั่วคราว ปริมาณของ CSI อนุญาตให้ Kubernetes ขยายด้วยไดรเวอร์ CSI เพื่อให้การสนับสนุนสำหรับวอลุ่มโลคัลแบบ light ด้วยวิธีนี้ก็สามารถใช้งานได้ โครงสร้างตามอำเภอใจ: การตั้งค่า ข้อมูลลับ ข้อมูลประจำตัว ตัวแปร และอื่นๆ ต้องแก้ไขไดรเวอร์ CSI เพื่อรองรับฟีเจอร์ Kubernetes นี้ เนื่องจากสันนิษฐานว่าไดรเวอร์มาตรฐานทั่วไปจะไม่ทำงาน แต่สันนิษฐานว่าสามารถใช้โวลุ่มดังกล่าวบนโหนดใดก็ได้ที่เลือกสำหรับพ็อด

นี่อาจเป็นปัญหาสำหรับไดรฟ์ข้อมูลที่ใช้ทรัพยากรโฮสต์ที่สำคัญหรือสำหรับการจัดเก็บที่มีอยู่ในบางโฮสต์เท่านั้น นั่นเป็นสาเหตุที่ Kubernetes 1.19 แนะนำฟีเจอร์วอลุ่มการทดสอบอัลฟ่าใหม่สองฟีเจอร์ซึ่งมีแนวคิดคล้ายกับวอลุ่ม EmptyDir:

  • ปริมาตรชั่วคราวสำหรับวัตถุประสงค์ทั่วไป

  • การติดตามความจุของ CSI

ข้อดีของแนวทางใหม่:

  • ที่เก็บข้อมูลสามารถอยู่ในเครื่องหรือเชื่อมต่อผ่านเครือข่าย

  • ไดรฟ์ข้อมูลสามารถมีขนาดที่ระบุซึ่งแอปพลิเคชันไม่สามารถเกินได้

  • ทำงานร่วมกับไดรเวอร์ CSI ใดๆ ที่รองรับการจัดเตรียมวอลุ่มถาวร และ (เพื่อรองรับการติดตามความจุ) ใช้งานการโทร GetCapacity;

  • ไดรฟ์ข้อมูลอาจมีข้อมูลเริ่มต้นบางส่วนขึ้นอยู่กับไดรเวอร์และการตั้งค่า

  • รองรับการทำงานมาตรฐานทั้งหมดด้วยโวลุ่ม (การสร้างสแน็ปช็อต การปรับขนาด ฯลฯ)

  • สามารถใช้วอลุ่มกับแอปพลิเคชันคอนโทรลเลอร์ใดๆ ที่ยอมรับข้อกำหนดโมดูลหรือวอลุ่ม

  • ตัวกำหนดเวลาของ Kubernetes จะเลือกโหนดที่เหมาะสมด้วยตัวเอง ดังนั้นจึงไม่จำเป็นต้องจัดเตรียมและกำหนดค่าส่วนขยายของตัวกำหนดเวลาหรือแก้ไข webhook อีกต่อไป

แอพพลิเคชั่น

ดังนั้น ปริมาตรชั่วคราวสำหรับวัตถุประสงค์ทั่วไปจึงเหมาะสำหรับกรณีการใช้งานต่อไปนี้:

หน่วยความจำถาวรเพื่อทดแทน RAM สำหรับ memcached

รุ่นล่าสุดของ memcached เพิ่มการสนับสนุน ใช้หน่วยความจำถาวร (Intel Optane ฯลฯ ประมาณ นักแปล) แทน RAM ปกติ เมื่อปรับใช้ memcached ผ่านตัวควบคุมแอปพลิเคชัน คุณสามารถใช้วอลลุมชั่วคราวเพื่อวัตถุประสงค์ทั่วไปเพื่อขอให้จัดสรรวอลลุมตามขนาดที่กำหนดจาก PMEM โดยใช้ไดรเวอร์ CSI เป็นต้น PMEM-CSI.

ที่เก็บข้อมูลภายในเครื่อง LVM เป็นพื้นที่ทำงาน

แอปพลิเคชันที่ทำงานกับข้อมูลที่มีขนาดใหญ่กว่า RAM อาจต้องใช้พื้นที่จัดเก็บในเครื่องที่มีขนาดหรือตัววัดประสิทธิภาพที่วอลุ่ม EmptyDir จาก Kubernetes ไม่สามารถให้ได้ ตัวอย่างเช่นเพื่อจุดประสงค์นี้จึงเขียนขึ้น โทโปแอลวีเอ็ม.

การเข้าถึงปริมาณข้อมูลในระดับอ่านอย่างเดียว

การจัดสรรวอลุ่มอาจส่งผลให้เกิดการสร้างวอลุ่มเต็มเมื่อ:

วอลุ่มเหล่านี้สามารถติดตั้งได้ในโหมดอ่านอย่างเดียว

Какэтоработает

วัตถุประสงค์ทั่วไป เล่มชั่วคราว

คุณลักษณะสำคัญของวอลุ่มชั่วคราวสำหรับวัตถุประสงค์ทั่วไปคือแหล่งที่มาของวอลุ่มใหม่ EphemeralVolumeSourceซึ่งมีฟิลด์ทั้งหมดสำหรับสร้างคำขอวอลุ่ม (ในอดีตเรียกว่าคำขอวอลุ่มถาวร, PVC) คอนโทรลใหม่เข้าแล้ว kube-controller-manager ดูที่พ็อดที่สร้างแหล่งปริมาตร จากนั้นจึงสร้าง PVC สำหรับพ็อดเหล่านั้น สำหรับไดรเวอร์ CSI คำขอนี้มีลักษณะเหมือนกับคำขออื่นๆ ดังนั้นจึงไม่จำเป็นต้องมีการสนับสนุนพิเศษที่นี่

ตราบใดที่ยังมี PVC อยู่ ก็สามารถนำมาใช้ได้เหมือนกับคำขออื่นๆ บนวอลุ่ม โดยเฉพาะอย่างยิ่ง สามารถอ้างอิงเป็นแหล่งข้อมูลได้เมื่อคัดลอกวอลลุมหรือสร้างสแน็ปช็อตจากวอลลุม วัตถุ PVC ยังมีสถานะปัจจุบันของไดรฟ์ข้อมูลด้วย

ชื่อของ PVC ที่สร้างขึ้นโดยอัตโนมัติได้รับการกำหนดไว้ล่วงหน้าแล้ว โดยเป็นการผสมผสานระหว่างชื่อพ็อดและชื่อวอลุ่ม โดยคั่นด้วยเครื่องหมายยัติภังค์ ชื่อที่กำหนดไว้ล่วงหน้าช่วยให้โต้ตอบกับ PVC ได้ง่ายขึ้น เนื่องจากคุณไม่จำเป็นต้องค้นหาหากคุณทราบชื่อพ็อดและชื่อวอลุ่ม ข้อเสียคือชื่ออาจมีการใช้งานอยู่แล้ว ซึ่ง Kubernetes ตรวจพบ และเป็นผลให้พ็อดถูกบล็อกไม่ให้เริ่มทำงาน

เพื่อให้แน่ใจว่าวอลลุมถูกลบไปพร้อมกับพ็อด คอนโทรลเลอร์จะส่งคำขอไปยังวอลลุมภายใต้เจ้าของ เมื่อพ็อดถูกลบ กลไกการรวบรวมขยะมาตรฐานจะทำงาน ซึ่งจะลบทั้งคำขอและวอลุ่ม

คำขอจะถูกจับคู่โดยไดรเวอร์การจัดเก็บข้อมูลผ่านกลไกปกติของคลาสการจัดเก็บข้อมูล แม้ว่าชั้นเรียนจะมีผลผูกพันทันทีและล่าช้า (aka WaitForFirstConsumer) ได้รับการสนับสนุน สำหรับไดรฟ์ข้อมูลชั่วคราวก็สมเหตุสมผลที่จะใช้ WaitForFirstConsumerจากนั้นตัวกำหนดเวลาสามารถพิจารณาทั้งการใช้งานโหนดและความพร้อมใช้งานของพื้นที่เก็บข้อมูลเมื่อเลือกโหนด คุณลักษณะใหม่ปรากฏที่นี่

การติดตามความจุของพื้นที่เก็บข้อมูล

โดยทั่วไปแล้วผู้จัดกำหนดการจะไม่รู้ว่าโปรแกรมควบคุม CSI จะสร้างไดรฟ์ข้อมูลจากที่ใด นอกจากนี้ ผู้จัดกำหนดการไม่สามารถติดต่อกับคนขับโดยตรงเพื่อขอข้อมูลนี้ได้ ดังนั้น ตัวกำหนดตารางเวลาจะสำรวจโหนดจนกว่าจะพบโหนดที่สามารถเข้าถึงไดรฟ์ข้อมูลได้ (การรวมล่าช้า) หรือปล่อยให้การเลือกตำแหน่งทั้งหมดเป็นหน้าที่ของไดรเวอร์ (การรวมทันที)

ใหม่ API CSIStorageCapacityซึ่งอยู่ในระยะอัลฟ่า อนุญาตให้จัดเก็บข้อมูลที่จำเป็นใน etcd เพื่อให้ผู้กำหนดตารางเวลาพร้อมใช้งาน ต่างจากการสนับสนุนวอลุ่มชั่วคราวเพื่อวัตถุประสงค์ทั่วไป เมื่อคุณปรับใช้ไดรเวอร์ คุณต้องเปิดใช้งานการติดตามความจุของพื้นที่เก็บข้อมูล: external-provisioner ควรเผยแพร่ข้อมูลความจุที่ได้รับจากผู้ขับขี่ตามปกติ GetCapacity.

หากผู้จัดกำหนดการจำเป็นต้องเลือกโหนดสำหรับพ็อดที่มีไดรฟ์ข้อมูลที่ไม่ได้ผูกไว้ซึ่งใช้การรวมล่าช้า และไดรเวอร์เปิดใช้งานคุณลักษณะนี้ในระหว่างการปรับใช้โดยการตั้งค่าสถานะ CSIDriver.storageCapacityจากนั้นโหนดที่มีความจุไม่เพียงพอจะถูกละทิ้งโดยอัตโนมัติ วิธีนี้ใช้ได้กับทั้งไดรฟ์ข้อมูลชั่วคราวและถาวรเพื่อวัตถุประสงค์ทั่วไป แต่ไม่ใช่สำหรับไดรฟ์ข้อมูลชั่วคราวของ CSI เนื่องจาก Kubernetes ไม่สามารถอ่านพารามิเตอร์ได้

ตามปกติ วอลลุมที่เชื่อมโยงทันทีจะถูกสร้างขึ้นก่อนที่จะกำหนดเวลาพ็อด และไดรเวอร์การจัดเก็บข้อมูลจะเลือกตำแหน่ง ดังนั้นเมื่อกำหนดค่า external-provisioner ตามค่าเริ่มต้น คลาสพื้นที่เก็บข้อมูลที่มีการเชื่อมโยงทันทีจะถูกข้าม เนื่องจากข้อมูลนี้จะไม่ถูกนำไปใช้ต่อไป

เนื่องจากตัวกำหนดเวลา kubernetes ถูกบังคับให้ทำงานกับข้อมูลที่อาจล้าสมัย จึงไม่มีการรับประกันว่าความจุจะพร้อมใช้งานในทุกกรณีเมื่อมีการสร้างไดรฟ์ข้อมูล แต่โอกาสที่จะสร้างไดรฟ์ข้อมูลโดยไม่ต้องลองใหม่จะยังคงเพิ่มขึ้น

NB คุณสามารถรับข้อมูลโดยละเอียดเพิ่มเติมได้ เช่นเดียวกับ "ฝึกยืนบนแท่นแมว" อย่างปลอดภัย และในกรณีที่สถานการณ์ไม่สามารถเข้าใจได้โดยสิ้นเชิง สามารถรับความช่วยเหลือสนับสนุนด้านเทคนิคที่มีคุณสมบัติเหมาะสมในหลักสูตรเร่งรัด - ฐาน Kubernetes จะจัดขึ้นในวันที่ 28-30 กันยายน และสำหรับผู้เชี่ยวชาญขั้นสูงเพิ่มเติม Kubernetes เมกะ 14–16 ตุลาคม

ความปลอดภัย

CSISความจุการจัดเก็บ

ออบเจ็กต์ CSIStorageCapacity อยู่ในเนมสเปซ เมื่อเปิดตัวไดรเวอร์ CSI แต่ละตัวในเนมสเปซของตัวเอง ขอแนะนำให้จำกัดสิทธิ์ RBAC ให้กับ CSIStorageCapacity ในพื้นที่นั้น เนื่องจากเห็นได้ชัดว่าข้อมูลมาจากไหน Kubernetes จะไม่ตรวจสอบสิ่งนี้อยู่ดี และโดยปกติแล้วไดรเวอร์จะอยู่ในเนมสเปซเดียวกัน ดังนั้นท้ายที่สุดแล้วไดรเวอร์จะต้องทำงานและไม่เผยแพร่ข้อมูลที่ไม่ถูกต้อง (และนี่คือจุดที่การ์ดของฉันล้มเหลว ประมาณ นักแปลจากเรื่องตลกมีหนวดมีเครา)

วัตถุประสงค์ทั่วไป เล่มชั่วคราว

หากผู้ใช้มีสิทธิ์สร้างพ็อด (ทางตรงหรือทางอ้อม) พวกเขาจะสามารถสร้างวอลลุมชั่วคราวสำหรับวัตถุประสงค์ทั่วไปได้ แม้ว่าพวกเขาจะไม่มีสิทธิ์สร้างคำขอบนวอลลุมก็ตาม เนื่องจากการตรวจสอบสิทธิ์ RBAC จะใช้กับคอนโทรลเลอร์ที่สร้าง PVC ไม่ใช่กับผู้ใช้ นี่คือการเปลี่ยนแปลงหลักที่จะเพิ่ม ไปยังบัญชีของคุณก่อนที่จะเปิดใช้งานคุณสมบัตินี้บนคลัสเตอร์ที่ผู้ใช้ที่ไม่น่าเชื่อถือไม่ควรมีสิทธิ์ในการสร้างวอลุ่ม

ตัวอย่าง

แยก สาขา PMEM-CSI มีการเปลี่ยนแปลงที่จำเป็นทั้งหมดเพื่อเรียกใช้คลัสเตอร์ Kubernetes 1.19 ภายในเครื่องเสมือน QEMU พร้อมฟีเจอร์ทั้งหมดในระยะอัลฟ่า รหัสไดรเวอร์ไม่เปลี่ยนแปลง มีเพียงการปรับใช้เท่านั้นที่เปลี่ยนแปลง

บนเครื่องที่เหมาะสม (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

เจ้าของพีวีซี - ภายใต้:

$ 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 ไม่ว่ากรณีใด ๆ.

ทำอะไรต่อไป

คุณสมบัติทั้งสองยังอยู่ในการพัฒนา มีการเปิดแอปพลิเคชันหลายรายการในระหว่างการทดสอบอัลฟ่า ลิงก์ข้อเสนอการปรับปรุงบันทึกงานที่ต้องทำเพื่อก้าวไปสู่ขั้นเบต้า รวมถึงทางเลือกอื่นที่ได้รับการพิจารณาและปฏิเสธแล้ว:

ที่มา: will.com

เพิ่มความคิดเห็น