äžéšã®ã¢ããªã±ãŒã·ã§ã³ã¯ããŒã¿ãä¿åããå¿ èŠããããŸãããåèµ·ååŸã«ããŒã¿ãä¿åãããªããšããäºå®ã«éåžžã«æ £ããŠããŸãã
ããšãã°ããã£ãã·ã¥ ãµãŒãã¹ã¯ RAM ã«ãã£ãŠå¶éãããŸãããå šäœçãªããã©ãŒãã³ã¹ã«ã»ãšãã©åœ±é¿ãäžããããšãªãããã£ãã«äœ¿çšãããªãããŒã¿ã RAM ãããé ãã¹ãã¬ãŒãžã«ç§»åããããšãã§ããŸãã ä»ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãèšå®ãç§å¯ããŒãªã©ããã¡ã€ã«å ã«èªã¿åãå°çšã®å ¥åãå«ãŸããå¯èœæ§ãããããšãèªèããå¿ èŠããããŸãã
Kubernetesã«ã¯ãã§ã«ããã€ãã®ã¿ã€ãããããŸã
äžæçãª
ããã¯ããã¹ã ãªãœãŒã¹ã倧éã«æ¶è²»ããããªã¥ãŒã ããäžéšã®ãã¹ãã§ã®ã¿å©çšå¯èœãªã¹ãã¬ãŒãžã®å Žåã«åé¡ã«ãªãå¯èœæ§ããããŸãã ãã®ãããKubernetes 1.19 ã§ã¯ãæŠå¿µçã«ã¯ EmptyDir ããªã¥ãŒã ã«äŒŒã XNUMX ã€ã®æ°ããã¢ã«ãã¡ ãã¹ã ããªã¥ãŒã æ©èœãå°å ¥ãããŠããŸãã
-
æ±çšã®äžæããªã¥ãŒã ã
-
CSI ã¹ãã¬ãŒãžå®¹éã®è¿œè·¡ã
æ°ããã¢ãããŒãã®å©ç¹:
-
ã¹ãã¬ãŒãžã¯ããŒã«ã«ã«ããããšãããããã¯ãŒã¯çµç±ã§æ¥ç¶ããããšãã§ããŸãã
-
ããªã¥ãŒã ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãè¶ éã§ããªãæå®ãµã€ãºãèšå®ã§ããŸãã
-
æ°žç¶ããªã¥ãŒã ã®ããããžã§ãã³ã°ããµããŒããã(容é远跡ããµããŒãããããã«) åŒã³åºããå®è£ ããä»»æã® CSI ãã©ã€ããŒãšé£æºããŸãã
GetCapacity
; -
ãã©ã€ããŒãšèšå®ã«å¿ããŠãããªã¥ãŒã ã«ã¯åæããŒã¿ãå«ãŸããå ŽåããããŸãã
-
ããªã¥ãŒã ã«é¢ãããã¹ãŠã®æšæºæäœ (ã¹ãããã·ã§ããã®äœæããµã€ãºå€æŽãªã©) ããµããŒããããŠããŸãã
-
ããªã¥ãŒã ã¯ãã¢ãžã¥ãŒã«ãŸãã¯ããªã¥ãŒã ã®ä»æ§ãåãå ¥ããä»»æã®ã¢ããªã±ãŒã·ã§ã³ ã³ã³ãããŒã©ãŒã§äœ¿çšã§ããŸãã
-
Kubernetes ã¹ã±ãžã¥ãŒã©ãŒã¯é©åãªããŒããç¬èªã«éžæãããããã¹ã±ãžã¥ãŒã©ãŒæ¡åŒµæ©èœãããããžã§ãã³ã°ããã³æ§æããããWebhook ãå€æŽãããããå¿ èŠã¯ãªããªããŸããã
ã¢ããªã±ãŒã·ã§ã³ãªãã·ã§ã³
ãããã£ãŠãæ±çšã®äžæããªã¥ãŒã ã¯ã次ã®äœ¿çšäŸã«é©ããŠããŸãã
memcached ã® RAM ã®ä»£æ¿ãšããŠã®æ°žç¶ã¡ã¢ãª
memcached ã®ææ°ãªãªãŒã¹
ã¯ãŒã¯ã¹ããŒã¹ãšããŠã® LVM ããŒã«ã« ã¹ãã¬ãŒãž
RAM ãã倧ããããŒã¿ãæ±ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãKubernetes ã®éåžžã® EmptyDir ããªã¥ãŒã ã§ã¯æäŸã§ããªããµã€ãºãŸãã¯ããã©ãŒãã³ã¹ ã¡ããªã¯ã¹ã®ããŒã«ã« ã¹ãã¬ãŒãžãå¿
èŠã«ãªãå ŽåããããŸãã ããšãã°ããã®ç®çã®ããã«æ¬¡ã®ããã«æžãããŸãã
ããŒã¿ããªã¥ãŒã ãžã®èªã¿åãå°çšã¢ã¯ã»ã¹
次ã®å Žåãããªã¥ãŒã ãå²ãåœãŠããšãã« ããªã¥ãŒã ãäœæãããããšããããŸãã
-
äœæäž
ããªã¥ãŒã ã³ã㌠; -
ä»äº
ããŒã¿ãã¬ãŒã¹ãã«ã .
ãããã®ããªã¥ãŒã ã¯èªã¿åãå°çšã¢ãŒãã§ããŠã³ãã§ããŸãã
ããã¯ã©ãåããã®ã§ãã
æ±çšäžæããªã¥ãŒã
æ±çšäžæããªã¥ãŒã ã®éèŠãªæ©èœã¯ãæ°ããããªã¥ãŒã ãœãŒã¹ã§ãã EphemeralVolumeSource
ãããªã¥ãŒã ãªã¯ãšã¹ã (åŸæ¥ã¯æ°žç¶ããªã¥ãŒã ãªã¯ãšã¹ããPVC ãšåŒã°ããŠããŸãã) ãäœæããããã®ãã¹ãŠã®ãã£ãŒã«ããå«ãŸããŠããŸãã æ°ããã³ã³ãããŒã©ãŒãå
¥ã£ã kube-controller-manager
ã¯ããã®ãããªããªã¥ãŒã ãœãŒã¹ãäœæãããããã確èªãããããã®ãããã® PVC ãäœæããŸãã CSI ãã©ã€ããŒã®å Žåããã®ãªã¯ãšã¹ãã¯ä»ã®ãªã¯ãšã¹ããšåãããã«èŠãããããããã§ã¯ç¹å¥ãªãµããŒãã¯å¿
èŠãããŸããã
ãã®ãã㪠PVC ãååšããéããããªã¥ãŒã äžã®ä»ã®ãªã¯ãšã¹ããšåæ§ã«äœ¿çšã§ããŸãã ç¹ã«ãããªã¥ãŒã ãã³ããŒãããšãããŸãã¯ããªã¥ãŒã ããã¹ãããã·ã§ãããäœæãããšãã«ãããŒã¿ ãœãŒã¹ãšããŠåç §ã§ããŸãã PVC ãªããžã§ã¯ãã«ã¯ãããªã¥ãŒã ã®çŸåšã®ç¶æ ãå«ãŸããŸãã
èªåçã«äœæããã PVC ã®ååã¯äºåå®çŸ©ãããŠããããããåãšããªã¥ãŒã åããã€ãã³ã§åºåã£ãŠçµã¿åããããã®ã«ãªããŸãã äºåå®çŸ©ãããååã䜿çšãããšããããåãšããªã¥ãŒã åãããã£ãŠããå Žåã¯æ¢ãå¿ èŠããªããããPVC ãšã®å¯Ÿè©±ã容æã«ãªããŸãã æ¬ ç¹ã¯ããã®ååããââã§ã«äœ¿çšãããŠããå¯èœæ§ããããKubernetes ã«ãã£ãŠæ€åºããããã®çµæãããã®èµ·åããããã¯ãããããšã§ãã
ããªã¥ãŒã ãããããšãšãã«ç¢ºå®ã«åé€ãããããã«ããããã«ãã³ã³ãããŒã©ãŒã¯ææè ã®é äžã®ããªã¥ãŒã ã«ãªã¯ãšã¹ããäœæããŸãã ããããåé€ããããšãæšæºã®ã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ ã¡ã«ããºã ãæ©èœãããªã¯ãšã¹ããšããªã¥ãŒã ã®äž¡æ¹ãåé€ãããŸãã
ãªã¯ãšã¹ãã¯ãã¹ãã¬ãŒãž ã¯ã©ã¹ã®éåžžã®ã¡ã«ããºã ãéããŠã¹ãã¬ãŒãž ãã©ã€ããŒã«ãã£ãŠç
§åãããŸãã ãã ããå³æãã€ã³ãã£ã³ã°ãšé
延ãã€ã³ãã£ã³ã°ãåããã¯ã©ã¹ (å¥å) WaitForFirstConsumer
) ããµããŒããããŠãããäžæããªã¥ãŒã ã®å Žåã¯äœ¿çšããã®ãçã«ããªã£ãŠããŸãã WaitForFirstConsumer
ã®å Žåãã¹ã±ãžã¥ãŒã©ã¯ããŒããéžæãããšãã«ããŒãã®äœ¿çšç¶æ³ãšã¹ãã¬ãŒãžã®å¯çšæ§ã®äž¡æ¹ãèæ
®ã§ããŸãã ããã§æ°æ©èœãç»å ŽããŸãã
ã¹ãã¬ãŒãžå®¹éã®è¿œè·¡
éåžžãã¹ã±ãžã¥ãŒã©ã¯ãCSI ãã©ã€ããããªã¥ãŒã ãäœæããå Žæã«ã€ããŠã¯ç¥ããŸããã ãŸããã¹ã±ãžã¥ãŒã©ããã©ã€ããŒã«çŽæ¥é£çµ¡ããŠãã®æ å ±ãèŠæ±ããæ¹æ³ããããŸããã ãããã£ãŠãã¹ã±ãžã¥ãŒã©ãŒã¯ãããªã¥ãŒã ã«ã¢ã¯ã»ã¹ã§ããããŒããèŠã€ãããŸã§ããŒããããŒãªã³ã°ããã (é 延ãã€ã³ãã£ã³ã°)ãå Žæã®éžæãå®å šã«ãã©ã€ããŒã«ä»»ããŸã (å³æãã€ã³ãã£ã³ã°)ã
æ°ããã§ã CSIStorageCapacity
ã¯ã¢ã«ãã¡æ®µéã«ãããå¿
èŠãªããŒã¿ã etcd ã«ä¿åããŠã¹ã±ãžã¥ãŒã©ãŒãå©çšã§ããããã«ããŸãã æ±çšã®äžæããªã¥ãŒã ã®ãµããŒããšã¯ç°ãªãããã©ã€ããŒãå±éãããšãã¯ãã¹ãã¬ãŒãžå®¹éã®è¿œè·¡ãæå¹ã«ããå¿
èŠããããŸãã external-provisioner
éåžžã®æ¹æ³ã§ãã©ã€ããŒããåãåã£ã容éæ
å ±ãå
¬éããå¿
èŠããããŸã GetCapacity
.
ã¹ã±ãžã¥ãŒã©ãé
延ãã€ã³ãã£ã³ã°ã䜿çšããã¢ã³ãã€ã³ã ããªã¥ãŒã ãæã€ãããã®ããŒããéžæããå¿
èŠãããããã©ã€ããŒããããã€ã¡ã³ãäžã«ãã©ã°ãèšå®ããããšã§ãã®æ©èœãæå¹ã«ããå Žå CSIDriver.storageCapacity
ãååãªã¹ãã¬ãŒãžå®¹éããªãããŒãã¯èªåçã«ç Žæ£ãããŸãã ããã¯ãæ±çšã®äžæããªã¥ãŒã ãšæ°žç¶ããªã¥ãŒã ã®äž¡æ¹ã§æ©èœããŸãããCSI äžæããªã¥ãŒã ã®ãã©ã¡ãŒã¿ã¯ Kubernetes ã«ãã£ãŠèªã¿åããªããããæ©èœããŸããã
éåžžã©ãããããã«ãªã³ã¯ãããããªã¥ãŒã ã¯ããããã¹ã±ãžã¥ãŒã«ãããåã«äœæããããã®é
眮ã¯ã¹ãã¬ãŒãž ãã©ã€ããŒã«ãã£ãŠéžæããããããæ§ææã« external-provisioner
ããã©ã«ãã§ã¯ãå³æãã€ã³ãã£ã³ã°ãæã€ã¹ãã¬ãŒãž ã¯ã©ã¹ã¯ã¹ããããããŸãããã®ããŒã¿ã¯ãããã«ãã䜿çšãããªãããã§ãã
Kubernetes ã¹ã±ãžã¥ãŒã©ã¯å€ãå¯èœæ§ã®ããæ å ±ãåŠçããããšã匷å¶ããããããããªã¥ãŒã ã®äœææã«åžžã«å®¹éãå©çšã§ãããšããä¿èšŒã¯ãããŸããããããã§ãåè©Šè¡ããã«äœæãããå¯èœæ§ã¯é«ããªããŸãã
N.B. ãã詳现ãªæ
å ±ãå
¥æã§ããã ãã§ãªããå®å
šã«ãç«ã®ã¹ã¿ã³ãã§ç·Žç¿ãããããšãã§ããå®å
šã«ç解ã§ããªãç¶æ³ãçºçããå Žåã«ã¯ãéäžã³ãŒã¹ã§è³æ Œã®ããæè¡ãµããŒãã®æ¯æŽãåããããšãã§ããŸãã
ã»ãã¥ãªãã£
CSISã¹ãã¬ãŒãžå®¹é
CSIStorageCapacity ãªããžã§ã¯ãã¯åå空éã«ååšããŸããå CSI ãã©ã€ããŒãç¬èªã®åå空éã§ããŒã«ã¢ãŠãããå Žåã¯ãããŒã¿ã®éä¿¡å ãæããã§ããããããã®ç©ºéå ã® CSIStorageCapacity ã«å¯Ÿãã RBAC æš©éãå¶éããããšããå§ãããŸãã ãããã«ããŠãã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
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