@@ -17,15 +17,14 @@ limitations under the License.
17
17
package csi
18
18
19
19
import (
20
+ "context"
20
21
"errors"
21
22
"fmt"
22
23
"os"
23
24
"path/filepath"
24
25
"strings"
25
26
"time"
26
27
27
- "context"
28
-
29
28
"k8s.io/klog"
30
29
31
30
api "k8s.io/api/core/v1"
@@ -256,7 +255,8 @@ func initializeCSINode(host volume.VolumeHost) error {
256
255
defer utilruntime .HandleCrash ()
257
256
258
257
// First wait indefinitely to talk to Kube APIServer
259
- err := waitForAPIServerForever (kubeClient )
258
+ nodeName := host .GetNodeName ()
259
+ err := waitForAPIServerForever (kubeClient , nodeName )
260
260
if err != nil {
261
261
klog .Fatalf ("Failed to initialize CSINode while waiting for API server to report ok: %v" , err )
262
262
}
@@ -921,20 +921,25 @@ func highestSupportedVersion(versions []string) (*utilversion.Version, error) {
921
921
return highestSupportedVersion , nil
922
922
}
923
923
924
- // waitForAPIServerForever waits forever to get the APIServer Version as a proxy
925
- // for a healthy APIServer.
926
- func waitForAPIServerForever (client clientset.Interface ) error {
924
+ // waitForAPIServerForever waits forever to get a CSINode instance as a proxy
925
+ // for a healthy APIServer
926
+ func waitForAPIServerForever (client clientset.Interface , nodeName types. NodeName ) error {
927
927
var lastErr error
928
- err := wait .PollInfinite (time .Second , func () (bool , error ) {
929
- _ , lastErr = client .Discovery ().ServerVersion ()
930
- if lastErr != nil {
931
- lastErr = fmt .Errorf ("failed to get apiserver version: %v" , lastErr )
932
- return false , nil
928
+ err := wait .PollImmediateInfinite (time .Second , func () (bool , error ) {
929
+ // Get a CSINode from API server to make sure 1) kubelet can reach API server
930
+ // and 2) it has enough permissions. Kubelet may have restricted permissions
931
+ // when it's bootstrapping TLS.
932
+ // https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/
933
+ _ , lastErr = client .StorageV1 ().CSINodes ().Get (context .TODO (), string (nodeName ), meta.GetOptions {})
934
+ if lastErr == nil || apierrors .IsNotFound (lastErr ) {
935
+ // API server contacted
936
+ return true , nil
933
937
}
934
-
935
- return true , nil
938
+ klog . V ( 2 ). Infof ( "Failed to contact API server when waiting for CSINode publishing: %s" , lastErr )
939
+ return false , nil
936
940
})
937
941
if err != nil {
942
+ // In theory this is unreachable, but just in case:
938
943
return fmt .Errorf ("%v: %v" , err , lastErr )
939
944
}
940
945
0 commit comments