kubernetes存储类节点选择器

问题描述

我正在尝试为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引用了PVCPVC,然后引用了StorageClassStorageClass引用了应使用的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定义中选择的节点上。