Skip to content

Latest commit

 

History

History
106 lines (98 loc) · 2.97 KB

topology.md

File metadata and controls

106 lines (98 loc) · 2.97 KB

本地拓扑卷

拓扑卷的目的主要是在调度pvc时,将pv调度到某些特定节点,carina支持topo卷调度,介绍如下

在carina启动时会为每个节点打上topology.carina.storage.io/node=nodename标签,当在storageclass设置topology参数时将按照要求选择存储卷

创建topology存储类 kubectl apply -f storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-carina-sc
provisioner: carina.storage.io
parameters:
  # file system
  csi.storage.k8s.io/fstype: xfs
  # disk group
  carina.storage.io/disk-group-name: hdd
reclaimPolicy: Delete
allowVolumeExpansion: true
# 创建pvc后立即创建pv,WaitForFirstConsumer表示被容器绑定调度后再创建pv
volumeBindingMode: Immediate
mountOptions:
allowedTopologies:
  - matchLabelExpressions:
      - key: beta.kubernetes.io/os
        values:
          - linux
          - amd64
      - key: kubernetes.io/hostname
        values:
          - 10.20.9.153
          - 10.20.9.154
  • 注意只有volumeBindingMode: Immediate类型的才支持根据allowedTopologies选择pv所在节点,当volumeBindingMode: WaitForFirstConsumer时,pv选择节点将根据pod的topology设置进行调度

创建一个包含topology选择的statefulset,如下kubectl apply -f statefulset.yamltopologyKey表示该POD只会调度到存在carina存储驱动的节点上

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: carina-topo-stateful
  namespace: carina
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/os
                    operator: In
                    values:
                      - linux
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - nginx
              topologyKey: topology.carina.storage.io/node
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 80
              name: web
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
            - name: logs
              mountPath: /logs
  volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: csi-carina-sc
        resources:
          requests:
            storage: 10Gi
    - metadata:
        name: logs
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: csi-carina-sc
        resources:
          requests:
            storage: 5Gi