摘要:手动配置本地卷此节介绍在不使用情况下如何配置手动本地卷。主机挂载本地卷如本例在主机配置本地卷,需将目录手动挂载到目录,如环境设置权限部署可选。
本地卷描述
如Hadoop、ES等系统,其DataNode需大量存储,且其本身提供了冗余功能,那么我们就没必要让其从存储系统中分配卷,而是像裸机部署一样让其使用本地节点上的存储,local volumes出现之前,我们可使用HostPath挂载卷到容器中,但此方案有很多局限性:
The prior mechanism of accessing local storage through hostPath volumes had many challenges. hostPath volumes were difficult to use in production at scale: operators needed to care for local disk management, topology, and scheduling of individual pods when using hostPath volumes, and could not use many Kubernetes features (like StatefulSets). Existing Helm charts that used remote volumes could not be easily ported to use hostPath volumes. The Local Persistent Volumes feature aims to address hostPath volumes’ portability, disk accounting, and scheduling challenges.
注意:本地卷仅适用于少量应用,如同HostPath一样Pod被绑定到特定的主机上,若主机异常,则Pod没法调度到其他节点,其适用场景:
Caching of datasets that can leverage data gravity for fast processing
Distributed storage systems that shard or replicate data across multiplenodes. Examples include distributed datastores like Cassandra, or distributedfile systems like Gluster or Ceph.
localvolume与hostpath类似,但其更灵活且统一,如应用使用hostpath,则只能在yaml文件中硬编码,而localvolume如同普通pvc灵活可用,具体见下文。
手动配置本地卷此节介绍在不使用local provisioner情况下如何配置手动本地卷。
管理员必须为本地卷创建一个存储类,如下所示,创建了一个名为local-storage的存储类:
% kubectl create -f - <注意:
此存储类无法动态提供存储功能,所有PV需手动创建;
volumeBindingMode: WaitForFirstConsumer:Pod调度前不先绑定PVC与PV,而是等待Pod被调度时,这样可根据Pod资源等请求合理调度,如:selectors, affinity and anti-affinity policies;
宿主机准备目录,即配置本地硬盘。如实验环境okd-c01与okd-c02主机均配置了/mnt/test本地存储,而对于OKD集群需设置SeLinux权限:
chcon -R unconfined_u:object_r:svirt_sandbox_file_t:s0 /mnt/test手动创建两PV:example-local-pv-1、example-local-pv-2分别绑定两主机存储,如绑定okd-c01.zyl.io主机的本地卷如下:
% kubectl create -f - <创建PVC:
% kubectl create -f - <注意:此时PVC不会立马绑定到PV,其等待Pod被调度时才会绑定到PV上,当前PVC状态为Pending:
% oc describe pvc example-local-claim ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal WaitForFirstConsumer 5s (x2 over 10s) persistentvolume-controller waiting for first consumer to be created before binding配置应用使用存储:
% kubectl create -f - <<"EOF" apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: local-volume-test name: local-volume-test spec: replicas: 1 selector: matchLabels: app: local-volume-test template: metadata: labels: app: local-volume-test spec: containers: - image: busybox name: local-volume-test imagePullPolicy: IfNotPresent command: [ "/bin/sh", "-c", "while true; do sleep 2; echo $(date) $(hostname)>> /mnt/test/test.log; done" ] volumeMounts: - name: local-data mountPath: /mnt/test volumes: - name: local-data persistentVolumeClaim: claimName: example-local-claim EOFPod调度后会发现PVC被绑定:
% oc get pvc example-local-claim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE example-local-claim Bound example-local-pv-2 1Gi RWO local-storage 7m注意:
此时删除Pod,可发现其仍然被调度到本地存储example-local-pv-2所在的主机,即okd-c02.zyl.io;
删除deployment后,PVC不会与PV解绑,即第一次Pod调度后,PVC就与PV关联了;
删除PVC后,发现PV一直处于Released状态,导致PV无法被重用,需管理员手动删除PV并重建PV以便被重用:
When local volumes are manually created like this, the only supported persistentVolumeReclaimPolicy is “Retain”. When the PersistentVolume is released from the PersistentVolumeClaim, an administrator must manually clean up and set up the local volume again for reuse.自动配置本地卷手动配置本地券中描述的PV需手动创建,而PVC删除后PV没法重用,即需重建PV才行,当系统使用大量Local Volume时会加重管理负担,鉴于此,可通过external static provisioner协助简化local volume配置。
当前版本(<=K8S 1.12及OKD 1.11)管理员需手动在主机上将volume挂载到特定目录上,而后external static provisioner会扫描此目录,其将自动创建PV,而当PVC被释放后又会清理目录内容并重建PV,其是半自动化的,但并非动态提供,后续版本会提供动态提供支持,如管理员仅需提供LVM VG,此provisioner将自动完成格式化、挂载等步骤:
Dynamic provisioning of local volumes using LVM is under design and an alpha implementation will follow in a future release. This will eliminate the current need for an administrator to pre-partition, format and mount local volumes, as long as the workload’s performance requirements can tolerate sharing disks.参考:
Local Persistent Volumes for Kubernetes Goes Beta;
[kubernetes-sigs/sig-storage-local-static-provisioner:K8S官方提供的external static provisioner;
Configuring Local Volumes:OKD如何配置local provisioner;
以下描述如何使用OKD提供的local provisioner。
主机挂载本地卷如本例在okd-c0[1-3]主机配置本地卷,需将目录手动挂载到/mnt/local-storage/
/ 目录,如:cat >> /etc/fstab <OKD/Openshift环境设置SeLinux权限:
chcon -R unconfined_u:object_r:svirt_sandbox_file_t:s0 /mnt/local-storage/部署local provisioner可选。在多带带的项目下部署local provisioner,创建项目:
oc new-project local-storage创建一个ConfigMap,其被external provisioner使用,用于描述存储类:
% kubectl create -f - <<"EOF" apiVersion: v1 kind: ConfigMap metadata: name: local-volume-config data: storageClassMap: | local-storage-1: hostDir: /mnt/local-storage/local-storage-1 mountDir: /mnt/local-storage/local-storage-1 local-storage-2: hostDir: /mnt/local-storage/local-storage-2 mountDir: /mnt/local-storage/local-storage-2 EOF注意:
local-storage-1:为StorageClass名称,与/mnt/local-storage/
对应; hostDir:本机目录;
moutDir:external provisioner将hostDir挂载到pod中的目录,与hostDir保持一致即可。
provisioner以root权限运行,OKD集群需赋权:
oc create serviceaccount local-storage-admin oc adm policy add-scc-to-user privileged -z local-storage-adminOKD集群安装模板:
oc create -f https://raw.githubusercontent.com/openshift/origin/release-3.11/examples/storage-examples/local-examples/local-storage-provisioner-template.yaml从以上模板安装应用(PS:其以DS模式运行在所有计算节点上):
oc new-app -p CONFIGMAP=local-volume-config -p SERVICE_ACCOUNT=local-storage-admin -p NAMESPACE=local-storage -p PROVISIONER_IMAGE=quay.io/external_storage/local-volume-provisioner:latest local-storage-provisioner创建所需的StorageClass:
% kubectl create -f - <<"EOF" apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage-1 provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer EOF % kubectl create -f - <<"EOF" apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage-2 provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer EOF注意:StorageClass创建完成后,PV才会被自动创建。
接着,我们手动创建PVC或者在Statefulset中使用此存储卷:
--- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: example-local-claim spec: accessModes: - ReadWriteOnce storageClassName: local-storage-1 resources: requests: storage: 5Gi --- kind: StatefulSet ... volumeClaimTemplates: - metadata: name: example-local-claim spec: accessModes: - ReadWriteOnce storageClassName: local-storage-1 resources: requests: storage: 5Gi
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/33176.html
摘要:手动配置本地卷此节介绍在不使用情况下如何配置手动本地卷。主机挂载本地卷如本例在主机配置本地卷,需将目录手动挂载到目录,如环境设置权限部署可选。 本地卷描述 如Hadoop、ES等系统,其DataNode需大量存储,且其本身提供了冗余功能,那么我们就没必要让其从存储系统中分配卷,而是像裸机部署一样让其使用本地节点上的存储,local volumes出现之前,我们可使用HostPath挂载...
摘要:本地数据卷管理。本地数据卷的管理是一个比较复杂的工程,需要支持文件系统和块存储。在中,本地数据卷管理暂时不会处理该问题会设计一个外部控制器来定期查询该错误状态,并根据一定的策略重新调度。本地数据卷的创建由新的组件处理,该组件将以的方式部署。 本期文章来自才云科技(Caicloud)CTO 邓德源的技术原创。 1Overview Kubernetes 1.7 不会引入过多新功能,比较重...
摘要:核心概念是最小的调度单元,可以由一个或者多个容器组成。该模式会跟云服务商有关,比如可以通过等创建一个外部的负载均衡器,将请求转发到对应的服务组。而可以提供外部服务可访问的负载均衡器等。 概述 Kubernetes 有各类资源对象来描述整个集群的运行状态。这些对象都需要通过调用 kubernetes api 来进行创建、修改、删除,可以通过 kubectl 命令工具,也可以直接调用 k8...
摘要:的详细内容如下当然,也可以不使用,而是手动创建。前是将作为记录到中,起将其独立为一个字段接下来可以创建各种,记得要在的模板中声明。注意到这里是,即我们一开始创建的实例的名字。为表示中申明的未的,在集群内的中找不到可以匹配的。 什么是Local Persistent Volumes 在kubernetes 1.14版本中, Local Persistent Volumes(以下简称LPV...
阅读 3939·2021-11-24 09:38
阅读 1203·2021-10-19 11:42
阅读 1816·2021-10-14 09:42
阅读 2139·2019-08-30 15:44
阅读 527·2019-08-30 14:04
阅读 2869·2019-08-30 13:13
阅读 1929·2019-08-30 12:51
阅读 932·2019-08-30 11:22