@@ -213,6 +213,10 @@ func (r *RayClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
213213 return ctrl.Result {RequeueAfter : requeueTime }, err
214214 }
215215
216+ if err := r .deleteHeadPodIfMissingImagePullSecrets (ctx , cluster ); err != nil {
217+ return ctrl.Result {RequeueAfter : requeueTime }, err
218+ }
219+
216220 _ , err = r .kubeClient .RbacV1 ().ClusterRoleBindings ().Apply (ctx , desiredOAuthClusterRoleBinding (cluster ), metav1.ApplyOptions {FieldManager : controllerName , Force : true })
217221 if err != nil {
218222 logger .Error (err , "Failed to update OAuth ClusterRoleBinding" )
@@ -470,6 +474,7 @@ func generateCACertificate() ([]byte, []byte, error) {
470474
471475 return privateKeyPem , certPem , nil
472476}
477+
473478func desiredWorkersNetworkPolicy (cluster * rayv1.RayCluster ) * networkingv1ac.NetworkPolicyApplyConfiguration {
474479 return networkingv1ac .NetworkPolicy (cluster .Name + "-workers" , cluster .Namespace ).
475480 WithLabels (map [string ]string {RayClusterNameLabel : cluster .Name }).
@@ -486,6 +491,7 @@ func desiredWorkersNetworkPolicy(cluster *rayv1.RayCluster) *networkingv1ac.Netw
486491 metav1ac .OwnerReference ().WithUID (cluster .UID ).WithName (cluster .Name ).WithKind (cluster .Kind ).WithAPIVersion (cluster .APIVersion ).WithController (true ),
487492 )
488493}
494+
489495func desiredHeadNetworkPolicy (cluster * rayv1.RayCluster , cfg * config.KubeRayConfiguration , kubeRayNamespaces []string ) * networkingv1ac.NetworkPolicyApplyConfiguration {
490496 allSecuredPorts := []* networkingv1ac.NetworkPolicyPortApplyConfiguration {
491497 networkingv1ac .NetworkPolicyPort ().WithProtocol (corev1 .ProtocolTCP ).WithPort (intstr .FromInt (8443 )),
@@ -544,6 +550,49 @@ func desiredHeadNetworkPolicy(cluster *rayv1.RayCluster, cfg *config.KubeRayConf
544550 )
545551}
546552
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+
547596// SetupWithManager sets up the controller with the Manager.
548597func (r * RayClusterReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
549598 r .kubeClient = kubernetes .NewForConfigOrDie (mgr .GetConfig ())
@@ -577,7 +626,8 @@ func (r *RayClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
577626 NamespacedName : client.ObjectKey {
578627 Name : name ,
579628 Namespace : namespace ,
580- }}}
629+ },
630+ }}
581631 }),
582632 )
583633 if r .IsOpenShift {
0 commit comments