kubernetes 存储类节点选择器

Lau*_*ica 1 kubernetes rancher kubernetes-pvc

我正在尝试利用 k8s 的本地卷动态配置程序(Rancher 的一个),具有多个实例,每个实例都有自己的存储类,以便我可以根据性能提供多种类型的本地卷(例如 ssd、hdd 等)。

底层基础设施不对称;有些节点只有 SSD,有些只有 HDD,有些节点两者都有。

我知道我可以通过为 Pod 提供节点关联性规则来提示调度程序选择正确的节点。

但是,是否有更好的方法仅在配置者/存储类级别解决此问题?例如,使存储类仅可用于集群节点的子集。

mar*_*rio 7

我知道我可以通过为 Pod 提供节点关联性规则来提示调度程序选择正确的节点。

Pod使用本地持久卷时,无需在级别上定义节点亲和性规则。节点关联性可以在定义中指定PersistentVolume

但是,是否有更好的方法仅在配置者/存储类级别解决此问题?例如,使存储类仅可用于集群节点的子集。

不,不能在StorageClass级别上指定。您也不能StorageClass仅让节点的子集可用。

但当谈到配置器时,我会说是的,它应该是可行的,因为主要的存储配置器任务之一是创建匹配的PersistentVolume对象以响应PersistentVolumeClaim用户创建的对象。你可以在这里读到它:

动态卷配置允许按需创建存储卷。如果没有动态配置,集群管理员必须手动调用其云或存储提供商来创建新的存储卷,然后创建 PersistentVolume 对象来在 Kubernetes 中表示它们。动态配置功能使集群管理员无需预先配置存储。相反,它会在用户请求时自动配置存储。

因此,从一开始看整个卷提供过程如下:

用户仅创建PersistenVolumeClaim对象,并在其中指定StorageClass

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 10Gi
  storageClassName: local-storage ### 
Run Code Online (Sandbox Code Playgroud)

它可以用在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 ### 
Run Code Online (Sandbox Code Playgroud)

因此在实践中,在Pod定义中您只需要指定正确的PVC. 不需要在这里定义任何节点亲和性规则。

APod引用 a PVCPVC然后引用 a StorageClassStorageClass引用provisioner应该使用的 the :

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/my-fancy-provisioner ### 
volumeBindingMode: WaitForFirstConsumer
Run Code Online (Sandbox Code Playgroud)

所以最终 a 的任务就是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 ### 
Run Code Online (Sandbox Code Playgroud)

因此,Pod使用myclaim PVC -> 引用local-storage StorageClass -> 选择适当的存储provisioner将自动调度在PV此配置程序创建的定义中选择的节点上。