From ca8a32f0e995d53d8e5b64e82812cdb26cfe26d6 Mon Sep 17 00:00:00 2001 From: Amit Roushan Date: Wed, 18 Aug 2021 19:06:29 +0530 Subject: [PATCH 1/4] add topology awareness for node plugin --- src/csi/driver/driver.go | 12 ++- src/csi/driver/identity.go | 7 ++ src/csi/driver/node.go | 18 ++++- src/csi/main.go | 24 +++++- src/utils/k8sutils/k8sutils.go | 75 +++++++++++++++++++ yamls/deploy/huawei-csi-controller.yaml | 5 ++ yamls/deploy/huawei-csi-multi-controller.yaml | 5 ++ yamls/deploy/huawei-csi-node.yaml | 6 ++ yamls/deploy/huawei-csi-rbac.yaml | 3 + .../deploy/huawei-csi-resize-controller.yaml | 5 ++ yamls/deploy/huawei-csi-resize-rbac.yaml | 3 + ...huawei-csi-resize-snapshot-controller.yaml | 5 ++ .../huawei-csi-resize-snapshot-rbac.yaml | 3 + 13 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 src/utils/k8sutils/k8sutils.go diff --git a/src/csi/driver/driver.go b/src/csi/driver/driver.go index 89e96804..732a8446 100644 --- a/src/csi/driver/driver.go +++ b/src/csi/driver/driver.go @@ -1,17 +1,27 @@ package driver +import ( + "strings" + "utils/k8sutils" +) + type Driver struct { name string version string useMultiPath bool isNeedMultiPath bool + k8sUtils k8sutils.Interface + nodeName string } -func NewDriver(name, version string, useMultiPath, isNeedMultiPath bool) *Driver { +func NewDriver(name, version string, useMultiPath, isNeedMultiPath bool, + k8sUtils k8sutils.Interface, nodeName string) *Driver { return &Driver{ name: name, version: version, useMultiPath: useMultiPath, isNeedMultiPath: isNeedMultiPath, + k8sUtils: k8sUtils, + nodeName: strings.TrimSpace(nodeName), } } diff --git a/src/csi/driver/identity.go b/src/csi/driver/identity.go index b6868e09..731c4765 100644 --- a/src/csi/driver/identity.go +++ b/src/csi/driver/identity.go @@ -27,6 +27,13 @@ func (d *Driver) GetPluginCapabilities(ctx context.Context, req *csi.GetPluginCa }, }, }, + &csi.PluginCapability{ + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS, + }, + }, + }, }, }, nil } diff --git a/src/csi/driver/node.go b/src/csi/driver/node.go index e57976f5..6c717377 100644 --- a/src/csi/driver/node.go +++ b/src/csi/driver/node.go @@ -171,10 +171,26 @@ func (d *Driver) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRequest) ( log.Errorf("Marshal node info of %s error: %v", nodeBytes, err) return nil, status.Error(codes.Internal, err.Error()) } - log.Infof("Get NodeId %s", nodeBytes) + + if d.nodeName == "" { + return &csi.NodeGetInfoResponse{ + NodeId: string(nodeBytes), + }, nil + } + + // Get topology info from Node labels + topology, err := d.k8sUtils.GetNodeTopology(d.nodeName) + if err != nil { + log.Errorln(err) + return nil, status.Error(codes.Internal, err.Error()) + } + return &csi.NodeGetInfoResponse{ NodeId: string(nodeBytes), + AccessibleTopology: &csi.Topology{ + Segments: topology, + }, }, nil } diff --git a/src/csi/main.go b/src/csi/main.go index 4cd9a617..5f781d14 100644 --- a/src/csi/main.go +++ b/src/csi/main.go @@ -14,6 +14,7 @@ import ( "runtime/debug" "time" "utils" + "utils/k8sutils" "utils/log" "github.com/container-storage-interface/spec/lib/go/csi" @@ -30,6 +31,8 @@ const ( csiVersion = "2.2.13" defaultDriverName = "csi.huawei.com" + + nodeNameEnv = "CSI_NODENAME" ) var ( @@ -54,6 +57,12 @@ var ( volumeUseMultiPath = flag.Bool("volume-use-multipath", true, "Whether to use multipath when attach block volume") + kubeconfig = flag.String("kubeconfig", + "", + "absolute path to the kubeconfig file") + nodeName = flag.String("nodename", + os.Getenv(nodeNameEnv), + "absolute path to the kubeconfig file") config CSIConfig secret CSISecret @@ -64,7 +73,7 @@ type CSIConfig struct { } type CSISecret struct { - Secrets map[string]interface{} `json:"secrets"` + Secrets map[string]interface{} `json:"secrets"` } func init() { @@ -97,6 +106,10 @@ func init() { _ = mergeData(config, secret) + if "" == *nodeName { + logrus.Warning("Node name is empty. Topology aware volume provisioning feature may not behave normal") + } + if *containerized { *controllerFlagFile = "" } @@ -199,10 +212,15 @@ func main() { log.Fatalf("Listen on %s error: %v", *endpoint, err) } + k8sUtils, err := k8sutils.NewK8SUtils(*kubeconfig) + if err != nil { + log.Fatalf("Kubernetes client initialization failed %v", err) + } + isNeedMultiPath := utils.NeedMultiPath(config.Backends) - d := driver.NewDriver(*driverName, csiVersion, *volumeUseMultiPath, isNeedMultiPath) - server := grpc.NewServer() + d := driver.NewDriver(*driverName, csiVersion, *volumeUseMultiPath, isNeedMultiPath, k8sUtils, *nodeName) + server := grpc.NewServer() csi.RegisterIdentityServer(server, d) csi.RegisterControllerServer(server, d) csi.RegisterNodeServer(server, d) diff --git a/src/utils/k8sutils/k8sutils.go b/src/utils/k8sutils/k8sutils.go new file mode 100644 index 00000000..dff1deac --- /dev/null +++ b/src/utils/k8sutils/k8sutils.go @@ -0,0 +1,75 @@ +package k8sutils + +import ( + "errors" + "fmt" + "regexp" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" +) + +const ( + topologyRegx = "topology.kubernetes.io/*" +) + +type Interface interface { + GetNodeTopology(nodeName string) (map[string]string, error) +} + +type KubeClient struct { + clientSet *kubernetes.Clientset +} + +func NewK8SUtils(kubeConfig string) (Interface, error) { + var clientset *kubernetes.Clientset + + if kubeConfig != "" { + config, err := clientcmd.BuildConfigFromFlags("", kubeConfig) + if err != nil { + return nil, err + } + + clientset, err = kubernetes.NewForConfig(config) + if err != nil { + return nil, err + } + } else { + config, err := rest.InClusterConfig() + if err != nil { + return nil, err + } + + clientset, err = kubernetes.NewForConfig(config) + if err != nil { + return nil, err + } + } + + return &KubeClient{ + clientSet: clientset, + }, nil +} + +func (k *KubeClient) GetNodeTopology(nodeName string) (map[string]string, error) { + k8sNode, err := k.getNode(nodeName) + if err != nil { + return nil, errors.New(fmt.Sprintf("failed to get node topology with error: %v", err)) + } + + topology := make(map[string]string) + for key, value := range k8sNode.Labels { + if match, err := regexp.MatchString(topologyRegx, key); err == nil && match { + topology[key] = value + } + } + + return topology, nil +} + +func (k *KubeClient) getNode(nodeName string) (*corev1.Node, error) { + return k.clientSet.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{}) +} diff --git a/yamls/deploy/huawei-csi-controller.yaml b/yamls/deploy/huawei-csi-controller.yaml index ca43b9bb..069d553c 100644 --- a/yamls/deploy/huawei-csi-controller.yaml +++ b/yamls/deploy/huawei-csi-controller.yaml @@ -52,6 +52,11 @@ spec: env: - name: CSI_ENDPOINT value: /var/lib/csi/sockets/pluginproxy/csi.sock + - name: CSI_NODENAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName imagePullPolicy: "IfNotPresent" volumeMounts: - name: socket-dir diff --git a/yamls/deploy/huawei-csi-multi-controller.yaml b/yamls/deploy/huawei-csi-multi-controller.yaml index b21753d7..1a988278 100644 --- a/yamls/deploy/huawei-csi-multi-controller.yaml +++ b/yamls/deploy/huawei-csi-multi-controller.yaml @@ -55,6 +55,11 @@ spec: env: - name: CSI_ENDPOINT value: /var/lib/csi/sockets/pluginproxy/csi.sock + - name: CSI_NODENAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName imagePullPolicy: "IfNotPresent" volumeMounts: - name: socket-dir diff --git a/yamls/deploy/huawei-csi-node.yaml b/yamls/deploy/huawei-csi-node.yaml index 760694d4..b612187c 100644 --- a/yamls/deploy/huawei-csi-node.yaml +++ b/yamls/deploy/huawei-csi-node.yaml @@ -36,6 +36,12 @@ spec: - "--containerized" - "--driver-name=csi.huawei.com" - "--volume-use-multipath=true" + env: + - name: CSI_NODENAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName securityContext: privileged: true capabilities: diff --git a/yamls/deploy/huawei-csi-rbac.yaml b/yamls/deploy/huawei-csi-rbac.yaml index f90380a2..6e81156d 100644 --- a/yamls/deploy/huawei-csi-rbac.yaml +++ b/yamls/deploy/huawei-csi-rbac.yaml @@ -100,6 +100,9 @@ rules: - apiGroups: [""] resources: ["events"] verbs: ["get", "list", "watch", "create", "update", "patch"] + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get"] --- kind: ClusterRoleBinding diff --git a/yamls/deploy/huawei-csi-resize-controller.yaml b/yamls/deploy/huawei-csi-resize-controller.yaml index c2df7794..a3b19afb 100644 --- a/yamls/deploy/huawei-csi-resize-controller.yaml +++ b/yamls/deploy/huawei-csi-resize-controller.yaml @@ -65,6 +65,11 @@ spec: env: - name: CSI_ENDPOINT value: /var/lib/csi/sockets/pluginproxy/csi.sock + - name: CSI_NODENAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName imagePullPolicy: "IfNotPresent" volumeMounts: - name: socket-dir diff --git a/yamls/deploy/huawei-csi-resize-rbac.yaml b/yamls/deploy/huawei-csi-resize-rbac.yaml index 57e11aee..3ca0f90b 100644 --- a/yamls/deploy/huawei-csi-resize-rbac.yaml +++ b/yamls/deploy/huawei-csi-resize-rbac.yaml @@ -164,6 +164,9 @@ rules: - apiGroups: [""] resources: ["events"] verbs: ["get", "list", "watch", "create", "update", "patch"] + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get"] --- kind: ClusterRoleBinding diff --git a/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml b/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml index c4835271..f78729cb 100644 --- a/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml +++ b/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml @@ -88,6 +88,11 @@ spec: env: - name: CSI_ENDPOINT value: /var/lib/csi/sockets/pluginproxy/csi.sock + - name: CSI_NODENAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName imagePullPolicy: "IfNotPresent" volumeMounts: - name: socket-dir diff --git a/yamls/deploy/huawei-csi-resize-snapshot-rbac.yaml b/yamls/deploy/huawei-csi-resize-snapshot-rbac.yaml index 0a189402..779bf7a1 100644 --- a/yamls/deploy/huawei-csi-resize-snapshot-rbac.yaml +++ b/yamls/deploy/huawei-csi-resize-snapshot-rbac.yaml @@ -298,6 +298,9 @@ rules: - apiGroups: [""] resources: ["events"] verbs: ["get", "list", "watch", "create", "update", "patch"] + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get"] --- kind: ClusterRoleBinding From e8430c363cc75bd7d1da8e018be51a68407c531e Mon Sep 17 00:00:00 2001 From: Amit Roushan Date: Wed, 11 Aug 2021 18:26:29 +0530 Subject: [PATCH 2/4] eSDK support CSI Topology-Aware Volume Provisioning with Kubernetes design proposal --- .../resources/eSDKTopologyAwareness.jpg | Bin 0 -> 213580 bytes docs/design-proposals/topology-support.md | 305 ++++++++++++++++++ 2 files changed, 305 insertions(+) create mode 100644 docs/design-proposals/resources/eSDKTopologyAwareness.jpg create mode 100644 docs/design-proposals/topology-support.md diff --git a/docs/design-proposals/resources/eSDKTopologyAwareness.jpg b/docs/design-proposals/resources/eSDKTopologyAwareness.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4acdbe3f0e78e329e751e2a832eaa470c89f3fca GIT binary patch literal 213580 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ð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%0DHb;<` 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 Date: Thu, 26 Aug 2021 14:27:17 +0530 Subject: [PATCH 3/4] enable topology aware scheduling --- src/csi/backend/backend.go | 232 +++++++++++++++--- src/csi/driver/controller.go | 27 ++ src/utils/utils.go | 2 +- yamls/deploy/huawei-csi-controller.yaml | 1 + yamls/deploy/huawei-csi-multi-controller.yaml | 1 + .../deploy/huawei-csi-resize-controller.yaml | 1 + ...huawei-csi-resize-snapshot-controller.yaml | 3 +- 7 files changed, 235 insertions(+), 32 deletions(-) diff --git a/src/csi/backend/backend.go b/src/csi/backend/backend.go index 95361f7b..314f0b58 100644 --- a/src/csi/backend/backend.go +++ b/src/csi/backend/backend.go @@ -4,12 +4,18 @@ import ( "csi/backend/plugin" "errors" "fmt" + "math/rand" "regexp" "sync" "utils" "utils/log" ) +const ( + TopologyRequirement = "topologyRequirement" + SupportedTopologies = "supportedTopologies" +) + var ( mutex sync.Mutex csiBackends = make(map[string]*Backend) @@ -22,6 +28,7 @@ var ( {"qos", filterByQos}, {"hyperMetro", filterByMetro}, {"replication", filterByReplication}, + {TopologyRequirement, filterByTopology}, } secondaryFilterFuncs = [][]interface{}{ @@ -32,6 +39,11 @@ var ( } ) +type AccessibleTopology struct { + RequisiteTopologies []map[string]string + PreferredTopologies []map[string]string +} + type StoragePool struct { Name string Storage string @@ -41,12 +53,13 @@ type StoragePool struct { } type Backend struct { - Name string - Storage string - Available bool - Plugin plugin.Plugin - Pools []*StoragePool - Parameters map[string]interface{} + Name string + Storage string + Available bool + Plugin plugin.Plugin + Pools []*StoragePool + Parameters map[string]interface{} + SupportedTopologies []map[string]string MetroDomain string MetrovStorePairID string @@ -109,6 +122,28 @@ func newBackend(backendName string, config map[string]interface{}) (*Backend, er return nil, errors.New("parameters must be configured for backend") } + supportedTopologies := make([]map[string]string, 0) + if topologies, exist := config[SupportedTopologies]; exist { + topologyArray, ok := topologies.([]interface{}) + if !ok { + return nil, errors.New("invalid supported topologies configuration") + } + for _, topologyArrElem := range topologyArray { + topologyMap, ok := topologyArrElem.(map[string]interface{}) + if !ok { + return nil, errors.New("invalid supported topologies configuration") + } + tempMap := make(map[string]string, 0) + for topologyKey, value := range topologyMap { + if topologyValue, ok := value.(string); ok { + tempMap[topologyKey] = topologyValue + } + } + + supportedTopologies = append(supportedTopologies, tempMap) + } + } + plugin := plugin.GetPlugin(storage) if plugin == nil { return nil, fmt.Errorf("Cannot get plugin for storage %s", storage) @@ -126,15 +161,16 @@ func newBackend(backendName string, config map[string]interface{}) (*Backend, er } return &Backend{ - Name: backendName, - Storage: storage, - Available: false, - Plugin: plugin, - Parameters: parameters, - MetroDomain: metroDomain, - MetrovStorePairID: metrovStorePairID, - ReplicaBackendName: replicaBackend, - MetroBackendName: metroBackend, + Name: backendName, + Storage: storage, + Available: false, + SupportedTopologies: supportedTopologies, + Plugin: plugin, + Parameters: parameters, + MetroDomain: metroDomain, + MetrovStorePairID: metrovStorePairID, + ReplicaBackendName: replicaBackend, + MetroBackendName: metroBackend, }, nil } @@ -269,12 +305,14 @@ func selectOnePool(requestSize int64, } for _, i := range filterFuncs { - key, filter := i[0].(string), i[1].(func(string, []*StoragePool) []*StoragePool) - value, _ := parameters[key].(string) - filterPools = filter(value, filterPools) - if len(filterPools) == 0 { - return nil, fmt.Errorf("failed to select pool, the last filter field: %s, parameters %v", - key, parameters) + key, filter := i[0].(string), i[1].(func(interface{}, []*StoragePool) []*StoragePool) + value, exists := parameters[key] + if exists { + filterPools = filter(value, filterPools) + if len(filterPools) == 0 { + return nil, fmt.Errorf("failed to select pool, the last filter field: %s, parameters %v", + key, parameters) + } } } @@ -354,9 +392,14 @@ func SelectStoragePool(requestSize int64, parameters map[string]interface{}) (*S return localPool, remotePool, nil } -func filterByBackendName(backendName string, candidatePools []*StoragePool) []*StoragePool { +func filterByBackendName(iBackendName interface{}, candidatePools []*StoragePool) []*StoragePool { var filterPools []*StoragePool + backendName, ok := iBackendName.(string) + if !ok { + return candidatePools + } + for _, pool := range candidatePools { if backendName == "" || backendName == pool.Parent { filterPools = append(filterPools, pool) @@ -366,9 +409,14 @@ func filterByBackendName(backendName string, candidatePools []*StoragePool) []*S return filterPools } -func filterByStoragePool(poolName string, candidatePools []*StoragePool) []*StoragePool { +func filterByStoragePool(iPoolName interface{}, candidatePools []*StoragePool) []*StoragePool { var filterPools []*StoragePool + poolName, ok := iPoolName.(string) + if !ok { + return candidatePools + } + for _, pool := range candidatePools { if poolName == "" || poolName == pool.Name { filterPools = append(filterPools, pool) @@ -378,9 +426,14 @@ func filterByStoragePool(poolName string, candidatePools []*StoragePool) []*Stor return filterPools } -func filterByVolumeType(volumeType string, candidatePools []*StoragePool) []*StoragePool { +func filterByVolumeType(iVolumeType interface{}, candidatePools []*StoragePool) []*StoragePool { var filterPools []*StoragePool + volumeType, ok := iVolumeType.(string) + if !ok { + return candidatePools + } + for _, pool := range candidatePools { if volumeType == "lun" || volumeType == "" { if pool.Storage == "oceanstor-san" || pool.Storage == "fusionstorage-san" { @@ -396,9 +449,14 @@ func filterByVolumeType(volumeType string, candidatePools []*StoragePool) []*Sto return filterPools } -func filterByAllocType(allocType string, candidatePools []*StoragePool) []*StoragePool { +func filterByAllocType(iAllocType interface{}, candidatePools []*StoragePool) []*StoragePool { var filterPools []*StoragePool + allocType, ok := iAllocType.(string) + if !ok { + return candidatePools + } + for _, pool := range candidatePools { valid := false @@ -420,9 +478,14 @@ func filterByAllocType(allocType string, candidatePools []*StoragePool) []*Stora return filterPools } -func filterByQos(qos string, candidatePools []*StoragePool) []*StoragePool { +func filterByQos(iqos interface{}, candidatePools []*StoragePool) []*StoragePool { var filterPools []*StoragePool + qos, ok := iqos.(string) + if !ok { + return candidatePools + } + for _, pool := range candidatePools { if qos != "" { supportQoS, exist := pool.Capabilities["SupportQoS"].(bool) @@ -437,8 +500,9 @@ func filterByQos(qos string, candidatePools []*StoragePool) []*StoragePool { return filterPools } -func filterByMetro(hyperMetro string, candidatePools []*StoragePool) []*StoragePool { - if len(hyperMetro) == 0 || !utils.StrToBool(hyperMetro) { +func filterByMetro(iHyperMetro interface{}, candidatePools []*StoragePool) []*StoragePool { + hyperMetro, ok := iHyperMetro.(string) + if !ok || len(hyperMetro) == 0 || !utils.StrToBool(hyperMetro) { return candidatePools } @@ -458,8 +522,9 @@ func filterByMetro(hyperMetro string, candidatePools []*StoragePool) []*StorageP return filterPools } -func filterByReplication(replication string, candidatePools []*StoragePool) []*StoragePool { - if len(replication) == 0 || !utils.StrToBool(replication) { +func filterByReplication(iReplication interface{}, candidatePools []*StoragePool) []*StoragePool { + replication, ok := iReplication.(string) + if !ok || len(replication) == 0 || !utils.StrToBool(replication) { return candidatePools } @@ -478,3 +543,110 @@ func filterByReplication(replication string, candidatePools []*StoragePool) []*S return filterPools } + +// filterByTopology returns a subset of the provided pools that can support any of the topology requirement. +func filterByTopology(iTopologyRequirement interface{}, candidatePools []*StoragePool) []*StoragePool { + topologyRequirement, ok := iTopologyRequirement.(AccessibleTopology) + if !ok || len(topologyRequirement.RequisiteTopologies) == 0 { + return candidatePools + } + + filterPools := filterPoolsOnTopology(candidatePools, topologyRequirement.RequisiteTopologies) + if len(filterPools) == 0 { + log.Infoln("no backend pools support any requisite topologies") + } + return sortPoolsByPreferredTopologies(filterPools, topologyRequirement.PreferredTopologies) +} + +// isTopologySupportedByBackend returns whether the specific backend can create volumes accessible by the given topology +func isTopologySupportedByBackend(backend *Backend, topology map[string]string) bool { + requisiteFound := false + for _, supported := range backend.SupportedTopologies { + eachFound := true + for k, v := range topology { + if sup, ok := supported[k]; !ok || (sup != v) { + eachFound = false + break + } + } + if eachFound { + requisiteFound = true + } + } + return requisiteFound +} + +// filterPoolsOnTopology returns a subset of the provided pools that can support any of the requisiteTopologies. +func filterPoolsOnTopology(candidatePools []*StoragePool, requisiteTopologies []map[string]string) []*StoragePool { + filteredPools := make([]*StoragePool, 0) + + if len(requisiteTopologies) == 0 { + return candidatePools + } + + for _, pool := range candidatePools { + backend, exist := csiBackends[pool.Parent] + if !exist { + continue + } + + if len(backend.SupportedTopologies) > 0 { + for _, topology := range requisiteTopologies { + if isTopologySupportedByBackend(backend, topology) { + filteredPools = append(filteredPools, pool) + break + } + } + } else { + filteredPools = append(filteredPools, pool) + } + } + + return filteredPools +} + +// sortPoolsByPreferredTopologies returns a list of pools ordered by the pools supportedTopologies field against +// the provided list of preferredTopologies. If 2 or more pools can support a given preferredTopology, they are shuffled +// randomly within that segment of the list, in order to prevent hotspots. +func sortPoolsByPreferredTopologies(candidatePools []*StoragePool, preferredTopologies []map[string]string) []*StoragePool { + remainingPools := make([]*StoragePool, len(candidatePools)) + copy(remainingPools, candidatePools) + orderedPools := make([]*StoragePool, 0) + + for _, preferred := range preferredTopologies { + newRemainingPools := make([]*StoragePool, 0) + poolBucket := make([]*StoragePool, 0) + + for _, pool := range remainingPools { + backend, exist := csiBackends[pool.Parent] + if !exist { + continue + } + // If it supports topology, pop it and add to bucket. Otherwise, add it to newRemaining pools to be + // addressed in future loop iterations. + if isTopologySupportedByBackend(backend, preferred) { + poolBucket = append(poolBucket, pool) + } else { + newRemainingPools = append(newRemainingPools, pool) + } + } + + // make new list of remaining pools + remainingPools = make([]*StoragePool, len(newRemainingPools)) + copy(remainingPools, newRemainingPools) + + // shuffle bucket + rand.Shuffle(len(poolBucket), func(i, j int) { + poolBucket[i], poolBucket[j] = poolBucket[j], poolBucket[i] + }) + + // add all in bucket to final list + orderedPools = append(orderedPools, poolBucket...) + } + + // shuffle and add leftover pools the did not match any preference + rand.Shuffle(len(remainingPools), func(i, j int) { + remainingPools[i], remainingPools[j] = remainingPools[j], remainingPools[i] + }) + return append(orderedPools, remainingPools...) +} diff --git a/src/csi/driver/controller.go b/src/csi/driver/controller.go index 58d6f61d..8c38ae17 100644 --- a/src/csi/driver/controller.go +++ b/src/csi/driver/controller.go @@ -56,6 +56,33 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) } } + // Get topology requirements + accessibleTopology := req.GetAccessibilityRequirements() + if accessibleTopology != nil { + var requisiteTopologies = make([]map[string]string, 0) + for _, requisite := range accessibleTopology.GetRequisite() { + requirement := make(map[string]string) + for k, v := range requisite.GetSegments() { + requirement[k] = v + } + requisiteTopologies = append(requisiteTopologies, requirement) + } + + var preferredTopologies = make([]map[string]string, 0) + for _, preferred := range accessibleTopology.GetPreferred() { + preference := make(map[string]string) + for k, v := range preferred.GetSegments() { + preference[k] = v + } + preferredTopologies = append(preferredTopologies, preference) + } + + parameters[backend.TopologyRequirement] = backend.AccessibleTopology{ + RequisiteTopologies: requisiteTopologies, + PreferredTopologies: preferredTopologies, + } + } + localPool, remotePool, err := backend.SelectStoragePool(size, parameters) if err != nil { log.Errorf("Cannot select pool for volume creation: %v", err) diff --git a/src/utils/utils.go b/src/utils/utils.go index 265fe361..be1fd2ca 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -513,4 +513,4 @@ func NeedMultiPath(backendConfigs []map[string]interface{}) bool { } return needMultiPath -} +} \ No newline at end of file diff --git a/yamls/deploy/huawei-csi-controller.yaml b/yamls/deploy/huawei-csi-controller.yaml index 069d553c..a9f8eaf3 100644 --- a/yamls/deploy/huawei-csi-controller.yaml +++ b/yamls/deploy/huawei-csi-controller.yaml @@ -22,6 +22,7 @@ spec: args: - "--csi-address=$(ADDRESS)" - "--timeout=6h" + - "--feature-gates=Topology=true" env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock diff --git a/yamls/deploy/huawei-csi-multi-controller.yaml b/yamls/deploy/huawei-csi-multi-controller.yaml index 1a988278..a2772f24 100644 --- a/yamls/deploy/huawei-csi-multi-controller.yaml +++ b/yamls/deploy/huawei-csi-multi-controller.yaml @@ -23,6 +23,7 @@ spec: - "--csi-address=$(ADDRESS)" - "--timeout=6h" - "--enable-leader-election" + - "--feature-gates=Topology=true" env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock diff --git a/yamls/deploy/huawei-csi-resize-controller.yaml b/yamls/deploy/huawei-csi-resize-controller.yaml index a3b19afb..df25a03e 100644 --- a/yamls/deploy/huawei-csi-resize-controller.yaml +++ b/yamls/deploy/huawei-csi-resize-controller.yaml @@ -22,6 +22,7 @@ spec: args: - "--csi-address=$(ADDRESS)" - "--timeout=6h" + - "--feature-gates=Topology=true" env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock diff --git a/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml b/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml index f78729cb..ef5a2c5e 100644 --- a/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml +++ b/yamls/deploy/huawei-csi-resize-snapshot-controller.yaml @@ -22,6 +22,7 @@ spec: args: - "--csi-address=$(ADDRESS)" - "--timeout=6h" + - "--feature-gates=Topology=true" env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock @@ -115,4 +116,4 @@ spec: name: huawei-csi-configmap - name: secret secret: - secretName: huawei-csi-secret \ No newline at end of file + secretName: huawei-csi-secret From b616bf6ac85bab40c1ff589ea98aeeb5e72e8a7b Mon Sep 17 00:00:00 2001 From: Amit Roushan Date: Thu, 2 Sep 2021 22:25:52 +0530 Subject: [PATCH 4/4] added code changes for protocol topological awarness --- src/csi/backend/backend.go | 119 ++++++++++++++++++------- src/csi/driver/controller.go | 152 ++++++++++++++++++++------------ src/csi/main.go | 6 +- src/utils/k8sutils/k8s_utils.go | 94 ++++++++++++++++++++ src/utils/k8sutils/k8sutils.go | 75 ---------------- 5 files changed, 280 insertions(+), 166 deletions(-) create mode 100644 src/utils/k8sutils/k8s_utils.go delete mode 100644 src/utils/k8sutils/k8sutils.go diff --git a/src/csi/backend/backend.go b/src/csi/backend/backend.go index 314f0b58..5bc074c2 100644 --- a/src/csi/backend/backend.go +++ b/src/csi/backend/backend.go @@ -8,12 +8,15 @@ import ( "regexp" "sync" "utils" + "utils/k8sutils" "utils/log" ) const ( + // TopologyRequirement constant for topology filter function TopologyRequirement = "topologyRequirement" - SupportedTopologies = "supportedTopologies" + // supported topology key in CSI plugin configuration + supportedTopologiesKey = "supportedTopologies" ) var ( @@ -39,6 +42,7 @@ var ( } ) +// AccessibleTopology represents selected node topology type AccessibleTopology struct { RequisiteTopologies []map[string]string PreferredTopologies []map[string]string @@ -122,26 +126,10 @@ func newBackend(backendName string, config map[string]interface{}) (*Backend, er return nil, errors.New("parameters must be configured for backend") } - supportedTopologies := make([]map[string]string, 0) - if topologies, exist := config[SupportedTopologies]; exist { - topologyArray, ok := topologies.([]interface{}) - if !ok { - return nil, errors.New("invalid supported topologies configuration") - } - for _, topologyArrElem := range topologyArray { - topologyMap, ok := topologyArrElem.(map[string]interface{}) - if !ok { - return nil, errors.New("invalid supported topologies configuration") - } - tempMap := make(map[string]string, 0) - for topologyKey, value := range topologyMap { - if topologyValue, ok := value.(string); ok { - tempMap[topologyKey] = topologyValue - } - } - - supportedTopologies = append(supportedTopologies, tempMap) - } + // Get supported topologies for backend + supportedTopologies, err := getSupportedTopologies(config) + if err != nil { + return nil, err } plugin := plugin.GetPlugin(storage) @@ -174,6 +162,50 @@ func newBackend(backendName string, config map[string]interface{}) (*Backend, er }, nil } +func getSupportedTopologies(config map[string]interface{}) ([]map[string]string, error) { + supportedTopologies := make([]map[string]string, 0) + + topologies, exist := config[supportedTopologiesKey] + if !exist { + return supportedTopologies, nil + } + + // populate configured topologies + topologyArray, ok := topologies.([]interface{}) + if !ok { + return nil, errors.New("invalid supported topologies configuration") + } + for _, topologyArrElem := range topologyArray { + topologyMap, ok := topologyArrElem.(map[string]interface{}) + if !ok { + return nil, errors.New("invalid supported topologies configuration") + } + tempMap := make(map[string]string, 0) + for topologyKey, value := range topologyMap { + if topologyValue, ok := value.(string); ok { + tempMap[topologyKey] = topologyValue + } + } + supportedTopologies = append(supportedTopologies, tempMap) + } + + return supportedTopologies, nil +} + +// addProtocolTopology add up protocol specific topological support +func addProtocolTopology(backend *Backend, driverName string) { + proto, protocolAvailable := backend.Parameters["protocol"] + if protocol, isString := proto.(string); protocolAvailable && isString { + backend.SupportedTopologies = append(backend.SupportedTopologies, map[string]string{ + k8sutils.TopologyPrefix + "/protocol." + protocol: driverName, + }) + return + } + + log.Warningf("supported topology for protocol may not work as protocol is miss configured " + + "in backend configuration") +} + func analyzeBackend(config map[string]interface{}) (*Backend, error) { backendName, exist := config["name"].(string) if !exist { @@ -245,7 +277,7 @@ func updateReplicaBackends() { } } -func RegisterBackend(backendConfigs []map[string]interface{}, keepLogin bool) error { +func RegisterBackend(backendConfigs []map[string]interface{}, keepLogin bool, driverName string) error { for _, i := range backendConfigs { backend, err := analyzeBackend(i) if err != nil { @@ -259,6 +291,18 @@ func RegisterBackend(backendConfigs []map[string]interface{}, keepLogin bool) er return err } + // Note: Protocol is considered as special topological parameter. The protocol topology + // is populated internally by plugin using protocol name. + // If configured protocol for backend is "iscsi", CSI plugin internally add + // topology.kubernetes.io/protocol.iscsi = csi.huawei.com in supportedTopologies. + // + // Now users can opt to provision volumes based on protocol by + // 1. Labeling kubernetes nodes with protocol specific label (ie topology.kubernetes.io/protocol.iscsi = csi.huawei.com) + // 2. Configure topology support in plugin + // 3. Configure protocol topology in allowedTopologies fo Storage class + // addProtocolTopology is called after backend plugin init as init takes care of protocol validation + addProtocolTopology(backend, driverName) + csiBackends[backend.Name] = backend } @@ -585,20 +629,23 @@ func filterPoolsOnTopology(candidatePools []*StoragePool, requisiteTopologies [] } for _, pool := range candidatePools { + // mutex lock acquired in pool selection backend, exist := csiBackends[pool.Parent] if !exist { continue } - if len(backend.SupportedTopologies) > 0 { - for _, topology := range requisiteTopologies { - if isTopologySupportedByBackend(backend, topology) { - filteredPools = append(filteredPools, pool) - break - } - } - } else { + // when backend is not configured with supported topology + if len(backend.SupportedTopologies) == 0 { filteredPools = append(filteredPools, pool) + continue + } + + for _, topology := range requisiteTopologies { + if isTopologySupportedByBackend(backend, topology) { + filteredPools = append(filteredPools, pool) + break + } } } @@ -650,3 +697,15 @@ func sortPoolsByPreferredTopologies(candidatePools []*StoragePool, preferredTopo }) return append(orderedPools, remainingPools...) } + +func (pool *StoragePool) GetSupportedTopologies() []map[string]string { + mutex.Lock() + defer mutex.Unlock() + backend, exist := csiBackends[pool.Parent] + if !exist { + log.Warningf("Backend [%v] does not exist in CSI backend pool", pool.Parent) + return make([]map[string]string, 0) + } + + return backend.SupportedTopologies +} diff --git a/src/csi/driver/controller.go b/src/csi/driver/controller.go index 8c38ae17..ccdcf4e7 100644 --- a/src/csi/driver/controller.go +++ b/src/csi/driver/controller.go @@ -35,53 +35,14 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) parameters["backend"], parameters["cloneFrom"] = utils.SplitVolumeId(cloneFrom) } - contentSource := req.GetVolumeContentSource() - if contentSource != nil { - if contentSnapshot := contentSource.GetSnapshot(); contentSnapshot != nil { - sourceSnapshotId := contentSnapshot.GetSnapshotId() - sourceBackendName, snapshotParentId, sourceSnapshotName := utils.SplitSnapshotId(sourceSnapshotId) - parameters["sourceSnapshotName"] = sourceSnapshotName - parameters["snapshotParentId"] = snapshotParentId - parameters["backend"] = sourceBackendName - log.Infof("Start to create volume from snapshot %s", sourceSnapshotName) - } else if contentVolume := contentSource.GetVolume(); contentVolume != nil { - sourceVolumeId := contentVolume.GetVolumeId() - sourceBackendName, sourceVolumeName := utils.SplitVolumeId(sourceVolumeId) - parameters["sourceVolumeName"] = sourceVolumeName - parameters["backend"] = sourceBackendName - log.Infof("Start to create volume from volume %s", sourceVolumeName) - } else { - log.Errorf("The source %s is not snapshot either volume", contentSource) - return nil, status.Error(codes.InvalidArgument, "no source ID provided is invalid") - } + // process volume content source + err := d.processVolumeContentSource(req, parameters) + if err != nil { + return nil, err } - // Get topology requirements - accessibleTopology := req.GetAccessibilityRequirements() - if accessibleTopology != nil { - var requisiteTopologies = make([]map[string]string, 0) - for _, requisite := range accessibleTopology.GetRequisite() { - requirement := make(map[string]string) - for k, v := range requisite.GetSegments() { - requirement[k] = v - } - requisiteTopologies = append(requisiteTopologies, requirement) - } - - var preferredTopologies = make([]map[string]string, 0) - for _, preferred := range accessibleTopology.GetPreferred() { - preference := make(map[string]string) - for k, v := range preferred.GetSegments() { - preference[k] = v - } - preferredTopologies = append(preferredTopologies, preference) - } - - parameters[backend.TopologyRequirement] = backend.AccessibleTopology{ - RequisiteTopologies: requisiteTopologies, - PreferredTopologies: preferredTopologies, - } - } + // process accessibility requirements + d.processAccessibilityRequirements(req, parameters) localPool, remotePool, err := backend.SelectStoragePool(size, parameters) if err != nil { @@ -104,30 +65,105 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) log.Infof("Volume %s is created", name) + volume, err := d.getCreatedVolume(req, volName, localPool) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return &csi.CreateVolumeResponse{ + Volume: volume, + }, nil +} + +func (d *Driver) getCreatedVolume(req *csi.CreateVolumeRequest, volName string, pool *backend.StoragePool) (*csi.Volume, error) { + contentSource := req.GetVolumeContentSource() + size := req.GetCapacityRange().GetRequiredBytes() + + accessibleTopologies := make([]*csi.Topology, 0) + supportedTopology := pool.GetSupportedTopologies() + if len(supportedTopology) > 0 { + for _, segment := range supportedTopology { + accessibleTopologies = append(accessibleTopologies, &csi.Topology{Segments: segment}) + } + } + if contentSource != nil { attributes := map[string]string{ - "backend": localPool.Parent, + "backend": pool.Parent, "name": volName, } - return &csi.CreateVolumeResponse{ - Volume: &csi.Volume{ - VolumeId: localPool.Parent + "." + volName, - CapacityBytes: size, - VolumeContext: attributes, - ContentSource: req.VolumeContentSource, - }, + return &csi.Volume{ + VolumeId: pool.Parent + "." + volName, + CapacityBytes: size, + VolumeContext: attributes, + ContentSource: contentSource, + AccessibleTopology: accessibleTopologies, }, nil } - return &csi.CreateVolumeResponse{ - Volume: &csi.Volume{ - VolumeId: localPool.Parent + "." + volName, - CapacityBytes: size, - }, + return &csi.Volume{ + VolumeId: pool.Parent + "." + volName, + CapacityBytes: size, + AccessibleTopology: accessibleTopologies, }, nil } +func (d *Driver) processVolumeContentSource(req *csi.CreateVolumeRequest, parameters map[string]interface{}) error { + contentSource := req.GetVolumeContentSource() + if contentSource != nil { + if contentSnapshot := contentSource.GetSnapshot(); contentSnapshot != nil { + sourceSnapshotId := contentSnapshot.GetSnapshotId() + sourceBackendName, snapshotParentId, sourceSnapshotName := utils.SplitSnapshotId(sourceSnapshotId) + parameters["sourceSnapshotName"] = sourceSnapshotName + parameters["snapshotParentId"] = snapshotParentId + parameters["backend"] = sourceBackendName + log.Infof("Start to create volume from snapshot %s", sourceSnapshotName) + } else if contentVolume := contentSource.GetVolume(); contentVolume != nil { + sourceVolumeId := contentVolume.GetVolumeId() + sourceBackendName, sourceVolumeName := utils.SplitVolumeId(sourceVolumeId) + parameters["sourceVolumeName"] = sourceVolumeName + parameters["backend"] = sourceBackendName + log.Infof("Start to create volume from volume %s", sourceVolumeName) + } else { + log.Errorf("The source %s is not snapshot either volume", contentSource) + return status.Error(codes.InvalidArgument, "no source ID provided is invalid") + } + } + + return nil +} + +func (d *Driver) processAccessibilityRequirements(req *csi.CreateVolumeRequest, parameters map[string]interface{}) { + accessibleTopology := req.GetAccessibilityRequirements() + if accessibleTopology == nil { + return + } + + var requisiteTopologies = make([]map[string]string, 0) + for _, requisite := range accessibleTopology.GetRequisite() { + requirement := make(map[string]string) + for k, v := range requisite.GetSegments() { + requirement[k] = v + } + requisiteTopologies = append(requisiteTopologies, requirement) + } + + var preferredTopologies = make([]map[string]string, 0) + for _, preferred := range accessibleTopology.GetPreferred() { + preference := make(map[string]string) + for k, v := range preferred.GetSegments() { + preference[k] = v + } + preferredTopologies = append(preferredTopologies, preference) + } + + parameters[backend.TopologyRequirement] = backend.AccessibleTopology{ + RequisiteTopologies: requisiteTopologies, + PreferredTopologies: preferredTopologies, + } +} + func (d *Driver) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) { volumeId := req.GetVolumeId() diff --git a/src/csi/main.go b/src/csi/main.go index 5f781d14..66b2860d 100644 --- a/src/csi/main.go +++ b/src/csi/main.go @@ -62,7 +62,7 @@ var ( "absolute path to the kubeconfig file") nodeName = flag.String("nodename", os.Getenv(nodeNameEnv), - "absolute path to the kubeconfig file") + "node name in kubernetes cluster") config CSIConfig secret CSISecret @@ -182,14 +182,14 @@ func main() { }() if *controller || *controllerFlagFile != "" { - err := backend.RegisterBackend(config.Backends, true) + err := backend.RegisterBackend(config.Backends, true, *driverName) if err != nil { log.Fatalf("Register backends error: %v", err) } go updateBackendCapabilities() } else { - err := backend.RegisterBackend(config.Backends, false) + err := backend.RegisterBackend(config.Backends, false, *driverName) if err != nil { log.Fatalf("Register backends error: %v", err) } diff --git a/src/utils/k8sutils/k8s_utils.go b/src/utils/k8sutils/k8s_utils.go new file mode 100644 index 00000000..8a38ec75 --- /dev/null +++ b/src/utils/k8sutils/k8s_utils.go @@ -0,0 +1,94 @@ +/* + Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +// Package k8sutils provides Kubernetes utilities +package k8sutils + +import ( + "fmt" + "regexp" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" +) + +const ( + // TopologyPrefix supported by CSI plugin + TopologyPrefix = "topology.kubernetes.io" + topologyRegx = TopologyPrefix + "/.*" +) + +// Interface is a kubernetes utility interface required by CSI plugin to interact with Kubernetes +type Interface interface { + // GetNodeTopology returns configured kubernetes node's topological labels + GetNodeTopology(nodeName string) (map[string]string, error) +} + +type kubeClient struct { + clientSet *kubernetes.Clientset +} + +// NewK8SUtils returns an object of Kubernetes utility interface +func NewK8SUtils(kubeConfig string) (Interface, error) { + var clientset *kubernetes.Clientset + + if kubeConfig != "" { + config, err := clientcmd.BuildConfigFromFlags("", kubeConfig) + if err != nil { + return nil, err + } + + clientset, err = kubernetes.NewForConfig(config) + if err != nil { + return nil, err + } + } else { + config, err := rest.InClusterConfig() + if err != nil { + return nil, err + } + + clientset, err = kubernetes.NewForConfig(config) + if err != nil { + return nil, err + } + } + + return &kubeClient{ + clientSet: clientset, + }, nil +} + +func (k *kubeClient) GetNodeTopology(nodeName string) (map[string]string, error) { + k8sNode, err := k.getNode(nodeName) + if err != nil { + return nil, fmt.Errorf("failed to get node topology with error: %v", err) + } + + topology := make(map[string]string) + for key, value := range k8sNode.Labels { + if match, err := regexp.MatchString(topologyRegx, key); err == nil && match { + topology[key] = value + } + } + + return topology, nil +} + +func (k *kubeClient) getNode(nodeName string) (*corev1.Node, error) { + return k.clientSet.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{}) +} diff --git a/src/utils/k8sutils/k8sutils.go b/src/utils/k8sutils/k8sutils.go deleted file mode 100644 index dff1deac..00000000 --- a/src/utils/k8sutils/k8sutils.go +++ /dev/null @@ -1,75 +0,0 @@ -package k8sutils - -import ( - "errors" - "fmt" - "regexp" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" -) - -const ( - topologyRegx = "topology.kubernetes.io/*" -) - -type Interface interface { - GetNodeTopology(nodeName string) (map[string]string, error) -} - -type KubeClient struct { - clientSet *kubernetes.Clientset -} - -func NewK8SUtils(kubeConfig string) (Interface, error) { - var clientset *kubernetes.Clientset - - if kubeConfig != "" { - config, err := clientcmd.BuildConfigFromFlags("", kubeConfig) - if err != nil { - return nil, err - } - - clientset, err = kubernetes.NewForConfig(config) - if err != nil { - return nil, err - } - } else { - config, err := rest.InClusterConfig() - if err != nil { - return nil, err - } - - clientset, err = kubernetes.NewForConfig(config) - if err != nil { - return nil, err - } - } - - return &KubeClient{ - clientSet: clientset, - }, nil -} - -func (k *KubeClient) GetNodeTopology(nodeName string) (map[string]string, error) { - k8sNode, err := k.getNode(nodeName) - if err != nil { - return nil, errors.New(fmt.Sprintf("failed to get node topology with error: %v", err)) - } - - topology := make(map[string]string) - for key, value := range k8sNode.Labels { - if match, err := regexp.MatchString(topologyRegx, key); err == nil && match { - topology[key] = value - } - } - - return topology, nil -} - -func (k *KubeClient) getNode(nodeName string) (*corev1.Node, error) { - return k.clientSet.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{}) -}