properly generate podTemplate for the cron job's pod
This commit is contained in:
parent
de9ffb6eff
commit
40175633a5
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue