问题描述
我正在尝试为k8s(Rancher的k8s)使用本地卷动态预配器,该预配器有多个实例,每个实例都有自己的存储类,以便我可以根据其性能提供多种类型的本地卷(例如ssd,hdd,等)。
底层基础结构不对称;有些节点只有ssds,有些只有hdd,其中有些都有。
我知道我可以通过提供Pod的节点相似性规则来提示调度程序选择合适的节点。
但是,是否有更好的方法仅在预配器/存储类级别上解决此问题?例如,使存储类仅适用于群集节点的子集。
解决方法
我知道我可以提示调度程序通过以下方式选择适当的节点 提供Pod的节点关联性规则。
使用local持久卷时,无需在Pod
级别上定义节点相似性规则。可以在PersistentVolume
定义中指定节点相似性。
但是,有没有一种更好的方法可以解决以下问题: 仅提供者/存储类?例如,仅使存储类别 可用于群集节点的子集。
否,不能在StorageClass
级别上指定。您都无法使StorageClass
仅可用于一部分节点。
但是对于供应者,我会说是的,这应该是可行的,因为主要的存储供应者任务之一是响应用户创建的PersistentVolume
创建匹配的PersistentVolumeClaim
对象。您可以阅读以下内容:here:
动态卷配置允许创建存储卷 一经请求。如果没有动态配置,集群管理员将拥有 手动致电其云或存储提供商以创建 新的存储卷,然后创建PersistentVolume对象以 在Kubernetes中代表他们。动态配置功能 无需群集管理员预先配置 存储。相反,它会自动在 用户要求。
因此,从一开始就研究整个批量供应过程,如下所示:
用户仅创建PersistenVolumeClaim
对象,并在其中指定StorageClass
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 10Gi
storageClassName: local-storage ### ?
,它可以在Pod
定义中使用:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim ### ?
因此,实际上,在Pod
定义中,您只需要指定正确的PVC
。 无需在此处定义任何节点关联性规则。
Pod
引用了PVC
,PVC
,然后引用了StorageClass
,StorageClass
引用了应使用的provisioner
:>
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/my-fancy-provisioner ### ?
volumeBindingMode: WaitForFirstConsumer
最后,provisioner
的任务是创建匹配的PersistentVolume
对象。它可以如下所示:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /var/tmp/test
nodeAffinity: ### ?
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- ssd-node ### ?
因此Pod
使用 myclaim PVC
->引用 local-storage StorageClass
->选择一个适当的存储provisioner
将自动调度到此供应者在PV
定义中选择的节点上。