You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

worker.go 2.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package globalmanager
  2. import (
  3. "context"
  4. "strings"
  5. v1 "k8s.io/api/core/v1"
  6. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  7. "k8s.io/client-go/kubernetes"
  8. "k8s.io/klog/v2"
  9. k8scontroller "k8s.io/kubernetes/pkg/controller"
  10. )
  11. type WorkerMount struct {
  12. Name string
  13. // the url to be mounted
  14. URL *MountURL
  15. // for some cases, there are more than one url to be mounted
  16. URLs []MountURL
  17. // envName indicates the environment key of the mounts injected to the worker
  18. EnvName string
  19. }
  20. // WorkerParam describes the system-defined parameters of worker
  21. type WorkerParam struct {
  22. mounts []WorkerMount
  23. env map[string]string
  24. workerType string
  25. // if true, force to use hostNetwork
  26. hostNetwork bool
  27. restartPolicy v1.RestartPolicy
  28. }
  29. // injectWorkerParam modifies pod in-place
  30. func injectWorkerParam(pod *v1.Pod, workerParam *WorkerParam, object CommonInterface) {
  31. InjectStorageInitializer(pod, workerParam)
  32. envs := createEnvVars(workerParam.env)
  33. for idx := range pod.Spec.Containers {
  34. pod.Spec.Containers[idx].Env = append(
  35. pod.Spec.Containers[idx].Env, envs...,
  36. )
  37. }
  38. // inject our labels
  39. if pod.Labels == nil {
  40. pod.Labels = make(map[string]string)
  41. }
  42. for k, v := range GenerateLabels(object) {
  43. pod.Labels[k] = v
  44. }
  45. pod.GenerateName = object.GetName() + "-" + strings.ToLower(workerParam.workerType) + "-"
  46. pod.Namespace = object.GetNamespace()
  47. if workerParam.hostNetwork {
  48. // FIXME
  49. // force to set hostnetwork
  50. pod.Spec.HostNetwork = true
  51. }
  52. if pod.Spec.RestartPolicy == "" {
  53. pod.Spec.RestartPolicy = workerParam.restartPolicy
  54. }
  55. }
  56. // createPodWithTemplate creates and returns a pod object given a crd object, pod template, and workerParam
  57. func createPodWithTemplate(client kubernetes.Interface, object CommonInterface, spec *v1.PodTemplateSpec, workerParam *WorkerParam) (*v1.Pod, error) {
  58. objectKind := object.GroupVersionKind()
  59. pod, _ := k8scontroller.GetPodFromTemplate(spec, object, metav1.NewControllerRef(object, objectKind))
  60. injectWorkerParam(pod, workerParam, object)
  61. createdPod, err := client.CoreV1().Pods(object.GetNamespace()).Create(context.TODO(), pod, metav1.CreateOptions{})
  62. objectName := object.GetNamespace() + "/" + object.GetName()
  63. if err != nil {
  64. klog.Warningf("failed to create pod(type=%s) for %s %s, err:%s", workerParam.workerType, objectKind, objectName, err)
  65. return nil, err
  66. }
  67. klog.V(2).Infof("pod %s is created successfully for %s %s", createdPod.Name, objectKind, objectName)
  68. return createdPod, nil
  69. }
  70. // createEnvVars creates EnvMap for container
  71. // include EnvName and EnvValue map for stage of creating a pod
  72. func createEnvVars(envMap map[string]string) []v1.EnvVar {
  73. var envVars []v1.EnvVar
  74. for envName, envValue := range envMap {
  75. Env := v1.EnvVar{
  76. Name: envName,
  77. Value: envValue,
  78. }
  79. envVars = append(envVars, Env)
  80. }
  81. return envVars
  82. }