properly generate podTemplate for the cron job's pod

This commit is contained in:
Sergey Dudoladov 2019-04-02 15:26:27 +02:00
parent de9ffb6eff
commit 40175633a5
5 changed files with 59 additions and 23 deletions

View File

@ -303,7 +303,7 @@ func (c *Cluster) Create() error {
if err := c.createBackupCronJob(); err != nil { if err := c.createBackupCronJob(); err != nil {
return fmt.Errorf("could not create a k8s cron job for logical backups: %v", err) return fmt.Errorf("could not create a k8s cron job for logical backups: %v", err)
} }
c.logger.Infof("a k8s cron job for logical backup has been successfully created") c.logger.Info("a k8s cron job for logical backup has been successfully created")
} }
if err := c.listResources(); err != nil { if err := c.listResources(); err != nil {

View File

@ -22,7 +22,6 @@ import (
"github.com/zalando/postgres-operator/pkg/util/constants" "github.com/zalando/postgres-operator/pkg/util/constants"
batchv1 "k8s.io/api/batch/v1" batchv1 "k8s.io/api/batch/v1"
batchv1beta1 "k8s.io/api/batch/v1beta1" batchv1beta1 "k8s.io/api/batch/v1beta1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
) )
@ -1255,36 +1254,67 @@ func (c *Cluster) getClusterServiceConnectionParameters(clusterName string) (hos
return return
} }
func (c *Cluster) generateCronJob() *batchv1beta1.CronJob { func (c *Cluster) generateCronJob() (*batchv1beta1.CronJob, error) {
jobSpec := batchv1.JobSpec{Template: v1.PodTemplateSpec{ var (
Spec: corev1.PodSpec{ err error
Containers: []corev1.Container{ podTemplate *v1.PodTemplateSpec
corev1.Container{ )
Name: "Hello world",
Image: "hello-world", c.logger.Debug("Generating logical backup pod template")
Command: []string{"date", "echo Hello from the Kubernetes cluster"},
}, defaultResources := c.makeDefaultResources()
}, resourceRequirements, err := generateResourceRequirements(c.Spec.Resources, defaultResources)
}, volumeMounts := generateVolumeMounts()
},
logicalBackupContainer := generateSpiloContainer(
"logical-backup",
&c.OpConfig.LogicalBackup.LogicalBackupDockerImage,
resourceRequirements,
[]v1.EnvVar{},
volumeMounts,
)
if podTemplate, err = generatePodTemplate(
c.Namespace,
c.labelsSet(true),
logicalBackupContainer,
[]v1.Container{},
[]v1.Container{},
&[]v1.Toleration{},
nodeAffinity(c.OpConfig.NodeReadinessLabel),
int64(c.OpConfig.PodTerminateGracePeriod.Seconds()),
c.OpConfig.PodServiceAccountName,
c.OpConfig.KubeIAMRole,
"",
false,
false,
c.OpConfig.PodAntiAffinityTopologyKey); err != nil {
return nil, fmt.Errorf("could not generate pod template for logical backup cron job: %v", err)
} }
jobSpec := batchv1.JobSpec{Template: *podTemplate}
jobTemplateSpec := batchv1beta1.JobTemplateSpec{ jobTemplateSpec := batchv1beta1.JobTemplateSpec{
Spec: jobSpec, Spec: jobSpec,
} }
schedule := c.Postgresql.Spec.LogicalBackupSchedule
if schedule == "" {
schedule = c.OpConfig.LogicalBackupSchedule
}
cronJob := &batchv1beta1.CronJob{ cronJob := &batchv1beta1.CronJob{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "Dummy cron job", Name: "logical-backup-" + c.clusterName().String(),
Namespace: c.Namespace, Namespace: c.Namespace,
Labels: c.labelsSet(true), Labels: c.labelsSet(true),
}, },
Spec: batchv1beta1.CronJobSpec{ Spec: batchv1beta1.CronJobSpec{
Schedule: c.Postgresql.Spec.LogicalBackupSchedule, Schedule: schedule,
JobTemplate: jobTemplateSpec, JobTemplate: jobTemplateSpec,
}, },
} }
return cronJob return cronJob, nil
} }

View File

@ -611,9 +611,14 @@ func (c *Cluster) createRoles() (err error) {
func (c *Cluster) createBackupCronJob() (err error) { func (c *Cluster) createBackupCronJob() (err error) {
c.setProcessName("creating a k8s cron job for backups") c.setProcessName("creating a k8s cron job for logical backups")
cronJobSpec, err := c.generateCronJob()
if err != nil {
return fmt.Errorf("could not generate k8s cron job spec: %v", err)
}
c.logger.Debugf("Generated cronJobSpec: %v", cronJobSpec)
cronJobSpec := c.generateCronJob()
cronJob, err := c.KubeClient.CronJobsGetter.CronJobs(c.Namespace).Create(cronJobSpec) cronJob, err := c.KubeClient.CronJobsGetter.CronJobs(c.Namespace).Create(cronJobSpec)
if err != nil { if err != nil {
return fmt.Errorf("could not create k8s cron job: %v", err) return fmt.Errorf("could not create k8s cron job: %v", err)

View File

@ -67,10 +67,10 @@ type Scalyr struct {
// LogicalBackup // LogicalBackup
type LogicalBackup struct { type LogicalBackup struct {
EnableLogicalBackup bool `json:"enable_logical_backup,omitempty"` EnableLogicalBackup bool `name:"enable_logical_backup" default:"false"`
LogicalBackupSchedule string `json:"logical_backup_schedule,omitempty"` LogicalBackupSchedule string `name:"logical_backup_schedule" default:"30 00 * * *"`
LogicalBackupDockerImage string `json:"logical_backup_docker_image,omitempty"` LogicalBackupDockerImage string `name:"logical_backup_image" default:""`
LogicalBackupS3Bucket string `json:"logical_backup_s3_bucket,omitempty"` LogicalBackupS3Bucket string `name:"logical_backup_s3_bucket"`
} }
// Config describes operator config // Config describes operator config

View File

@ -87,6 +87,7 @@ func NewFromConfig(cfg *rest.Config) (KubernetesClient, error) {
kubeClient.PodDisruptionBudgetsGetter = client.PolicyV1beta1() kubeClient.PodDisruptionBudgetsGetter = client.PolicyV1beta1()
kubeClient.RESTClient = client.CoreV1().RESTClient() kubeClient.RESTClient = client.CoreV1().RESTClient()
kubeClient.RoleBindingsGetter = client.RbacV1beta1() kubeClient.RoleBindingsGetter = client.RbacV1beta1()
kubeClient.CronJobsGetter = client.BatchV1beta1()
apiextClient, err := apiextclient.NewForConfig(cfg) apiextClient, err := apiextclient.NewForConfig(cfg)
if err != nil { if err != nil {