@@ -33,7 +33,6 @@ func (p *InstallControllers) Prepare(config *v1beta1.Cluster) error {
3333 p .hosts = p .Config .Spec .Hosts .Controllers ().Filter (func (h * cluster.Host ) bool {
3434 return ! h .Reset && ! h .Metadata .NeedsUpgrade && (h != p .leader && h .Metadata .K0sRunningVersion == nil )
3535 })
36-
3736 return nil
3837}
3938
@@ -65,13 +64,13 @@ func (p *InstallControllers) CleanUp() {
6564
6665func (p * InstallControllers ) After () error {
6766 for i , h := range p .hosts {
68- if h .Metadata .K0sJoinTokenID == "" {
67+ if h .Metadata .K0sTokenData . Token == "" {
6968 continue
7069 }
71- h .Metadata .K0sJoinToken = ""
70+ h .Metadata .K0sTokenData . Token = ""
7271 err := p .Wet (p .leader , fmt .Sprintf ("invalidate k0s join token for controller %s" , h ), func () error {
7372 log .Debugf ("%s: invalidating join token for controller %d" , p .leader , i + 1 )
74- return p .leader .Exec (p .leader .Configurer .K0sCmdf ("token invalidate --data-dir=%s %s" , p .leader .K0sDataDir (), h .Metadata .K0sJoinTokenID ), exec .Sudo (p .leader ))
73+ return p .leader .Exec (p .leader .Configurer .K0sCmdf ("token invalidate --data-dir=%s %s" , p .leader .K0sDataDir (), h .Metadata .K0sTokenData . ID ), exec .Sudo (p .leader ))
7574 })
7675 if err != nil {
7776 log .Warnf ("%s: failed to invalidate worker join token: %v" , p .leader , err )
@@ -88,54 +87,51 @@ func (p *InstallControllers) After() error {
8887
8988// Run the phase
9089func (p * InstallControllers ) Run () error {
91- url := p .Config .Spec .InternalKubeAPIURL ()
92- healthz := fmt .Sprintf ("%s/healthz" , url )
93-
94- err := p .parallelDo (p .hosts , func (h * cluster.Host ) error {
95- if p .IsWet () || ! p .leader .Metadata .DryRunFakeLeader {
96- log .Infof ("%s: validating api connection to %s" , h , url )
97- ctx , cancel := context .WithTimeout (context .Background (), 30 * time .Second )
98- defer cancel ()
99- if err := retry .Context (ctx , node .HTTPStatusFunc (h , healthz , 200 , 401 )); err != nil {
100- return fmt .Errorf ("failed to connect from controller to kubernetes api at %s - check networking" , url )
101- }
102- } else {
103- log .Warnf ("%s: dry-run: skipping api connection validation to %s because cluster is not running" , h , url )
104- }
105- return nil
106- })
107- if err != nil {
108- return err
109- }
110-
11190 for _ , h := range p .hosts {
112- var token string
113- var tokenID string
114-
11591 if p .IsWet () {
116- log .Infof ("%s: generating token" , p .leader )
117- token , err = p .Config .Spec .K0s .GenerateToken (
92+ log .Infof ("%s: generate join token for %s " , p .leader , h )
93+ token , err : = p .Config .Spec .K0s .GenerateToken (
11894 p .leader ,
11995 "controller" ,
12096 time .Duration (10 )* time .Minute ,
12197 )
12298 if err != nil {
12399 return err
124100 }
125- h .Metadata .K0sJoinToken = token
126- tokenID , err = cluster .TokenID (token )
101+ tokenData , err := cluster .ParseToken (token )
127102 if err != nil {
128103 return err
129104 }
130- log .Debugf ("%s: join token ID: %s" , p .leader , tokenID )
131- h .Metadata .K0sJoinTokenID = tokenID
105+ h .Metadata .K0sTokenData = tokenData
132106 } else {
133107 p .DryMsgf (p .leader , "generate a k0s join token for controller %s" , h )
134- h .Metadata .K0sJoinTokenID = "dry-run"
108+ h .Metadata .K0sTokenData .ID = "dry-run"
109+ h .Metadata .K0sTokenData .URL = p .Config .Spec .KubeAPIURL ()
135110 }
136-
137- log .Infof ("%s: writing join token" , h )
138- if err := h .Configurer .WriteFile (h , h .K0sJoinTokenPath (), h .Metadata .K0sJoinToken , "0640" ); err != nil {
111+ }
112+ err := p .parallelDo (p .hosts , func (h * cluster.Host ) error {
113+ if p .IsWet () || ! p .leader .Metadata .DryRunFakeLeader {
114+ log .Infof ("%s: validating api connection to %s" , h , h .Metadata .K0sTokenData .URL )
115+ ctx , cancel := context .WithTimeout (context .Background (), 30 * time .Second )
116+ defer cancel ()
117+ if err := retry .Context (ctx , node .HTTPStatusFunc (h , h .Metadata .K0sTokenData .URL , 200 , 401 , 404 )); err != nil {
118+ return fmt .Errorf ("failed to connect from controller to kubernetes api - check networking: %w" , err )
119+ }
120+ } else {
121+ log .Warnf ("%s: dry-run: skipping api connection validation to because cluster is not actually running" , h )
122+ }
123+ return nil
124+ })
125+ if err != nil {
126+ return err
127+ }
128+ return p .parallelDo (p .hosts , func (h * cluster.Host ) error {
129+ tokenPath := h .K0sJoinTokenPath ()
130+ log .Infof ("%s: writing join token to %s" , h , tokenPath )
131+ err := p .Wet (h , fmt .Sprintf ("write k0s join token to %s" , tokenPath ), func () error {
132+ return h .Configurer .WriteFile (h , tokenPath , h .Metadata .K0sTokenData .Token , "0600" )
133+ })
134+ if err != nil {
139135 return err
140136 }
141137
@@ -180,17 +176,22 @@ func (p *InstallControllers) Run() error {
180176 return err
181177 }
182178
183- if err := p .waitJoined (h ); err != nil {
184- return err
179+ ctx , cancel := context .WithTimeout (context .Background (), 30 * time .Second )
180+ defer cancel ()
181+ err := retry .Context (ctx , func (_ context.Context ) error {
182+ out , err := h .ExecOutput (h .Configurer .KubectlCmdf (h , h .K0sDataDir (), "get --raw='/readyz?verbose=true'" ), exec .Sudo (h ))
183+ if err != nil {
184+ return fmt .Errorf ("readiness endpoint reports %q: %w" , out , err )
185+ }
186+ return nil
187+ })
188+ if err != nil {
189+ return fmt .Errorf ("controller did not reach ready state: %w" , err )
185190 }
186- }
187- h .Metadata .Ready = true
188- }
189191
190- return nil
191- }
192+ h . Metadata . Ready = true
193+ }
192194
193- func (p * InstallControllers ) waitJoined (h * cluster.Host ) error {
194- log .Infof ("%s: waiting for kubernetes api to respond" , h )
195- return retry .Timeout (context .TODO (), retry .DefaultTimeout , node .KubeAPIReadyFunc (h , p .Config ))
195+ return nil
196+ })
196197}
0 commit comments