Commit Graph
42 Commits
Author SHA1 Message Date
Dmitry Dolgov 1f5d0995a5 Lookup function installation (#1171)
* Lookup function installation

Due to reusing a previous database connection without closing it, lookup
function installation process was skipping the first database in the
list, installing twice into postgres db instead. To prevent that, make
internal initDbConnWithName to overwrite a connection object, and return
the same object only from initDbConn, which is sort of public interface.

Another solution for this would be to modify initDbConnWithName to
return a connection object and then generate one temporary connection
for each db. It sound feasible but after one attempt it seems it
requires a bit more changes around (init, close connections) and
doesn't bring anything significantly better on the table. In case if
some future changes will prove this wrong, do not hesitate to refactor.

Change retry strategy to more insistive one, namely:

* retry on the next sync even if we failed to process one database and
install pooler appliance.

* perform the whole installation unconditionally on update, since the
list of target databases could be changed.

And for the sake of making it even more robust, also log the case when
operator decides to skip installation.

Extend connection pooler e2e test with verification that all dbs have
required schema installed.
2020-10-19 16:18:58 +02:00
Dmitry Dolgov d15f2d3392 Readiness probe (#1169)
Right now there are no readiness probes defined for connection pooler,
which means after a pod restart there is a short time window (between a
container start and connection pooler starting listening to a socket)
when a service can send queries to a new pod, but connection will be
refused. The pooler container is rather lightweight and it start to
listen immediately, so the time window is small, but still.

To fix this add a readiness probe for tcp socket opened by connection
pooler.
2020-10-15 10:16:42 +02:00
Dmitry Dolgov 7cf2fae6df [WIP] Extend infrastructure roles handling (#1064)
Extend infrastructure roles handling

Postgres Operator uses infrastructure roles to provide access to a database for
external users e.g. for monitoring purposes. Such infrastructure roles are
expected to be present in the form of k8s secrets with the following content:

    inrole1: some_encrypted_role
    password1: some_encrypted_password
    user1: some_entrypted_name

    inrole2: some_encrypted_role
    password2: some_encrypted_password
    user2: some_entrypted_name

The format of this content is implied implicitly and not flexible enough. In
case if we do not have possibility to change the format of a secret we want to
use in the Operator, we need to recreate it in this format.

To address this lets make the format of secret content explicitly. The idea is
to introduce a new configuration option for the Operator.

    infrastructure_roles_secrets:
    - secretname: k8s_secret_name
      userkey: some_encrypted_name
      passwordkey: some_encrypted_password
      rolekey: some_encrypted_role

    - secretname: k8s_secret_name
      userkey: some_encrypted_name
      passwordkey: some_encrypted_password
      rolekey: some_encrypted_role

This would allow Operator to use any avalable secrets to prepare infrastructure
roles. To make it backward compatible simulate the old behaviour if the new
option is not present.

The new configuration option is intended be used mainly from CRD, but it's also
available via Operator ConfigMap in a limited fashion. For ConfigMap one can
put there only a string with one secret definition in the following format (as
a string):

    infrastructure_roles_secrets: |
        secretname: k8s_secret_name,
        userkey: some_encrypted_name,
        passwordkey: some_encrypted_password,
        rolekey: some_encrypted_role

Note than only one secret could be specified this way, no multiple secrets are
allowed.

Eventually the resulting list of infrastructure roles would be a total sum of
all supported ways to describe it, namely legacy via
infrastructure_roles_secret_name and infrastructure_roles_secrets from both
ConfigMap and CRD.
2020-08-05 14:18:56 +02:00
Dmitry Dolgov 6a689cdc1c Prevent empty syncs (#922)
There is a possibility to pass nil as one of the specs and an empty spec
into syncConnectionPooler. In this case it will perfom a syncronization
because nil != empty struct. Avoid such cases and make it testable by
returning list of syncronization reasons on top together with the final
error.
2020-04-16 15:14:31 +02:00
Dmitry Dolgov a1f2bd05b9 Prevent superuser from being a connection pool user (#906)
* Protected and system users can't be a connection pool user

It's not supported, neither it's a best practice. Also fix potential null
pointer access. For protected users it makes sense by intent of protecting this
users (e.g. from being overriden or used as something else than supposed). For
system users the reason is the same as for superuser, it's about replicastion
user and it's under patroni control.

This is implemented on both levels, operator config and postgresql manifest.
For the latter we just use default name in this case, assuming that operator
config is always correct. For the former, since it's a serious
misconfiguration, operator panics.
2020-04-09 09:21:45 +02:00
Dmitry DolgovandFelix Kunde 9dfa433363 Connection pooler (#799)
Connection pooler support

Add support for a connection pooler. The idea is to make it generic enough to
be able to switch between different implementations (e.g. pgbouncer or
odyssey). Operator needs to create a deployment with pooler and a service for
it to access.

For connection pool to work properly, a database needs to be prepared by
operator, namely a separate user have to be created with an access to an
installed lookup function (to fetch credential for other users).

This setups is supposed to be used only by robot/application users. Usually a
connection pool implementation is more CPU bounded, so it makes sense to create
several pods for connection pool with more emphasize on cpu resources. At the
moment there are no special affinity or tolerations assigned to bring those
pods closer to the database. For availability purposes minimal number of
connection pool pods is 2, ideally they have to be distributed between
different nodes/AZ, but it's not enforced in the operator itself. Available
configuration supposed to be ergonomic and in the normal case require minimum
changes to a manifest to enable connection pool. To have more control over the
configuration and functionality on the pool side one can customize the
corresponding docker image.

Co-authored-by: Felix Kunde <felix-kunde@gmx.de>
2020-03-25 12:57:26 +01:00
Dmitry Dolgovandmlu42 d666c52172 ClusterDomain default (#863)
* add json:omitempty option to ClusterDomain

* Add default value for ClusterDomain

Unfortunately, omitempty in operator configuration CRD doesn't mean that
defauls from operator config object will be picked up automatically.
Make sure that ClusterDomain default is specified, so that even when
someone will set cluster_domain = "", it will be overwritted with a
default value.

Co-authored-by: mlu42 <mlu42pro@gmail.com>
2020-03-13 11:51:39 +01:00
Dmitry Dolgov 647a4d3023 Remove service accounts cache (#685)
For optimization purposes operator was creating a cache map to remember
if service accounts and role binding was deployed to a namespace. This
could lead to a problem, when a namespace was deleted, since this
cache was not synchronized. For the sake of correctness remove the
cache, and check every time if required service account and rbac is
present. In the normal case this introduces an overhead of two API calls
per an event (one to get a service accounts, one to get a role binding),
which should not be a problem, unless proven otherwise.
2019-10-11 11:06:14 +02:00
Dmitry Dolgov baae1887b3 Replace glide with Go modules (#544)
* And attempt to build with modules and remove glide
* new tools.go file to get code-generator dependency + updated codegen + remove Glide files and update docs
2019-10-02 16:18:55 +02:00
Dmitry Dolgov 53fea88391 Update link for pod_antiaffinity_topology_key (#622)
Looks like the anchor was changed in the K8S docs.
2019-07-17 13:04:54 +02:00
Dmitry Dolgov f29bdaf96a Override clone s3 bucket path (#487)
Override clone s3 bucket path

Add possibility to use a custom s3 bucket path for cloning a cluster
from an arbitrary bucket (e.g. from another k8s cluster). For that
a new config options is introduced `s3_wal_path`, that should point
to a location that spilo would understand.
2019-05-10 12:52:42 +02:00
Dmitry Dolgov 90c25038d7 Add pod diagram and tex sources (#472) 2019-01-31 12:17:11 +01:00
Dmitry Dolgov 44895939f3 Overview diagrams (#466)
Add overview diagram of what would be created for a postgres cluster by
operator
2019-01-29 21:42:13 +01:00
Dmitry Dolgov d6e6b00770 Add shm_volume option (#427)
Add possibility to mount a tmpfs volume to /dev/shm to avoid issues like
[this](https://github.com/docker-library/postgres/issues/416). To achieve that
two new options were introduced:

* `enableShmVolume` to PostgreSQL manifest, to specify whether or not mount
this volume per database cluster

* `enable_shm_volume` to operator configuration, to specify whether or not mount
per operator.

The first one, `enableShmVolume` takes precedence to allow us to be more flexible.
2018-12-21 16:22:30 +01:00
Dmitry Dolgov a0e09cd6a6 Add golangci badge (#423)
Since we've connected it, it makes sense also to display the results.
2018-11-27 11:59:59 +01:00
Dmitry Dolgov 78e83308fc API url regexps (#400)
* Make url regexp more flexible, to accept identifier with dashes

* Add few simple tests

* Check also numerics
2018-10-31 14:52:41 +01:00
Dmitry Dolgov 83dfae2a6d Editing documentation for cloning
Clear a bit the section about timestamp (from @zalandoAlex)
2018-10-31 11:08:49 +01:00
Dmitry Dolgov c26962ba62 Merge pull request #315 from zalando-incubator/feature/doc-volume-increase
Add section about volume increase
2018-06-07 13:46:08 +02:00
erthalion df40cd831d Adjust the wording 2018-06-07 10:25:50 +02:00
erthalion dab6c01cc7 Change and clarify wording 2018-06-06 17:36:21 +02:00
erthalion 4d20a38106 Add section about volume increase 2018-06-05 11:42:01 +02:00
Dmitry Dolgov 681656cbb7 Merge pull request #312 from zalando-incubator/feature/doc-clone
Add an example of clone feature
2018-06-04 16:26:44 +02:00
erthalion 2a05179f63 Adjust article for title 2018-06-04 16:17:48 +02:00
erthalion d0e6932641 Adjustments for clone section 2018-06-04 15:36:17 +02:00
erthalion 5151b43c82 Split into two parts and reformulate a bit 2018-06-04 13:41:18 +02:00
erthalion e661ea1ea7 Mention uid field 2018-06-01 16:44:57 +02:00
erthalion b82faf66bb Unrelated chaotic good adjustments of snippets 2018-06-01 16:21:37 +02:00
erthalion 07d9dff847 Add an example of clone feature 2018-06-01 16:15:42 +02:00
Dmitry Dolgov 6ee0349536 Merge pull request #309 from zalando-incubator/feature/split-documentation
Split already existing documentation into parts
2018-06-01 15:49:21 +02:00
erthalion 69c8d3784a Use PostgreSQL specifically 2018-06-01 13:29:09 +02:00
erthalion f356225c04 Change to user/admin/developer 2018-06-01 11:32:50 +02:00
erthalion 86f87ac31e Add links to subdocuments 2018-05-31 14:03:01 +02:00
erthalion 749085b29a Split already existing documentation into parts
To improve the documentation we need to split it into smaller parts:

* quickstart (in the readme)
* general concepts
* tutorials
* how to
* references

And then add the missing information. So far I just split the existing
documentation and left references almost empty. I assume that references
may duplicate the rest of the documentation in a way that the doc will
have references to this section, that contains all the formal details.
2018-05-31 11:23:29 +02:00
erthalion 34518a4eb0 Some fixes for travis ci and cdp
remove cmd package from travis (it's complaining because
there are no tests), and add apt-get update for cdp.
2018-03-27 16:05:13 +02:00
erthalion 8967a3be2c Add tests for load balancer function logic 2018-03-27 12:11:46 +02:00
Dmitry Dolgov 5200579a89 Merge pull request #267 from zalando-incubator/scope-operator
Add scope section to readme.
2018-03-27 10:35:14 +02:00
Dmitry Dolgov 7b05758893 Merge pull request #251 from zalando-incubator/feature/refactor-compare-containers
Move container comparison logic to a separate function
2018-02-23 14:32:55 +01:00
Dmitry Dolgov bf4b0f0f33 Merge pull request #240 from zalando-incubator/feature/goreport-improvements
Some improvements for golint, ineffassign and misspell
2018-02-22 11:31:08 +01:00
Dmitry Dolgov 0e3f941d2f Merge pull request #239 from zalando-incubator/feature/travis-timeout
WIP: Use travis_wait to prevent timeout
2018-02-16 16:40:15 +01:00
Dmitry Dolgov 00cc81c2e3 Merge pull request #232 from zalando-incubator/feature/add-unit-tests-build-step
Add a new step to run unit tests
2018-02-14 14:59:57 +01:00
Dmitry Dolgov 08e3d925e6 Merge pull request #227 from zalando-incubator/feature/unit-tests-doc
Add section about unit tests
2018-02-09 14:05:20 +01:00
Dmitry Dolgov dcf637d4ea Fix typo in port (#219) 2018-02-02 15:51:26 +01:00