@@ -213,6 +213,10 @@ func (r *RayClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
213
213
return ctrl.Result {RequeueAfter : requeueTime }, err
214
214
}
215
215
216
+ if err := r .deleteHeadPodIfMissingImagePullSecrets (ctx , cluster ); err != nil {
217
+ return ctrl.Result {RequeueAfter : requeueTime }, err
218
+ }
219
+
216
220
_ , err = r .kubeClient .RbacV1 ().ClusterRoleBindings ().Apply (ctx , desiredOAuthClusterRoleBinding (cluster ), metav1.ApplyOptions {FieldManager : controllerName , Force : true })
217
221
if err != nil {
218
222
logger .Error (err , "Failed to update OAuth ClusterRoleBinding" )
@@ -470,6 +474,7 @@ func generateCACertificate() ([]byte, []byte, error) {
470
474
471
475
return privateKeyPem , certPem , nil
472
476
}
477
+
473
478
func desiredWorkersNetworkPolicy (cluster * rayv1.RayCluster ) * networkingv1ac.NetworkPolicyApplyConfiguration {
474
479
return networkingv1ac .NetworkPolicy (cluster .Name + "-workers" , cluster .Namespace ).
475
480
WithLabels (map [string ]string {RayClusterNameLabel : cluster .Name }).
@@ -486,6 +491,7 @@ func desiredWorkersNetworkPolicy(cluster *rayv1.RayCluster) *networkingv1ac.Netw
486
491
metav1ac .OwnerReference ().WithUID (cluster .UID ).WithName (cluster .Name ).WithKind (cluster .Kind ).WithAPIVersion (cluster .APIVersion ).WithController (true ),
487
492
)
488
493
}
494
+
489
495
func desiredHeadNetworkPolicy (cluster * rayv1.RayCluster , cfg * config.KubeRayConfiguration , kubeRayNamespaces []string ) * networkingv1ac.NetworkPolicyApplyConfiguration {
490
496
allSecuredPorts := []* networkingv1ac.NetworkPolicyPortApplyConfiguration {
491
497
networkingv1ac .NetworkPolicyPort ().WithProtocol (corev1 .ProtocolTCP ).WithPort (intstr .FromInt (8443 )),
@@ -544,6 +550,49 @@ func desiredHeadNetworkPolicy(cluster *rayv1.RayCluster, cfg *config.KubeRayConf
544
550
)
545
551
}
546
552
553
+ func (r * RayClusterReconciler ) deleteHeadPodIfMissingImagePullSecrets (ctx context.Context , cluster * rayv1.RayCluster ) error {
554
+ serviceAccount , err := r .kubeClient .CoreV1 ().ServiceAccounts (cluster .Namespace ).Get (ctx , oauthServiceAccountNameFromCluster (cluster ), metav1.GetOptions {})
555
+ if err != nil {
556
+ return fmt .Errorf ("failed to get OAuth ServiceAccount: %w" , err )
557
+ }
558
+
559
+ headPod , err := getHeadPod (ctx , r , cluster )
560
+ if err != nil {
561
+ return fmt .Errorf ("failed to get head pod: %w" , err )
562
+ }
563
+
564
+ if headPod == nil {
565
+ return nil
566
+ }
567
+
568
+ missingSecrets := map [string ]bool {}
569
+ for _ , secret := range serviceAccount .ImagePullSecrets {
570
+ missingSecrets [secret .Name ] = true
571
+ }
572
+ for _ , secret := range headPod .Spec .ImagePullSecrets {
573
+ delete (missingSecrets , secret .Name )
574
+ }
575
+ if len (missingSecrets ) > 0 {
576
+ if err := r .kubeClient .CoreV1 ().Pods (headPod .Namespace ).Delete (ctx , headPod .Name , metav1.DeleteOptions {}); err != nil {
577
+ return fmt .Errorf ("failed to delete head pod: %w" , err )
578
+ }
579
+ }
580
+ return nil
581
+ }
582
+
583
+ func getHeadPod (ctx context.Context , r * RayClusterReconciler , cluster * rayv1.RayCluster ) (* corev1.Pod , error ) {
584
+ podList , err := r .kubeClient .CoreV1 ().Pods (cluster .Namespace ).List (ctx , metav1.ListOptions {
585
+ LabelSelector : fmt .Sprintf ("ray.io/node-type=head,ray.io/cluster=%s" , cluster .Name ),
586
+ })
587
+ if err != nil {
588
+ return nil , err
589
+ }
590
+ if len (podList .Items ) > 0 {
591
+ return & podList .Items [0 ], nil
592
+ }
593
+ return nil , nil
594
+ }
595
+
547
596
// SetupWithManager sets up the controller with the Manager.
548
597
func (r * RayClusterReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
549
598
r .kubeClient = kubernetes .NewForConfigOrDie (mgr .GetConfig ())
@@ -577,7 +626,8 @@ func (r *RayClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
577
626
NamespacedName : client.ObjectKey {
578
627
Name : name ,
579
628
Namespace : namespace ,
580
- }}}
629
+ },
630
+ }}
581
631
}),
582
632
)
583
633
if r .IsOpenShift {
0 commit comments