แอปพลิเคชั่นบางตัวจำเป็นต้องจัดเก็บข้อมูลด้วย แต่ก็ค่อนข้างสบายใจที่ข้อมูลจะไม่ถูกบันทึกหลังจากรีสตาร์ท
ตัวอย่างเช่น บริการแคชถูกจำกัดโดย RAM แต่ยังสามารถย้ายข้อมูลที่ไม่ค่อยได้ใช้ไปยังที่จัดเก็บข้อมูลที่ช้ากว่า RAM โดยมีผลกระทบเพียงเล็กน้อยต่อประสิทธิภาพโดยรวม แอปพลิเคชันอื่นๆ จำเป็นต้องทราบว่าอาจมีอินพุตแบบอ่านอย่างเดียวในไฟล์ เช่น การตั้งค่าหรือคีย์ลับ
Kubernetes มีหลายประเภทอยู่แล้ว
ชั่วคราว
นี่อาจเป็นปัญหาสำหรับไดรฟ์ข้อมูลที่ใช้ทรัพยากรโฮสต์ที่สำคัญหรือสำหรับการจัดเก็บที่มีอยู่ในบางโฮสต์เท่านั้น นั่นเป็นสาเหตุที่ Kubernetes 1.19 แนะนำฟีเจอร์วอลุ่มการทดสอบอัลฟ่าใหม่สองฟีเจอร์ซึ่งมีแนวคิดคล้ายกับวอลุ่ม EmptyDir:
-
ปริมาตรชั่วคราวสำหรับวัตถุประสงค์ทั่วไป
-
การติดตามความจุของ CSI
ข้อดีของแนวทางใหม่:
-
ที่เก็บข้อมูลสามารถอยู่ในเครื่องหรือเชื่อมต่อผ่านเครือข่าย
-
ไดรฟ์ข้อมูลสามารถมีขนาดที่ระบุซึ่งแอปพลิเคชันไม่สามารถเกินได้
-
ทำงานร่วมกับไดรเวอร์ CSI ใดๆ ที่รองรับการจัดเตรียมวอลุ่มถาวร และ (เพื่อรองรับการติดตามความจุ) ใช้งานการโทร
GetCapacity
; -
ไดรฟ์ข้อมูลอาจมีข้อมูลเริ่มต้นบางส่วนขึ้นอยู่กับไดรเวอร์และการตั้งค่า
-
รองรับการทำงานมาตรฐานทั้งหมดด้วยโวลุ่ม (การสร้างสแน็ปช็อต การปรับขนาด ฯลฯ)
-
สามารถใช้วอลุ่มกับแอปพลิเคชันคอนโทรลเลอร์ใดๆ ที่ยอมรับข้อกำหนดโมดูลหรือวอลุ่ม
-
ตัวกำหนดเวลาของ Kubernetes จะเลือกโหนดที่เหมาะสมด้วยตัวเอง ดังนั้นจึงไม่จำเป็นต้องจัดเตรียมและกำหนดค่าส่วนขยายของตัวกำหนดเวลาหรือแก้ไข webhook อีกต่อไป
แอพพลิเคชั่น
ดังนั้น ปริมาตรชั่วคราวสำหรับวัตถุประสงค์ทั่วไปจึงเหมาะสำหรับกรณีการใช้งานต่อไปนี้:
หน่วยความจำถาวรเพื่อทดแทน RAM สำหรับ memcached
รุ่นล่าสุดของ memcached
ที่เก็บข้อมูลภายในเครื่อง LVM เป็นพื้นที่ทำงาน
แอปพลิเคชันที่ทำงานกับข้อมูลที่มีขนาดใหญ่กว่า RAM อาจต้องใช้พื้นที่จัดเก็บในเครื่องที่มีขนาดหรือตัววัดประสิทธิภาพที่วอลุ่ม EmptyDir จาก Kubernetes ไม่สามารถให้ได้ ตัวอย่างเช่นเพื่อจุดประสงค์นี้จึงเขียนขึ้น
การเข้าถึงปริมาณข้อมูลในระดับอ่านอย่างเดียว
การจัดสรรวอลุ่มอาจส่งผลให้เกิดการสร้างวอลุ่มเต็มเมื่อ:
-
การกู้คืน
สแน็ปช็อตปริมาณ ; -
การสร้าง
สำเนาปริมาณ ; -
ทำงาน
ตัวยึดตำแหน่งข้อมูล .
วอลุ่มเหล่านี้สามารถติดตั้งได้ในโหมดอ่านอย่างเดียว
Какэтоработает
วัตถุประสงค์ทั่วไป เล่มชั่วคราว
คุณลักษณะสำคัญของวอลุ่มชั่วคราวสำหรับวัตถุประสงค์ทั่วไปคือแหล่งที่มาของวอลุ่มใหม่ EphemeralVolumeSource
ซึ่งมีฟิลด์ทั้งหมดสำหรับสร้างคำขอวอลุ่ม (ในอดีตเรียกว่าคำขอวอลุ่มถาวร, PVC) คอนโทรลใหม่เข้าแล้ว kube-controller-manager
ดูที่พ็อดที่สร้างแหล่งปริมาตร จากนั้นจึงสร้าง PVC สำหรับพ็อดเหล่านั้น สำหรับไดรเวอร์ CSI คำขอนี้มีลักษณะเหมือนกับคำขออื่นๆ ดังนั้นจึงไม่จำเป็นต้องมีการสนับสนุนพิเศษที่นี่
ตราบใดที่ยังมี PVC อยู่ ก็สามารถนำมาใช้ได้เหมือนกับคำขออื่นๆ บนวอลุ่ม โดยเฉพาะอย่างยิ่ง สามารถอ้างอิงเป็นแหล่งข้อมูลได้เมื่อคัดลอกวอลลุมหรือสร้างสแน็ปช็อตจากวอลลุม วัตถุ PVC ยังมีสถานะปัจจุบันของไดรฟ์ข้อมูลด้วย
ชื่อของ PVC ที่สร้างขึ้นโดยอัตโนมัติได้รับการกำหนดไว้ล่วงหน้าแล้ว โดยเป็นการผสมผสานระหว่างชื่อพ็อดและชื่อวอลุ่ม โดยคั่นด้วยเครื่องหมายยัติภังค์ ชื่อที่กำหนดไว้ล่วงหน้าช่วยให้โต้ตอบกับ PVC ได้ง่ายขึ้น เนื่องจากคุณไม่จำเป็นต้องค้นหาหากคุณทราบชื่อพ็อดและชื่อวอลุ่ม ข้อเสียคือชื่ออาจมีการใช้งานอยู่แล้ว ซึ่ง Kubernetes ตรวจพบ และเป็นผลให้พ็อดถูกบล็อกไม่ให้เริ่มทำงาน
เพื่อให้แน่ใจว่าวอลลุมถูกลบไปพร้อมกับพ็อด คอนโทรลเลอร์จะส่งคำขอไปยังวอลลุมภายใต้เจ้าของ เมื่อพ็อดถูกลบ กลไกการรวบรวมขยะมาตรฐานจะทำงาน ซึ่งจะลบทั้งคำขอและวอลุ่ม
คำขอจะถูกจับคู่โดยไดรเวอร์การจัดเก็บข้อมูลผ่านกลไกปกติของคลาสการจัดเก็บข้อมูล แม้ว่าชั้นเรียนจะมีผลผูกพันทันทีและล่าช้า (aka WaitForFirstConsumer
) ได้รับการสนับสนุน สำหรับไดรฟ์ข้อมูลชั่วคราวก็สมเหตุสมผลที่จะใช้ WaitForFirstConsumer
จากนั้นตัวกำหนดเวลาสามารถพิจารณาทั้งการใช้งานโหนดและความพร้อมใช้งานของพื้นที่เก็บข้อมูลเมื่อเลือกโหนด คุณลักษณะใหม่ปรากฏที่นี่
การติดตามความจุของพื้นที่เก็บข้อมูล
โดยทั่วไปแล้วผู้จัดกำหนดการจะไม่รู้ว่าโปรแกรมควบคุม CSI จะสร้างไดรฟ์ข้อมูลจากที่ใด นอกจากนี้ ผู้จัดกำหนดการไม่สามารถติดต่อกับคนขับโดยตรงเพื่อขอข้อมูลนี้ได้ ดังนั้น ตัวกำหนดตารางเวลาจะสำรวจโหนดจนกว่าจะพบโหนดที่สามารถเข้าถึงไดรฟ์ข้อมูลได้ (การรวมล่าช้า) หรือปล่อยให้การเลือกตำแหน่งทั้งหมดเป็นหน้าที่ของไดรเวอร์ (การรวมทันที)
ใหม่ CSIStorageCapacity
ซึ่งอยู่ในระยะอัลฟ่า อนุญาตให้จัดเก็บข้อมูลที่จำเป็นใน etcd เพื่อให้ผู้กำหนดตารางเวลาพร้อมใช้งาน ต่างจากการสนับสนุนวอลุ่มชั่วคราวเพื่อวัตถุประสงค์ทั่วไป เมื่อคุณปรับใช้ไดรเวอร์ คุณต้องเปิดใช้งานการติดตามความจุของพื้นที่เก็บข้อมูล: external-provisioner
ควรเผยแพร่ข้อมูลความจุที่ได้รับจากผู้ขับขี่ตามปกติ GetCapacity
.
หากผู้จัดกำหนดการจำเป็นต้องเลือกโหนดสำหรับพ็อดที่มีไดรฟ์ข้อมูลที่ไม่ได้ผูกไว้ซึ่งใช้การรวมล่าช้า และไดรเวอร์เปิดใช้งานคุณลักษณะนี้ในระหว่างการปรับใช้โดยการตั้งค่าสถานะ CSIDriver.storageCapacity
จากนั้นโหนดที่มีความจุไม่เพียงพอจะถูกละทิ้งโดยอัตโนมัติ วิธีนี้ใช้ได้กับทั้งไดรฟ์ข้อมูลชั่วคราวและถาวรเพื่อวัตถุประสงค์ทั่วไป แต่ไม่ใช่สำหรับไดรฟ์ข้อมูลชั่วคราวของ CSI เนื่องจาก Kubernetes ไม่สามารถอ่านพารามิเตอร์ได้
ตามปกติ วอลลุมที่เชื่อมโยงทันทีจะถูกสร้างขึ้นก่อนที่จะกำหนดเวลาพ็อด และไดรเวอร์การจัดเก็บข้อมูลจะเลือกตำแหน่ง ดังนั้นเมื่อกำหนดค่า external-provisioner
ตามค่าเริ่มต้น คลาสพื้นที่เก็บข้อมูลที่มีการเชื่อมโยงทันทีจะถูกข้าม เนื่องจากข้อมูลนี้จะไม่ถูกนำไปใช้ต่อไป
เนื่องจากตัวกำหนดเวลา kubernetes ถูกบังคับให้ทำงานกับข้อมูลที่อาจล้าสมัย จึงไม่มีการรับประกันว่าความจุจะพร้อมใช้งานในทุกกรณีเมื่อมีการสร้างไดรฟ์ข้อมูล แต่โอกาสที่จะสร้างไดรฟ์ข้อมูลโดยไม่ต้องลองใหม่จะยังคงเพิ่มขึ้น
NB คุณสามารถรับข้อมูลโดยละเอียดเพิ่มเติมได้ เช่นเดียวกับ "ฝึกยืนบนแท่นแมว" อย่างปลอดภัย และในกรณีที่สถานการณ์ไม่สามารถเข้าใจได้โดยสิ้นเชิง สามารถรับความช่วยเหลือสนับสนุนด้านเทคนิคที่มีคุณสมบัติเหมาะสมในหลักสูตรเร่งรัด -
ความปลอดภัย
CSISความจุการจัดเก็บ
ออบเจ็กต์ CSIStorageCapacity อยู่ในเนมสเปซ เมื่อเปิดตัวไดรเวอร์ CSI แต่ละตัวในเนมสเปซของตัวเอง ขอแนะนำให้จำกัดสิทธิ์ RBAC ให้กับ CSIStorageCapacity ในพื้นที่นั้น เนื่องจากเห็นได้ชัดว่าข้อมูลมาจากไหน Kubernetes จะไม่ตรวจสอบสิ่งนี้อยู่ดี และโดยปกติแล้วไดรเวอร์จะอยู่ในเนมสเปซเดียวกัน ดังนั้นท้ายที่สุดแล้วไดรเวอร์จะต้องทำงานและไม่เผยแพร่ข้อมูลที่ไม่ถูกต้อง (และนี่คือจุดที่การ์ดของฉันล้มเหลว ประมาณ นักแปลจากเรื่องตลกมีหนวดมีเครา)
วัตถุประสงค์ทั่วไป เล่มชั่วคราว
หากผู้ใช้มีสิทธิ์สร้างพ็อด (ทางตรงหรือทางอ้อม) พวกเขาจะสามารถสร้างวอลลุมชั่วคราวสำหรับวัตถุประสงค์ทั่วไปได้ แม้ว่าพวกเขาจะไม่มีสิทธิ์สร้างคำขอบนวอลลุมก็ตาม เนื่องจากการตรวจสอบสิทธิ์ RBAC จะใช้กับคอนโทรลเลอร์ที่สร้าง PVC ไม่ใช่กับผู้ใช้ นี่คือการเปลี่ยนแปลงหลักที่จะเพิ่ม
ตัวอย่าง
แยก
บนเครื่องที่เหมาะสม (Linux ผู้ใช้ทั่วไปก็สามารถใช้งานได้
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