Merge branch 'master' into node-affinity-test-more-time
This commit is contained in:
		
						commit
						3a11b974d3
					
				| 
						 | 
					@ -239,20 +239,21 @@ configAwsOrGcp:
 | 
				
			||||||
# configure K8s cron job managed by the operator
 | 
					# configure K8s cron job managed by the operator
 | 
				
			||||||
configLogicalBackup:
 | 
					configLogicalBackup:
 | 
				
			||||||
  # image for pods of the logical backup job (example runs pg_dumpall)
 | 
					  # image for pods of the logical backup job (example runs pg_dumpall)
 | 
				
			||||||
  logical_backup_docker_image: "registry.opensource.zalan.do/acid/logical-backup:v.1.6.0"
 | 
					  logical_backup_docker_image: "registry.opensource.zalan.do/acid/logical-backup:v1.6.0"
 | 
				
			||||||
  # path of google cloud service account json file
 | 
					  # path of google cloud service account json file
 | 
				
			||||||
  # logical_backup_google_application_credentials: ""
 | 
					  # logical_backup_google_application_credentials: ""
 | 
				
			||||||
 | 
					  # prefix for the backup job name
 | 
				
			||||||
 | 
					  logical_backup_job_prefix: "logical-backup-"
 | 
				
			||||||
  # storage provider - either "s3" or "gcs"
 | 
					  # storage provider - either "s3" or "gcs"
 | 
				
			||||||
  logical_backup_provider: "s3"
 | 
					  logical_backup_provider: "s3"
 | 
				
			||||||
  # S3 Access Key ID
 | 
					  # S3 Access Key ID
 | 
				
			||||||
  logical_backup_s3_access_key_id: ""
 | 
					  logical_backup_s3_access_key_id: ""
 | 
				
			||||||
  # S3 bucket to store backup results
 | 
					  # S3 bucket to store backup results
 | 
				
			||||||
  logical_backup_s3_bucket: "my-bucket-url"
 | 
					  logical_backup_s3_bucket: "my-bucket-url"
 | 
				
			||||||
  # S3 region of bucket
 | 
					 | 
				
			||||||
  logical_backup_s3_region: ""
 | 
					 | 
				
			||||||
  # S3 endpoint url when not using AWS
 | 
					  # S3 endpoint url when not using AWS
 | 
				
			||||||
  logical_backup_s3_endpoint: ""
 | 
					  logical_backup_s3_endpoint: ""
 | 
				
			||||||
 | 
					  # S3 region of bucket
 | 
				
			||||||
 | 
					  logical_backup_s3_region: ""
 | 
				
			||||||
  # S3 Secret Access Key
 | 
					  # S3 Secret Access Key
 | 
				
			||||||
  logical_backup_s3_secret_access_key: ""
 | 
					  logical_backup_s3_secret_access_key: ""
 | 
				
			||||||
  # S3 server side encryption
 | 
					  # S3 server side encryption
 | 
				
			||||||
| 
						 | 
					@ -260,6 +261,7 @@ configLogicalBackup:
 | 
				
			||||||
  # backup schedule in the cron format
 | 
					  # backup schedule in the cron format
 | 
				
			||||||
  logical_backup_schedule: "30 00 * * *"
 | 
					  logical_backup_schedule: "30 00 * * *"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# automate creation of human users with teams API service
 | 
					# automate creation of human users with teams API service
 | 
				
			||||||
configTeamsApi:
 | 
					configTeamsApi:
 | 
				
			||||||
  # team_admin_role will have the rights to grant roles coming from PG manifests
 | 
					  # team_admin_role will have the rights to grant roles coming from PG manifests
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -551,11 +551,6 @@ These parameters configure a K8s cron job managed by the operator to produce
 | 
				
			||||||
Postgres logical backups. In the CRD-based configuration those parameters are
 | 
					Postgres logical backups. In the CRD-based configuration those parameters are
 | 
				
			||||||
grouped under the `logical_backup` key.
 | 
					grouped under the `logical_backup` key.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **logical_backup_schedule**
 | 
					 | 
				
			||||||
  Backup schedule in the cron format. Please take the
 | 
					 | 
				
			||||||
  [reference schedule format](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#schedule)
 | 
					 | 
				
			||||||
  into account. Default: "30 00 \* \* \*"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* **logical_backup_docker_image**
 | 
					* **logical_backup_docker_image**
 | 
				
			||||||
  An image for pods of the logical backup job. The [example image](../../docker/logical-backup/Dockerfile)
 | 
					  An image for pods of the logical backup job. The [example image](../../docker/logical-backup/Dockerfile)
 | 
				
			||||||
  runs `pg_dumpall` on a replica if possible and uploads compressed results to
 | 
					  runs `pg_dumpall` on a replica if possible and uploads compressed results to
 | 
				
			||||||
| 
						 | 
					@ -563,32 +558,40 @@ grouped under the `logical_backup` key.
 | 
				
			||||||
  The default image is the same image built with the Zalando-internal CI
 | 
					  The default image is the same image built with the Zalando-internal CI
 | 
				
			||||||
  pipeline. Default: "registry.opensource.zalan.do/acid/logical-backup"
 | 
					  pipeline. Default: "registry.opensource.zalan.do/acid/logical-backup"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **logical_backup_google_application_credentials**
 | 
				
			||||||
 | 
					  Specifies the path of the google cloud service account json file. Default is empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **logical_backup_job_prefix**
 | 
				
			||||||
 | 
					  The prefix to be prepended to the name of a k8s CronJob running the backups. Beware the prefix counts towards the name length restrictions imposed by k8s. Empty string is a legitimate value. Operator does not do the actual renaming: It simply creates the job with the new prefix. You will have to delete the old cron job manually. Default: "logical-backup-".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **logical_backup_provider**
 | 
					* **logical_backup_provider**
 | 
				
			||||||
  Specifies the storage provider to which the backup should be uploaded (`s3` or `gcs`).
 | 
					  Specifies the storage provider to which the backup should be uploaded (`s3` or `gcs`).
 | 
				
			||||||
  Default: "s3"
 | 
					  Default: "s3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **logical_backup_s3_access_key_id**
 | 
				
			||||||
 | 
					  When set, value will be in AWS_ACCESS_KEY_ID env variable. The Default is empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **logical_backup_s3_bucket**
 | 
					* **logical_backup_s3_bucket**
 | 
				
			||||||
  S3 bucket to store backup results. The bucket has to be present and
 | 
					  S3 bucket to store backup results. The bucket has to be present and
 | 
				
			||||||
  accessible by Postgres pods. Default: empty.
 | 
					  accessible by Postgres pods. Default: empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **logical_backup_s3_endpoint**
 | 
				
			||||||
 | 
					  When using non-AWS S3 storage, endpoint can be set as a ENV variable. The default is empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **logical_backup_s3_region**
 | 
					* **logical_backup_s3_region**
 | 
				
			||||||
  Specifies the region of the bucket which is required with some non-AWS S3 storage services. The default is empty.
 | 
					  Specifies the region of the bucket which is required with some non-AWS S3 storage services. The default is empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **logical_backup_s3_endpoint**
 | 
					* **logical_backup_s3_secret_access_key**
 | 
				
			||||||
  When using non-AWS S3 storage, endpoint can be set as a ENV variable. The default is empty.
 | 
					  When set, value will be in AWS_SECRET_ACCESS_KEY env variable. The Default is empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **logical_backup_s3_sse**
 | 
					* **logical_backup_s3_sse**
 | 
				
			||||||
  Specify server side encryption that S3 storage is using. If empty string
 | 
					  Specify server side encryption that S3 storage is using. If empty string
 | 
				
			||||||
  is specified, no argument will be passed to `aws s3` command. Default: "AES256".
 | 
					  is specified, no argument will be passed to `aws s3` command. Default: "AES256".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **logical_backup_s3_access_key_id**
 | 
					* **logical_backup_schedule**
 | 
				
			||||||
  When set, value will be in AWS_ACCESS_KEY_ID env variable. The Default is empty.
 | 
					  Backup schedule in the cron format. Please take the
 | 
				
			||||||
 | 
					  [reference schedule format](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#schedule)
 | 
				
			||||||
* **logical_backup_s3_secret_access_key**
 | 
					  into account. Default: "30 00 \* \* \*"
 | 
				
			||||||
  When set, value will be in AWS_SECRET_ACCESS_KEY env variable. The Default is empty.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* **logical_backup_google_application_credentials**
 | 
					 | 
				
			||||||
  Specifies the path of the google cloud service account json file. Default is empty.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Debugging the operator
 | 
					## Debugging the operator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -317,6 +317,8 @@ spec:
 | 
				
			||||||
                    type: string
 | 
					                    type: string
 | 
				
			||||||
                  logical_backup_google_application_credentials:
 | 
					                  logical_backup_google_application_credentials:
 | 
				
			||||||
                    type: string
 | 
					                    type: string
 | 
				
			||||||
 | 
					                  logical_backup_job_prefix:
 | 
				
			||||||
 | 
					                    type: string
 | 
				
			||||||
                  logical_backup_provider:
 | 
					                  logical_backup_provider:
 | 
				
			||||||
                    type: string
 | 
					                    type: string
 | 
				
			||||||
                  logical_backup_s3_access_key_id:
 | 
					                  logical_backup_s3_access_key_id:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,8 +115,9 @@ configuration:
 | 
				
			||||||
    # wal_gs_bucket: ""
 | 
					    # wal_gs_bucket: ""
 | 
				
			||||||
    # wal_s3_bucket: ""
 | 
					    # wal_s3_bucket: ""
 | 
				
			||||||
  logical_backup:
 | 
					  logical_backup:
 | 
				
			||||||
    logical_backup_docker_image: "registry.opensource.zalan.do/acid/logical-backup:v.1.6.0"
 | 
					    logical_backup_docker_image: "registry.opensource.zalan.do/acid/logical-backup:v1.6.0"
 | 
				
			||||||
    # logical_backup_google_application_credentials: ""
 | 
					    # logical_backup_google_application_credentials: ""
 | 
				
			||||||
 | 
					    logical_backup_job_prefix: "logical-backup-"
 | 
				
			||||||
    logical_backup_provider: "s3"
 | 
					    logical_backup_provider: "s3"
 | 
				
			||||||
    # logical_backup_s3_access_key_id: ""
 | 
					    # logical_backup_s3_access_key_id: ""
 | 
				
			||||||
    logical_backup_s3_bucket: "my-bucket-url"
 | 
					    logical_backup_s3_bucket: "my-bucket-url"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -196,6 +196,7 @@ type OperatorLogicalBackupConfiguration struct {
 | 
				
			||||||
	S3SecretAccessKey            string `json:"logical_backup_s3_secret_access_key,omitempty"`
 | 
						S3SecretAccessKey            string `json:"logical_backup_s3_secret_access_key,omitempty"`
 | 
				
			||||||
	S3SSE                        string `json:"logical_backup_s3_sse,omitempty"`
 | 
						S3SSE                        string `json:"logical_backup_s3_sse,omitempty"`
 | 
				
			||||||
	GoogleApplicationCredentials string `json:"logical_backup_google_application_credentials,omitempty"`
 | 
						GoogleApplicationCredentials string `json:"logical_backup_google_application_credentials,omitempty"`
 | 
				
			||||||
 | 
						JobPrefix                    string `json:"logical_backup_job_prefix,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// OperatorConfigurationData defines the operation config
 | 
					// OperatorConfigurationData defines the operation config
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2079,7 +2079,7 @@ func (c *Cluster) generateLogicalBackupPodEnvVars() []v1.EnvVar {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getLogicalBackupJobName returns the name; the job itself may not exists
 | 
					// getLogicalBackupJobName returns the name; the job itself may not exists
 | 
				
			||||||
func (c *Cluster) getLogicalBackupJobName() (jobName string) {
 | 
					func (c *Cluster) getLogicalBackupJobName() (jobName string) {
 | 
				
			||||||
	return "logical-backup-" + c.clusterName().Name
 | 
						return c.OpConfig.LogicalBackupJobPrefix + c.clusterName().Name
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Return an array of ownerReferences to make an arbitraty object dependent on
 | 
					// Return an array of ownerReferences to make an arbitraty object dependent on
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"math/rand"
 | 
						"math/rand"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	appsv1 "k8s.io/api/apps/v1"
 | 
						appsv1 "k8s.io/api/apps/v1"
 | 
				
			||||||
	v1 "k8s.io/api/core/v1"
 | 
						v1 "k8s.io/api/core/v1"
 | 
				
			||||||
| 
						 | 
					@ -11,6 +12,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/zalando/postgres-operator/pkg/spec"
 | 
						"github.com/zalando/postgres-operator/pkg/spec"
 | 
				
			||||||
	"github.com/zalando/postgres-operator/pkg/util"
 | 
						"github.com/zalando/postgres-operator/pkg/util"
 | 
				
			||||||
 | 
						"github.com/zalando/postgres-operator/pkg/util/retryutil"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Cluster) listPods() ([]v1.Pod, error) {
 | 
					func (c *Cluster) listPods() ([]v1.Pod, error) {
 | 
				
			||||||
| 
						 | 
					@ -309,7 +311,23 @@ func (c *Cluster) isSafeToRecreatePods(pods *v1.PodList) bool {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, pod := range pods.Items {
 | 
						for _, pod := range pods.Items {
 | 
				
			||||||
		state, err := c.patroni.GetPatroniMemberState(&pod)
 | 
					
 | 
				
			||||||
 | 
							var state string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err := retryutil.Retry(1*time.Second, 5*time.Second,
 | 
				
			||||||
 | 
								func() (bool, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									state, err = c.patroni.GetPatroniMemberState(&pod)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return false, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return true, nil
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			c.logger.Errorf("failed to get Patroni state for pod: %s", err)
 | 
								c.logger.Errorf("failed to get Patroni state for pod: %s", err)
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -154,6 +154,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur
 | 
				
			||||||
	result.LogicalBackupS3SecretAccessKey = fromCRD.LogicalBackup.S3SecretAccessKey
 | 
						result.LogicalBackupS3SecretAccessKey = fromCRD.LogicalBackup.S3SecretAccessKey
 | 
				
			||||||
	result.LogicalBackupS3SSE = fromCRD.LogicalBackup.S3SSE
 | 
						result.LogicalBackupS3SSE = fromCRD.LogicalBackup.S3SSE
 | 
				
			||||||
	result.LogicalBackupGoogleApplicationCredentials = fromCRD.LogicalBackup.GoogleApplicationCredentials
 | 
						result.LogicalBackupGoogleApplicationCredentials = fromCRD.LogicalBackup.GoogleApplicationCredentials
 | 
				
			||||||
 | 
						result.LogicalBackupJobPrefix = fromCRD.LogicalBackup.JobPrefix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// debug config
 | 
						// debug config
 | 
				
			||||||
	result.DebugLogging = fromCRD.OperatorDebug.DebugLogging
 | 
						result.DebugLogging = fromCRD.OperatorDebug.DebugLogging
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,6 +121,7 @@ type LogicalBackup struct {
 | 
				
			||||||
	LogicalBackupS3SecretAccessKey            string `name:"logical_backup_s3_secret_access_key" default:""`
 | 
						LogicalBackupS3SecretAccessKey            string `name:"logical_backup_s3_secret_access_key" default:""`
 | 
				
			||||||
	LogicalBackupS3SSE                        string `name:"logical_backup_s3_sse" default:""`
 | 
						LogicalBackupS3SSE                        string `name:"logical_backup_s3_sse" default:""`
 | 
				
			||||||
	LogicalBackupGoogleApplicationCredentials string `name:"logical_backup_google_application_credentials" default:""`
 | 
						LogicalBackupGoogleApplicationCredentials string `name:"logical_backup_google_application_credentials" default:""`
 | 
				
			||||||
 | 
						LogicalBackupJobPrefix                    string `name:"logical_backup_job_prefix" default:"logical-backup-"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Operator options for connection pooler
 | 
					// Operator options for connection pooler
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@ AWS_ENDPOINT = getenv('AWS_ENDPOINT')
 | 
				
			||||||
OPERATOR_CLUSTER_NAME_LABEL = getenv('OPERATOR_CLUSTER_NAME_LABEL', 'cluster-name')
 | 
					OPERATOR_CLUSTER_NAME_LABEL = getenv('OPERATOR_CLUSTER_NAME_LABEL', 'cluster-name')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COMMON_CLUSTER_LABEL = getenv('COMMON_CLUSTER_LABEL', '{"application":"spilo"}')
 | 
					COMMON_CLUSTER_LABEL = getenv('COMMON_CLUSTER_LABEL', '{"application":"spilo"}')
 | 
				
			||||||
COMMON_POOLER_LABEL = getenv('COMMONG_POOLER_LABEL', '{"application":"db-connection-pooler"}')
 | 
					COMMON_POOLER_LABEL = getenv('COMMON_POOLER_LABEL', '{"application":"db-connection-pooler"}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logger.info("Common Cluster Label: {}".format(COMMON_CLUSTER_LABEL))
 | 
					logger.info("Common Cluster Label: {}".format(COMMON_CLUSTER_LABEL))
 | 
				
			||||||
logger.info("Common Pooler Label: {}".format(COMMON_POOLER_LABEL))
 | 
					logger.info("Common Pooler Label: {}".format(COMMON_POOLER_LABEL))
 | 
				
			||||||
| 
						 | 
					@ -107,6 +107,12 @@ def encode_labels(label_selector):
 | 
				
			||||||
    ])
 | 
					    ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def cluster_labels(spilo_cluster):
 | 
				
			||||||
 | 
					    labels = COMMON_CLUSTER_LABEL
 | 
				
			||||||
 | 
					    labels[OPERATOR_CLUSTER_NAME_LABEL] = spilo_cluster
 | 
				
			||||||
 | 
					    return labels
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def kubernetes_url(
 | 
					def kubernetes_url(
 | 
				
			||||||
    resource_type,
 | 
					    resource_type,
 | 
				
			||||||
    namespace='default',
 | 
					    namespace='default',
 | 
				
			||||||
| 
						 | 
					@ -151,7 +157,7 @@ def read_pods(cluster, namespace, spilo_cluster):
 | 
				
			||||||
        cluster=cluster,
 | 
					        cluster=cluster,
 | 
				
			||||||
        resource_type='pods',
 | 
					        resource_type='pods',
 | 
				
			||||||
        namespace=namespace,
 | 
					        namespace=namespace,
 | 
				
			||||||
        label_selector={OPERATOR_CLUSTER_NAME_LABEL: spilo_cluster},
 | 
					        label_selector=cluster_labels(spilo_cluster),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue