diff --git a/.github/actions/verify-ready-instances/action.yml b/.github/actions/verify-cluster-ready/action.yml similarity index 81% rename from .github/actions/verify-ready-instances/action.yml rename to .github/actions/verify-cluster-ready/action.yml index 7a848e7f33..7e3a522b8f 100644 --- a/.github/actions/verify-ready-instances/action.yml +++ b/.github/actions/verify-cluster-ready/action.yml @@ -13,7 +13,7 @@ inputs: runs: using: composite steps: - - name: Wait for cluster to become ready + - name: Wait for the cluster to become ready shell: bash run: | ITER=0 @@ -22,7 +22,7 @@ runs: echo "Cluster not ready" exit 1 fi - READY_INSTANCES=$(kubectl get cluster ${INPUT_CLUSTER_NAME} -o jsonpath='{.status.readyInstances}') + READY_INSTANCES=$(kubectl get clusters.postgresql.cnpg.io ${INPUT_CLUSTER_NAME} -o jsonpath='{.status.readyInstances}') if [[ "$READY_INSTANCES" == ${INPUT_READY_INSTANCES} ]]; then echo "Cluster up and running" break diff --git a/.github/actions/verify-pooler-ready/action.yml b/.github/actions/verify-pooler-ready/action.yml new file mode 100644 index 0000000000..d2c48200a2 --- /dev/null +++ b/.github/actions/verify-pooler-ready/action.yml @@ -0,0 +1,32 @@ +name: Verifies that a CNPG cluster has a certain amount of ready instances +description: Verifies that a CNPG cluster has a certain amount of ready instances +inputs: + pooler-name: + description: The name of the pooler to verify + required: true + default: database-cluster + ready-instances: + description: The amount of ready instances to wait for + required: true + default: "3" + +runs: + using: composite + steps: + - name: Wait for the pooler to become ready + shell: bash + run: | + ITER=0 + while true; do + if [[ $ITER -ge 300 ]]; then + echo "Pooler not ready" + exit 1 + fi + READY_INSTANCES=$(kubectl get cluster ${INPUT_POOLER_NAME} -o jsonpath='{.status.readyInstances}') + if [[ "$READY_INSTANCES" == ${INPUT_READY_INSTANCES} ]]; then + echo "Pooler up and running" + break + fi + sleep 1 + (( ++ITER )) + done diff --git a/.github/workflows/tests-cluster-standalone.yml b/.github/workflows/tests-cluster-standalone.yml index d2b6166f8c..d162c84e3a 100644 --- a/.github/workflows/tests-cluster-standalone.yml +++ b/.github/workflows/tests-cluster-standalone.yml @@ -30,7 +30,42 @@ jobs: database ./charts/cluster - name: Verify that the cluster is ready - uses: ./.github/actions/verify-ready-instances + uses: ./.github/actions/verify-cluster-ready with: cluster-name: database-cluster ready-instances: 1 + + test-cluster-pgbouncer: + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + fetch-depth: 0 + + - name: Setup kind + uses: ./.github/actions/setup-kind + + - name: Deploy the operator + uses: ./.github/actions/deploy-operator + + - name: Deploy a standalone cluster + run: | + helm upgrade --install \ + --values charts/cluster/examples/pgbouncer.yaml \ + --namespace database \ + --create-namespace \ + --wait \ + database ./charts/cluster + + - name: Verify that the cluster is ready + uses: ./.github/actions/verify-cluster-ready + with: + cluster-name: database-cluster + ready-instances: 1 + + - name: Verify that the pooler is ready + uses: ./.github/actions/verify-pooler-ready + with: + pooler-name: database-cluster-pooler-rw + ready-instances: 1 diff --git a/.github/workflows/tests-operator.yml b/.github/workflows/tests-operator.yml index 1e043e43c4..3177e32f58 100644 --- a/.github/workflows/tests-operator.yml +++ b/.github/workflows/tests-operator.yml @@ -35,7 +35,7 @@ jobs: EOF - name: Verify that the cluster is ready - uses: ./.github/actions/verify-ready-instances + uses: ./.github/actions/verify-cluster-ready with: cluster-name: cluster-example ready-instances: 3 diff --git a/charts/cluster/README.md b/charts/cluster/README.md index ab48119629..57ca0222de 100644 --- a/charts/cluster/README.md +++ b/charts/cluster/README.md @@ -148,10 +148,11 @@ refer to the [CloudNativePG Documentation](https://cloudnative-pg.io/documentat | cluster.initdb | object | `{}` | BootstrapInitDB is the configuration of the bootstrap process when initdb is used See: https://cloudnative-pg.io/documentation/current/bootstrap/ See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-bootstrapinitdb | | cluster.instances | int | `3` | Number of instances | | cluster.logLevel | string | `"info"` | The instances' log level, one of the following values: error, warning, info (default), debug, trace | -| cluster.monitoring.customQueries | list | `[]` | | -| cluster.monitoring.enabled | bool | `false` | | -| cluster.monitoring.podMonitor.enabled | bool | `true` | | -| cluster.monitoring.prometheusRule.enabled | bool | `true` | | +| cluster.monitoring.customQueries | list | `[]` | Custom Prometheus metrics | +| cluster.monitoring.enabled | bool | `false` | Whether to enable monitoring | +| cluster.monitoring.podMonitor.enabled | bool | `true` | Whether to enable the PodMonitor | +| cluster.monitoring.prometheusRule | object | `{"enabled":true}` | PrometheusRule Automated Alerts | +| cluster.monitoring.prometheusRule.enabled | bool | `true` | Whether to enable the PrometheusRule automated alerts | | cluster.postgresGID | int | `26` | The GID of the postgres user inside the image, defaults to 26 | | cluster.postgresUID | int | `26` | The UID of the postgres user inside the image, defaults to 26 | | cluster.postgresql | object | `{}` | Configuration of the PostgreSQL server See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-PostgresConfiguration | @@ -167,8 +168,12 @@ refer to the [CloudNativePG Documentation](https://cloudnative-pg.io/documentat | nameOverride | string | `""` | Override the name of the chart | | pooler.enabled | bool | `false` | Whether to enable PgBouncer | | pooler.instances | int | `3` | Number of PgBouncer instances | +| pooler.monitoring.enabled | bool | `false` | Whether to enable monitoring | +| pooler.monitoring.podMonitor.enabled | bool | `true` | Whether to enable the PodMonitor | | pooler.parameters | object | `{"default_pool_size":"25","max_client_conn":"1000"}` | PgBouncer configuration parameters | | pooler.poolMode | string | `"transaction"` | PgBouncer pooling mode | +| pooler.template | object | `{}` | Custom PgBouncer deployment template Use to override image, specify resources, etc. | +| pooler.type | string | `"rw"` | PgBouncer type of service to forward traffic to. | | recovery.azure.connectionString | string | `""` | | | recovery.azure.containerName | string | `""` | | | recovery.azure.inheritFromAzureAD | bool | `false` | | diff --git a/charts/cluster/examples/pgbouncer.yaml b/charts/cluster/examples/pgbouncer.yaml new file mode 100644 index 0000000000..1da9662750 --- /dev/null +++ b/charts/cluster/examples/pgbouncer.yaml @@ -0,0 +1,8 @@ +mode: standalone +cluster: + instances: 1 +backups: + enabled: false +pooler: + enabled: true + instances: 1 diff --git a/charts/cluster/templates/pooler.yaml b/charts/cluster/templates/pooler.yaml index 5a606d96da..5e01fe4988 100644 --- a/charts/cluster/templates/pooler.yaml +++ b/charts/cluster/templates/pooler.yaml @@ -7,9 +7,15 @@ spec: cluster: name: {{ include "cluster.fullname" . }} instances: {{ .Values.pooler.instances }} - type: rw + type: {{ .Values.pooler.type }} pgbouncer: poolMode: {{ .Values.pooler.poolMode }} parameters: {{- .Values.pooler.parameters | toYaml | nindent 6 }} -{{ end }} \ No newline at end of file + monitoring: + enablePodMonitor: {{ and .Values.pooler.monitoring.enabled .Values.pooler.monitoring.podMonitor.enabled }} + {{- with .Values.pooler.template }} + template: + {{- . | toYaml | nindent 4 }} + {{- end }} +{{ end }} diff --git a/charts/cluster/values.schema.json b/charts/cluster/values.schema.json index 2f08a58cd8..439d9a346b 100644 --- a/charts/cluster/values.schema.json +++ b/charts/cluster/values.schema.json @@ -228,6 +228,22 @@ "instances": { "type": "integer" }, + "monitoring": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "podMonitor": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + } + } + } + } + }, "parameters": { "type": "object", "properties": { @@ -241,6 +257,12 @@ }, "poolMode": { "type": "string" + }, + "template": { + "type": "object" + }, + "type": { + "type": "string" } } }, diff --git a/charts/cluster/values.yaml b/charts/cluster/values.yaml index c2b46ee651..b48723fe89 100644 --- a/charts/cluster/values.yaml +++ b/charts/cluster/values.yaml @@ -138,11 +138,16 @@ cluster: superuserSecret: "" monitoring: + # -- Whether to enable monitoring enabled: false podMonitor: + # -- Whether to enable the PodMonitor enabled: true + # -- PrometheusRule Automated Alerts prometheusRule: + # -- Whether to enable the PrometheusRule automated alerts enabled: true + # -- Custom Prometheus metrics customQueries: [] # - name: "pg_cache_hit_ratio" # query: "SELECT current_database() as datname, sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio FROM pg_statio_user_tables;" @@ -224,6 +229,8 @@ backups: pooler: # -- Whether to enable PgBouncer enabled: false + # -- PgBouncer type of service to forward traffic to. + type: rw # -- PgBouncer pooling mode poolMode: transaction # -- Number of PgBouncer instances @@ -232,3 +239,14 @@ pooler: parameters: max_client_conn: "1000" default_pool_size: "25" + + monitoring: + # -- Whether to enable monitoring + enabled: false + podMonitor: + # -- Whether to enable the PodMonitor + enabled: true + + # -- Custom PgBouncer deployment template + # Use to override image, specify resources, etc. + template: {}