Commit 1a1ff2f7 authored by Darren Shepherd's avatar Darren Shepherd

Fix CSI initialization conflict

CSI is used by both the kubelet and kube-controller-manager. Both components will initialize the csiPlugin with different VolumeHost objects. The csiPlugin will then assign a global variable for the node info manager. It is then possible that the kubelet gets the credentials of the kube-controller-manager and that will cause CSI to fail.
parent 4702b531
...@@ -245,21 +245,25 @@ func (p *csiPlugin) Init(host volume.VolumeHost) error { ...@@ -245,21 +245,25 @@ func (p *csiPlugin) Init(host volume.VolumeHost) error {
} }
// Initializing the label management channels // Initializing the label management channels
nim = nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins) localNim := nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins)
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) && if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) &&
utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) { utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
// This function prevents Kubelet from posting Ready status until CSINodeInfo // This function prevents Kubelet from posting Ready status until CSINodeInfo
// is both installed and initialized // is both installed and initialized
if err := initializeCSINode(host); err != nil { if err := initializeCSINode(host, localNim); err != nil {
return fmt.Errorf("failed to initialize CSINodeInfo: %v", err) return fmt.Errorf("failed to initialize CSINodeInfo: %v", err)
} }
} }
if _, ok := host.(volume.KubeletVolumeHost); ok {
nim = localNim
}
return nil return nil
} }
func initializeCSINode(host volume.VolumeHost) error { func initializeCSINode(host volume.VolumeHost, nim nodeinfomanager.Interface) error {
kvh, ok := host.(volume.KubeletVolumeHost) kvh, ok := host.(volume.KubeletVolumeHost)
if !ok { if !ok {
klog.V(4).Info("Cast from VolumeHost to KubeletVolumeHost failed. Skipping CSINodeInfo initialization, not running on kubelet") klog.V(4).Info("Cast from VolumeHost to KubeletVolumeHost failed. Skipping CSINodeInfo initialization, not running on kubelet")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment