11import asyncio
2- import copy
32from collections import defaultdict
43import time
54from contextlib import suppress
@@ -111,10 +110,9 @@ def build_scheduler_service_spec(cluster_name, spec, annotations, labels):
111110 }
112111
113112
114- def build_worker_pod_spec (
115- worker_group_name , namespace , cluster_name , uuid , spec , annotations , labels
113+ def build_worker_deployment_spec (
114+ worker_group_name , namespace , cluster_name , uuid , pod_spec , annotations , labels
116115):
117- spec = copy .deepcopy (spec )
118116 labels .update (
119117 ** {
120118 "dask.org/cluster-name" : cluster_name ,
@@ -124,14 +122,24 @@ def build_worker_pod_spec(
124122 }
125123 )
126124 worker_name = f"{ worker_group_name } -worker-{ uuid } "
127- pod_spec = {
128- "apiVersion" : "v1" ,
129- "kind" : "Pod" ,
130- "metadata" : {
131- "name" : worker_name ,
132- "labels" : labels ,
133- "annotations" : annotations ,
134- },
125+ metadata = {
126+ "name" : worker_name ,
127+ "labels" : labels ,
128+ "annotations" : annotations ,
129+ }
130+ spec = {}
131+ spec ["replicas" ] = 1 # make_worker_spec returns dict with a replicas key?
132+ spec ["selector" ] = {
133+ "matchLabels" : labels ,
134+ }
135+ spec ["template" ] = {
136+ "metadata" : metadata ,
137+ "spec" : pod_spec ,
138+ }
139+ deployment_spec = {
140+ "apiVersion" : "apps/v1" ,
141+ "kind" : "Deployment" ,
142+ "metadata" : metadata ,
135143 "spec" : spec ,
136144 }
137145 env = [
@@ -144,12 +152,14 @@ def build_worker_pod_spec(
144152 "value" : f"tcp://{ cluster_name } -scheduler.{ namespace } .svc.cluster.local:8786" ,
145153 },
146154 ]
147- for i in range (len (pod_spec ["spec" ]["containers" ])):
148- if "env" in pod_spec ["spec" ]["containers" ][i ]:
149- pod_spec ["spec" ]["containers" ][i ]["env" ].extend (env )
155+ for i in range (len (deployment_spec ["spec" ]["template" ]["spec" ]["containers" ])):
156+ if "env" in deployment_spec ["spec" ]["template" ]["spec" ]["containers" ][i ]:
157+ deployment_spec ["spec" ]["template" ]["spec" ]["containers" ][i ]["env" ].extend (
158+ env
159+ )
150160 else :
151- pod_spec ["spec" ]["containers" ][i ]["env" ] = env
152- return pod_spec
161+ deployment_spec [ "spec" ][ "template" ] ["spec" ]["containers" ][i ]["env" ] = env
162+ return deployment_spec
153163
154164
155165def get_job_runner_pod_name (job_name ):
@@ -632,18 +642,20 @@ async def daskworkergroup_replica_update(
632642 labels .update (** worker_spec ["metadata" ]["labels" ])
633643 if workers_needed > 0 :
634644 for _ in range (workers_needed ):
635- data = build_worker_pod_spec (
645+ data = build_worker_deployment_spec (
636646 worker_group_name = name ,
637647 namespace = namespace ,
638648 cluster_name = cluster_name ,
639649 uuid = uuid4 ().hex [:10 ],
640- spec = worker_spec ["spec" ],
650+ pod_spec = worker_spec ["spec" ],
641651 annotations = annotations ,
642652 labels = labels ,
643653 )
644654 kopf .adopt (data , owner = body )
645655 kopf .label (data , labels = cluster_labels )
646- await corev1api .create_namespaced_pod (
656+ await kubernetes .client .AppsV1Api (
657+ api_client
658+ ).create_namespaced_deployment (
647659 namespace = namespace ,
648660 body = data ,
649661 )
@@ -660,7 +672,9 @@ async def daskworkergroup_replica_update(
660672 )
661673 logger .info (f"Workers to close: { worker_ids } " )
662674 for wid in worker_ids :
663- await corev1api .delete_namespaced_pod (
675+ await kubernetes .client .AppsV1Api (
676+ api_client
677+ ).delete_namespaced_deployment (
664678 name = wid ,
665679 namespace = namespace ,
666680 )
0 commit comments