zalando / postgres-operator

Postgres operator creates and manages PostgreSQL clusters running in Kubernetes
https://postgres-operator.readthedocs.io/
MIT License
4.3k stars 974 forks source link

Cannot install Postgres Operator 1.9.0 on GKE #2251

Open maelp opened 1 year ago

maelp commented 1 year ago

Please, answer some short questions which should help us to understand your problem / question better?

I'm trying to install the operator using the Helm chart as indicated on the documentation, using the ConfigMap and the Helm chart, but it fails with this

error: resource postgres/postgres-postgres-operator was not successfully created by the Kubernetes API server : OperatorConfiguration.acid.zalan.do "postgres-postgres-operator" is invalid: configuration: Required value

Here is my Pulumi code to install the chart, is anything wrong with it?


class Postgres:
    """
    Install Zalando Postgres operator.

    Ref. https://postgres-operator.readthedocs.io/en/latest/quickstart/#helm-chart
    """

    def __init__(self):
        self.ns = Namespace("postgres", metadata=ObjectMetaArgs(name="postgres"))

        self.config_map = ConfigMap(
            "postgres-operator",
            metadata=ObjectMetaArgs(
                name="postgres-operator", namespace=self.ns.metadata.name
            ),
            # Ref. https://github.com/zalando/postgres-operator/blob/master/manifests/configmap.yaml
            data={
                "api_port": "8080",
                "cluster_domain": "cluster.local",
                "cluster_history_entries": "1000",
                "cluster_labels": "application:spilo",
                "cluster_name_label": "postgres-cluster",
                # "connection_pooler_default_cpu_limit": "1",
                # "connection_pooler_default_cpu_request": "500m",
                # "connection_pooler_default_memory_limit": "100Mi",
                # "connection_pooler_default_memory_request": "100Mi",
                "connection_pooler_image": "registry.opensource.zalan.do/acid/pgbouncer:master-26",
                # "connection_pooler_max_db_connections": "60",
                # "connection_pooler_mode": "transaction",
                # "connection_pooler_number_of_instances": "2",
                # "connection_pooler_schema": "pooler",
                # "connection_pooler_user": "pooler",
                "crd_categories": "all",
                # "db_hosted_zone": "db.example.com",
                "debug_logging": "true",
                # "default_cpu_limit": "1"
                # "default_cpu_request": "100m",
                # "default_memory_limit": "500Mi",
                # "default_memory_request": "100Mi",
                # "delete_annotation_date_key": "delete-date",
                # "delete_annotation_name_key": "delete-clustername",
                "docker_image": "ghcr.io/zalando/spilo-15:2.1-p9",
                # "downscaler_annotations": "deployment-time,downscaler/*",
                # "enable_admin_role_for_users": "true",
                # "enable_crd_registration": "true",
                # "enable_cross_namespace_secret": "false",
                # "enable_database_access": "true",
                "enable_ebs_gp3_migration": "false",
                # "enable_ebs_gp3_migration_max_size": "1000",
                # "enable_init_containers": "true",
                # "enable_lazy_spilo_upgrade": "false",
                "enable_master_load_balancer": "false",
                "enable_master_pooler_load_balancer": "false",
                "enable_password_rotation": "false",
                # "enable_patroni_failsafe_mode": "false",
                "enable_pgversion_env_var": "true",
                # "enable_pod_antiaffinity": "false",
                # "enable_pod_disruption_budget": "true",
                # "enable_postgres_team_crd": "false",
                # "enable_postgres_team_crd_superusers": "false",
                "enable_readiness_probe": "false",
                "enable_replica_load_balancer": "false",
                "enable_replica_pooler_load_balancer": "false",
                # "enable_shm_volume": "true",
                # "enable_sidecars": "true",
                "enable_spilo_wal_path_compat": "true",
                "enable_team_id_clustername_prefix": "false",
                "enable_team_member_deprecation": "false",
                # "enable_team_superuser": "false",
                "enable_teams_api": "false",
                # "etcd_host": "",
                "external_traffic_policy": "Cluster",
                # "gcp_credentials": "",
                # "ignored_annotations": "",
                # "infrastructure_roles_secret_name": "postgresql-infrastructure-roles",
                # "infrastructure_roles_secrets": "secretname:monitoring-roles,userkey:user,passwordkey:password,rolekey:inrole",
                # "ignore_instance_limits_annotation_key": "",
                # "inherited_annotations": "owned-by",
                # "inherited_labels": "application,environment",
                # "kube_iam_role": "",
                # "kubernetes_use_configmaps": "false",
                # "log_s3_bucket": "",
                # "logical_backup_azure_storage_account_name": "",
                # "logical_backup_azure_storage_container": "",
                # "logical_backup_azure_storage_account_key": "",
                # "logical_backup_cpu_limit": "",
                # "logical_backup_cpu_request": "",
                "logical_backup_docker_image": "registry.opensource.zalan.do/acid/logical-backup:v1.9.0",
                # "logical_backup_google_application_credentials": "",
                "logical_backup_job_prefix": "logical-backup-",
                # "logical_backup_memory_limit": "",
                # "logical_backup_memory_request": "",
                "logical_backup_provider": "s3",
                # "logical_backup_s3_access_key_id": "",
                "logical_backup_s3_bucket": "my-bucket-url",
                # "logical_backup_s3_region": "",
                # "logical_backup_s3_endpoint": "",
                # "logical_backup_s3_secret_access_key": "",
                "logical_backup_s3_sse": "AES256",
                # "logical_backup_s3_retention_time": "",
                "logical_backup_schedule": "30 00 * * *",
                "major_version_upgrade_mode": "manual",
                # "major_version_upgrade_team_allow_list": "",
                "master_dns_name_format": "{cluster}.{namespace}.{hostedzone}",
                # "master_legacy_dns_name_format": "{cluster}.{team}.{hostedzone}",
                # "master_pod_move_timeout": "20m",
                # "max_instances": "-1",
                # "min_instances": "-1",
                # "max_cpu_request": "1",
                # "max_memory_request": "4Gi",
                # "min_cpu_limit": "250m",
                # "min_memory_limit": "250Mi",
                # "minimal_major_version": "11",
                # "node_readiness_label": "status:ready",
                # "node_readiness_label_merge": "OR",
                # "oauth_token_secret_name": "postgresql-operator",
                # "pam_configuration": "https://info.example.com/oauth2/tokeninfo?access_token= uid realm=/employees",
                # "pam_role_name": "zalandos",
                "patroni_api_check_interval": "1s",
                "patroni_api_check_timeout": "5s",
                # "password_rotation_interval": "90",
                # "password_rotation_user_retention": "180",
                "pdb_name_format": "postgres-{cluster}-pdb",
                # "pod_antiaffinity_preferred_during_scheduling": "false",
                # "pod_antiaffinity_topology_key": "kubernetes.io/hostname",
                "pod_deletion_wait_timeout": "10m",
                # "pod_environment_configmap": "default/my-custom-config",
                # "pod_environment_secret": "my-custom-secret",
                "pod_label_wait_timeout": "10m",
                "pod_management_policy": "ordered_ready",
                # "pod_priority_class_name": "postgres-pod-priority",
                "pod_role_label": "spilo-role",
                # "pod_service_account_definition": "",
                "pod_service_account_name": "postgres-pod",
                # "pod_service_account_role_binding_definition": "",
                "pod_terminate_grace_period": "5m",
                # "postgres_superuser_teams": "postgres_superusers",
                # "protected_role_names": "admin,cron_admin",
                "ready_wait_interval": "3s",
                "ready_wait_timeout": "30s",
                "repair_period": "5m",
                "replica_dns_name_format": "{cluster}-repl.{namespace}.{hostedzone}",
                # "replica_legacy_dns_name_format": "{cluster}-repl.{team}.{hostedzone}",
                "replication_username": "standby",
                "resource_check_interval": "3s",
                "resource_check_timeout": "10m",
                "resync_period": "30m",
                "ring_log_lines": "100",
                "role_deletion_suffix": "_deleted",
                "secret_name_template": "{username}.{cluster}.credentials.{tprkind}.{tprgroup}",
                "share_pgsocket_with_sidecars": "false",
                # "sidecar_docker_images": "",
                # "set_memory_request_to_limit": "false",
                "spilo_allow_privilege_escalation": "true",
                # "spilo_runasuser": "101",
                # "spilo_runasgroup": "103",
                # "spilo_fsgroup": "103",
                "spilo_privileged": "false",
                "storage_resize_mode": "pvc",
                "super_username": "postgres",
                # "target_major_version": "15",
                # "team_admin_role": "admin",
                # "team_api_role_configuration": "log_statement:all",
                # "teams_api_url": "http://fake-teams-api.default.svc.cluster.local",
                # "toleration": "key:db-only,operator:Exists,effect:NoSchedule",
                # "wal_az_storage_account": "",
                # "wal_gs_bucket": "",
                # "wal_s3_bucket": "",
                "watched_namespace": "*",  # listen to all namespaces
                "workers": "8",
            },
            opts=pulumi.ResourceOptions(provider=k8s_provider, depends_on=[self.ns]),
        )

        self.chart = Chart(
            "postgres",
            config=ChartOpts(
                fetch_opts={
                    "repo": "https://opensource.zalando.com/postgres-operator/charts/postgres-operator"
                },
                chart="postgres-operator",
                version=POSTGRES_CHART_VERSION,
                namespace=self.ns.metadata.name,
                # Ref. https://github.com/zalando/postgres-operator/blob/master/charts/postgres-operator/values.yaml
                values={},
            ),
            opts=pulumi.ResourceOptions(
                provider=k8s_provider, depends_on=[self.ns, self.config_map]
            ),
        )
FxKu commented 1 year ago

Seems you want to use a config map to configure the operator. Therfore, please use "ConfigMap" as target in the values.yaml.

I don't understand why your script has this line values={}. Are you setting values to empty? The error is complaining about an OperatorConfiguration resource missing the configuration field. But as you want to use ConfigMap just change configTarget in the values.yaml file, as mentioned above.