image: registry: ghcr.io repository: zalando/postgres-operator tag: v1.13.0 pullPolicy: "IfNotPresent" # Optionally specify an array of imagePullSecrets. # Secrets must be manually created in the namespace. # ref: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod # imagePullSecrets: # - name: myRegistryKeySecretName podAnnotations: {} podLabels: {} configTarget: "OperatorConfigurationCRD" # JSON logging format enableJsonLogging: false # general configuration parameters configGeneral: # the deployment should create/update the CRDs enable_crd_registration: true # specify categories under which crds should be listed crd_categories: - "all" # update only the statefulsets without immediately doing the rolling update enable_lazy_spilo_upgrade: false # set the PGVERSION env var instead of providing the version via postgresql.bin_dir in SPILO_CONFIGURATION enable_pgversion_env_var: true # start any new database pod without limitations on shm memory enable_shm_volume: true # enables backwards compatible path between Spilo 12 and Spilo 13+ images enable_spilo_wal_path_compat: false # operator will sync only clusters where name starts with teamId prefix enable_team_id_clustername_prefix: false # etcd connection string for Patroni. Empty uses K8s-native DCS. etcd_host: "" # Spilo docker image docker_image: ghcr.io/zalando/spilo-16:3.3-p1 # key name for annotation to ignore globally configured instance limits # ignore_instance_limits_annotation_key: "" # Select if setup uses endpoints (default), or configmaps to manage leader (DCS=k8s) # kubernetes_use_configmaps: false # min number of instances in Postgres cluster. -1 = no limit min_instances: -1 # max number of instances in Postgres cluster. -1 = no limit max_instances: -1 # period between consecutive repair requests repair_period: 5m # period between consecutive sync requests resync_period: 30m # can prevent certain cases of memory overcommitment # set_memory_request_to_limit: false # map of sidecar names to docker images # sidecar_docker_images: # example: "exampleimage:exampletag" # number of routines the operator spawns to process requests concurrently workers: 8 # parameters describing Postgres users configUsers: # roles to be granted to database owners # additional_owner_roles: # - cron_admin # enable password rotation for app users that are not database owners enable_password_rotation: false # rotation interval for updating credentials in K8s secrets of app users password_rotation_interval: 90 # retention interval to keep rotation users password_rotation_user_retention: 180 # postgres username used for replication between instances replication_username: standby # postgres superuser name to be created by initdb super_username: postgres configMajorVersionUpgrade: # "off": no upgrade, "manual": manifest triggers action, "full": minimal version violation triggers too major_version_upgrade_mode: "manual" # upgrades will only be carried out for clusters of listed teams when mode is "off" # major_version_upgrade_team_allow_list: # - acid # minimal Postgres major version that will not automatically be upgraded minimal_major_version: "12" # target Postgres major version when upgrading clusters automatically target_major_version: "16" configKubernetes: # list of additional capabilities for postgres container # additional_pod_capabilities: # - "SYS_NICE" # default DNS domain of K8s cluster where operator is running cluster_domain: cluster.local # additional labels assigned to the cluster objects cluster_labels: application: spilo # label assigned to Kubernetes objects created by the operator cluster_name_label: cluster-name # additional annotations to add to every database pod # custom_pod_annotations: # keya: valuea # keyb: valueb # key name for annotation that compares manifest value with current date # delete_annotation_date_key: "delete-date" # key name for annotation that compares manifest value with cluster name # delete_annotation_name_key: "delete-clustername" # list of annotations propagated from cluster manifest to statefulset and deployment # downscaler_annotations: # - deployment-time # - downscaler/* # allow user secrets in other namespaces than the Postgres cluster enable_cross_namespace_secret: false # use finalizers to ensure all managed resources are deleted prior to the postgresql CR # this avoids stale resources in case the operator misses a delete event or is not running # during deletion enable_finalizers: false # enables initContainers to run actions before Spilo is started enable_init_containers: true # toggles if child resources should have an owner reference to the postgresql CR enable_owner_references: false # toggles if operator should delete PVCs on cluster deletion enable_persistent_volume_claim_deletion: true # toggles pod anti affinity on the Postgres pods enable_pod_antiaffinity: false # toggles PDB to set to MinAvailabe 0 or 1 enable_pod_disruption_budget: true # toogles readiness probe for database pods enable_readiness_probe: false # toggles if operator should delete secrets on cluster deletion enable_secrets_deletion: true # enables sidecar containers to run alongside Spilo in the same pod enable_sidecars: true # annotations to be ignored when comparing statefulsets, services etc. # ignored_annotations: # - k8s.v1.cni.cncf.io/network-status # namespaced name of the secret containing infrastructure roles names and passwords # infrastructure_roles_secret_name: postgresql-infrastructure-roles # list of annotation keys that can be inherited from the cluster manifest # inherited_annotations: # - owned-by # list of label keys that can be inherited from the cluster manifest # inherited_labels: # - application # - environment # timeout for successful migration of master pods from unschedulable node # master_pod_move_timeout: 20m # set of labels that a running and active node should possess to be considered ready # node_readiness_label: # status: ready # defines how nodeAffinity from manifest should be merged with node_readiness_label # node_readiness_label_merge: "OR" # namespaced name of the secret containing the OAuth2 token to pass to the teams API # oauth_token_secret_name: postgresql-operator # toggle if `spilo-role=master` selector should be added to the PDB (Pod Disruption Budget) pdb_master_label_selector: true # defines the template for PDB names pdb_name_format: "postgres-{cluster}-pdb" # specify the PVC retention policy when scaling down and/or deleting persistent_volume_claim_retention_policy: when_deleted: "retain" when_scaled: "retain" # switches pod anti affinity type to `preferredDuringSchedulingIgnoredDuringExecution` pod_antiaffinity_preferred_during_scheduling: false # override topology key for pod anti affinity pod_antiaffinity_topology_key: "kubernetes.io/hostname" # namespaced name of the ConfigMap with environment variables to populate on every pod # pod_environment_configmap: "default/my-custom-config" # name of the Secret (in cluster namespace) with environment variables to populate on every pod # pod_environment_secret: "my-custom-secret" # specify the pod management policy of stateful sets of Postgres clusters pod_management_policy: "ordered_ready" # label assigned to the Postgres pods (and services/endpoints) pod_role_label: spilo-role # service account definition as JSON/YAML string to be used by postgres cluster pods # pod_service_account_definition: "" # role binding definition as JSON/YAML string to be used by pod service account # pod_service_account_role_binding_definition: "" # Postgres pods are terminated forcefully after this timeout pod_terminate_grace_period: 5m # template for database user secrets generated by the operator, # here username contains the namespace in the format namespace.username # if the user is in different namespace than cluster and cross namespace secrets # are enabled via `enable_cross_namespace_secret` flag in the configuration. secret_name_template: "{username}.{cluster}.credentials.{tprkind}.{tprgroup}" # sharing unix socket of PostgreSQL (`pg_socket`) with the sidecars share_pgsocket_with_sidecars: false # set user and group for the spilo container (required to run Spilo as non-root process) # spilo_runasuser: 101 # spilo_runasgroup: 103 # group ID with write-access to volumes (required to run Spilo as non-root process) # spilo_fsgroup: 103 # whether the Spilo container should run in privileged mode spilo_privileged: false # whether the Spilo container should run with additional permissions other than parent. # required by cron which needs setuid spilo_allow_privilege_escalation: true # storage resize strategy, available options are: ebs, pvc, off or mixed storage_resize_mode: pvc # pod toleration assigned to instances of every Postgres cluster # toleration: # key: db-only # operator: Exists # effect: NoSchedule # operator watches for postgres objects in the given namespace watched_namespace: "*" # listen to all namespaces # configure resource requests for the Postgres pods configPostgresPodResources: # CPU limits for the postgres containers default_cpu_limit: "1" # CPU request value for the postgres containers default_cpu_request: 100m # memory limits for the postgres containers default_memory_limit: 500Mi # memory request value for the postgres containers default_memory_request: 100Mi # optional upper boundary for CPU request # max_cpu_request: "1" # optional upper boundary for memory request # max_memory_request: 4Gi # hard CPU minimum required to properly run a Postgres cluster min_cpu_limit: 250m # hard memory minimum required to properly run a Postgres cluster min_memory_limit: 250Mi # timeouts related to some operator actions configTimeouts: # interval between consecutive attempts of operator calling the Patroni API patroni_api_check_interval: 1s # timeout when waiting for successful response from Patroni API patroni_api_check_timeout: 5s # timeout when waiting for the Postgres pods to be deleted pod_deletion_wait_timeout: 10m # timeout when waiting for pod role and cluster labels pod_label_wait_timeout: 10m # interval between consecutive attempts waiting for postgresql CRD to be created ready_wait_interval: 3s # timeout for the complete postgres CRD creation ready_wait_timeout: 30s # interval to wait between consecutive attempts to check for some K8s resources resource_check_interval: 3s # timeout when waiting for the presence of a certain K8s resource (e.g. Sts, PDB) resource_check_timeout: 10m # configure behavior of load balancers configLoadBalancer: # DNS zone for cluster DNS name when load balancer is configured for cluster db_hosted_zone: db.example.com # annotations to apply to service when load balancing is enabled # custom_service_annotations: # keyx: valuez # keya: valuea # toggles service type load balancer pointing to the master pod of the cluster enable_master_load_balancer: false # toggles service type load balancer pointing to the master pooler pod of the cluster enable_master_pooler_load_balancer: false # toggles service type load balancer pointing to the replica pod of the cluster enable_replica_load_balancer: false # toggles service type load balancer pointing to the replica pooler pod of the cluster enable_replica_pooler_load_balancer: false # define external traffic policy for the load balancer external_traffic_policy: "Cluster" # defines the DNS name string template for the master load balancer cluster master_dns_name_format: "{cluster}.{namespace}.{hostedzone}" # deprecated DNS template for master load balancer using team name master_legacy_dns_name_format: "{cluster}.{team}.{hostedzone}" # defines the DNS name string template for the replica load balancer cluster replica_dns_name_format: "{cluster}-repl.{namespace}.{hostedzone}" # deprecated DNS template for replica load balancer using team name replica_legacy_dns_name_format: "{cluster}-repl.{team}.{hostedzone}" # options to aid debugging of the operator itself configDebug: # toggles verbose debug logs from the operator debug_logging: true # toggles operator functionality that require access to the postgres database enable_database_access: true # parameters affecting logging and REST API listener configLoggingRestApi: # REST API listener listens to this port api_port: 8080 # number of entries in the cluster history ring buffer cluster_history_entries: 1000 # number of lines in the ring buffer used to store cluster logs ring_log_lines: 100 # configure interaction with non-Kubernetes objects from AWS or GCP configAwsOrGcp: # Additional Secret (aws or gcp credentials) to mount in the pod # additional_secret_mount: "some-secret-name" # Path to mount the above Secret in the filesystem of the container(s) # additional_secret_mount_path: "/some/dir" # AWS region used to store EBS volumes aws_region: eu-central-1 # enable automatic migration on AWS from gp2 to gp3 volumes enable_ebs_gp3_migration: false # defines maximum volume size in GB until which auto migration happens # enable_ebs_gp3_migration_max_size: 1000 # GCP credentials that will be used by the operator / pods # gcp_credentials: "" # AWS IAM role to supply in the iam.amazonaws.com/role annotation of Postgres pods # kube_iam_role: "" # S3 bucket to use for shipping postgres daily logs # log_s3_bucket: "" # S3 bucket to use for shipping WAL segments with WAL-E # wal_s3_bucket: "" # GCS bucket to use for shipping WAL segments with WAL-E # wal_gs_bucket: "" # Azure Storage Account to use for shipping WAL segments with WAL-G # wal_az_storage_account: "" # configure K8s cron job managed by the operator configLogicalBackup: # Azure Storage Account specs to store backup results # logical_backup_azure_storage_account_name: "" # logical_backup_azure_storage_container: "" # logical_backup_azure_storage_account_key: "" # resources for logical backup pod, if empty configPostgresPodResources will be used # logical_backup_cpu_limit: "" # logical_backup_cpu_request: "" # logical_backup_memory_limit: "" # logical_backup_memory_request: "" # image for pods of the logical backup job (example runs pg_dumpall) logical_backup_docker_image: "ghcr.io/zalando/postgres-operator/logical-backup:v1.13.0" # path of google cloud service account json file # logical_backup_google_application_credentials: "" # prefix for the backup job name logical_backup_job_prefix: "logical-backup-" # storage provider - either "s3", "gcs" or "az" logical_backup_provider: "s3" # S3 Access Key ID logical_backup_s3_access_key_id: "" # S3 bucket to store backup results logical_backup_s3_bucket: "my-bucket-url" # S3 bucket prefix to use logical_backup_s3_bucket_prefix: "spilo" # S3 region of bucket logical_backup_s3_region: "" # S3 endpoint url when not using AWS logical_backup_s3_endpoint: "" # S3 Secret Access Key logical_backup_s3_secret_access_key: "" # S3 server side encryption logical_backup_s3_sse: "AES256" # S3 retention time for stored backups for example "2 week" or "7 days" logical_backup_s3_retention_time: "" # backup schedule in the cron format logical_backup_schedule: "30 00 * * *" # secret to be used as reference for env variables in cronjob logical_backup_cronjob_environment_secret: "" # automate creation of human users with teams API service configTeamsApi: # team_admin_role will have the rights to grant roles coming from PG manifests enable_admin_role_for_users: true # operator watches for PostgresTeam CRs to assign additional teams and members to clusters enable_postgres_team_crd: false # toogle to create additional superuser teams from PostgresTeam CRs enable_postgres_team_crd_superusers: false # toggle to automatically rename roles of former team members and deny LOGIN enable_team_member_deprecation: false # toggle to grant superuser to team members created from the Teams API enable_team_superuser: false # toggles usage of the Teams API by the operator enable_teams_api: false # should contain a URL to use for authentication (username and token) # pam_configuration: https://info.example.com/oauth2/tokeninfo?access_token= uid realm=/employees # operator will add all team member roles to this group and add a pg_hba line pam_role_name: zalandos # List of teams which members need the superuser role in each Postgres cluster postgres_superuser_teams: - postgres_superusers # List of roles that cannot be overwritten by an application, team or infrastructure role protected_role_names: - admin - cron_admin # Suffix to add if members are removed from TeamsAPI or PostgresTeam CRD role_deletion_suffix: "_deleted" # role name to grant to team members created from the Teams API team_admin_role: admin # postgres config parameters to apply to each team member role team_api_role_configuration: log_statement: all # URL of the Teams API service # teams_api_url: http://fake-teams-api.default.svc.cluster.local # configure connection pooler deployment created by the operator configConnectionPooler: # db schema to install lookup function into connection_pooler_schema: "pooler" # db user for pooler to use connection_pooler_user: "pooler" # docker image connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-32" # max db connections the pooler should hold connection_pooler_max_db_connections: 60 # default pooling mode connection_pooler_mode: "transaction" # number of pooler instances connection_pooler_number_of_instances: 2 # default resources connection_pooler_default_cpu_request: 500m connection_pooler_default_memory_request: 100Mi connection_pooler_default_cpu_limit: "1" connection_pooler_default_memory_limit: 100Mi configPatroni: # enable Patroni DCS failsafe_mode feature enable_patroni_failsafe_mode: false # Zalando's internal CDC stream feature enableStreams: false rbac: # Specifies whether RBAC resources should be created create: true # Specifies whether ClusterRoles that are aggregated into the K8s default roles should be created. (https://kubernetes.io/docs/reference/access-authn-authz/rbac/#default-roles-and-role-bindings) createAggregateClusterRoles: false serviceAccount: # Specifies whether a ServiceAccount should be created create: true # The name of the ServiceAccount to use. # If not set and create is true, a name is generated using the fullname template name: podServiceAccount: # The name of the ServiceAccount to be used by postgres cluster pods # If not set a name is generated using the fullname template and "-pod" suffix name: "postgres-pod" # priority class for operator pod priorityClassName: "" # priority class for database pods podPriorityClassName: # If create is false with no name set, no podPriorityClassName is specified. # Hence, the pod priorityClass is the one with globalDefault set. # If there is no PriorityClass with globalDefault set, the priority of Pods with no priorityClassName is zero. create: true # If not set a name is generated using the fullname template and "-pod" suffix name: "" priority: 1000000 resources: limits: cpu: 500m memory: 500Mi requests: cpu: 100m memory: 250Mi securityContext: runAsUser: 1000 runAsNonRoot: true readOnlyRootFilesystem: true allowPrivilegeEscalation: false # Allow to setup operator Deployment readiness probe readinessProbe: initialDelaySeconds: 5 periodSeconds: 10 # configure extra environment variables # Extra environment variables are writen in kubernetes format and added "as is" to the pod's env variables # https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/ # https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#environment-variables extraEnvs: [] # Exemple of settings maximum amount of memory / cpu that can be used by go process (to match resources.limits) # - name: MY_VAR # value: my-value # - name: GOMAXPROCS # valueFrom: # resourceFieldRef: # resource: limits.cpu # - name: GOMEMLIMIT # valueFrom: # resourceFieldRef: # resource: limits.memory # Affinity for pod assignment # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity affinity: {} # Node labels for pod assignment # Ref: https://kubernetes.io/docs/user-guide/node-selection/ nodeSelector: {} # Tolerations for pod assignment # Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ tolerations: [] controllerID: # Specifies whether a controller ID should be defined for the operator # Note, all postgres manifest must then contain the following annotation to be found by this operator # "acid.zalan.do/controller": create: false # The name of the controller ID to use. # If not set and create is true, a name is generated using the fullname template name: