running postgres-as-a-service in kubernetes...scaling capabilities backups connection pooling...

44
@LukasFittl Running Postgres-as-a-Service In Kubernetes

Upload: others

Post on 22-Aug-2020

18 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

@LukasFittl

Running Postgres-as-a-Service In Kubernetes

Page 2: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

@LukasFittl

Page 3: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Why (not) run Postgres in Kubernetes?

Page 4: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Consistency - Kubernetes manages all workloads, including databases

Page 5: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Better Portability - Consistent deployment experience across clouds, instead of relying on cloud-specific APIs

Page 6: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Low Latency - Co-locating Compute and Database, allows certain workloads to perform better

Page 7: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

High Effort - Running anything in Kubernetes is complex, and databases are worse

Page 8: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

How to deploy Postgres in Kubernetes

Page 9: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

Page 10: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

High Availability

Scale Out Capabilities

Backups

Connection PoolingMonitoring

K8S Integration

Page 11: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Zalando Postgres Operator

Page 12: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Crunchy Data PostgreSQL Operator

Page 13: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

PostgreSQL Hyperscale - Azure Arc

Page 14: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

High Availability

Scaling Capabilities

Backups

Connection PoolingMonitoring

K8S Integration

Page 15: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

K8S Integration

CLIs, Operators & API Servers

Namespace handling

Storage

Page 16: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Zalando Postgres Operator

Operator Postgrespostgresql CRD

Page 17: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

“pgo” CLI

Operator

API Server

Postgres

Crunchy Data PostgreSQL Operator

Zalando Postgres Operator

Operator Postgres

Pgcluster CRD

postgresql CRD

Pgpolicy CRD

Pgreplica CRD

Pgtask CRD

Page 18: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

“pgo” CLI

“azdata” CLI

Operator

API Server

Postgres

Operator

API Server

Postgres (Coordinator)

PostgreSQL Hyperscale - Azure Arc

Postgres (Data Node)

Postgres (Data Node)

Crunchy Data PostgreSQL Operator

Zalando Postgres Operator

Operator Postgres

Pgcluster CRD

postgresql CRD

Pgpolicy CRD

Pgreplica CRD

Pgtask CRD

DatabaseService CRD

DatabaseServiceTask CRD

Page 19: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

kind: DatabaseService metadata: ... spec: docker: ... engine: type: Postgres version: 12 monitoring: ... scale: shards: 2 scheduling: default: resources: requests: memory: 256Mi service: port: 5432 type: NodePort storage: volumeSize: 1Gi

kind: postgresqlmetadata: ...spec: databases: foo: zalando numberOfInstances: 2 postgresql: version: "12" preparedDatabases: bar: {} teamId: acid users: foo_user: [] zalando: - superuser - createdb volume: size: 1Gi

kind: Pgclustermetadata: ...spec: ArchiveStorage: ... BackrestStorage: ... PrimaryStorage: ... ReplicaStorage: ... WALStorage: ... ... clustername: hippo database: hippo exporterport: "9187" limits: {} name: hippo namespace: pgo podAntiAffinity: default: preferred port: "5432" primaryhost: hippo replicas: "0" resources: memory: 128Mi rootsecretname: hippo-postgres-secret syncReplication: null tablespaceMounts: {} tlsOnly: false user: testuser

Zalando Postgres Operator Crunchy Data PostgreSQL Operator PostgreSQL Hyperscale - Azure Arc

Page 20: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Namespace handling

Crunchy Data’ Postgres Operator Namespace Modes:

dynamic:Operator can create, delete, update any namespaces and manage RBAC. Operator requires ClusterRole privilege.

readonly: Namespaces need to be pre-created and RBAC pre-configured. Operator requires ClusterRole privilege.

disabled:Deploy to single namespace, no ClusterRole privilege required.

Page 21: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Storage

Generally, expect Persistent Volume Claims (PVCs) to be utilized for the databasestorage. Crunchy Data PostgreSQL Operator also supports table spaces, to utilize differentstorage types within the same database server (be careful when using it)

Postgres Persistent Volume Persistent Volume Claim Network Storage

Page 22: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

High Availability

Scaling Capabilities

Backups

Connection PoolingMonitoring

K8S Integration

Page 23: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scenario 1: Automated Failover within a K8S cluster

K8S Cluster 1

PG1 Primary

PG2 Secondary

Sync Rep

Operator

Page 24: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scenario 1: Automated Failover within a K8S cluster

K8S Cluster 1

PG1 Primary

PG2 Secondary

Operator

Node Failure

Detect

Page 25: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scenario 1: Automated Failover within a K8S cluster

K8S Cluster 1

PG1 Primary

PG2 Primary

Operator

Node Failure

Promote

Page 26: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scenario 1: Automated Failover within a K8S cluster

K8S Cluster 1

PG1 Secondary

PG2 Primary

Operator

Sync Rep

Recover

Page 27: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scenario 2: Disaster Recovery to another K8S cluster

K8S Cluster 1

PG1 Primary

PG2 Secondary

Sync Rep

K8S Cluster 2

PG3 Secondary

Async Replication

Operator Operator

Page 28: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scenario 2: Disaster Recovery to another K8S cluster

K8S Cluster 1

PG1 Primary

PG2 Secondary

Sync Rep

K8S Cluster 2

PG3 Primary

Operator Operator

Large-Scale Data Center Failure

Promote

Page 29: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

High Availability

HA within Same K8S Cluster HA across K8S Clusters

ZalandoPostgres Operator Built-In Manual

Crunchy Data PostgreSQL Operator Built-In Manual

PostgreSQL Hyperscale- Azure Arc Built-In Manual

Page 30: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Pod Anti-Affinity

label: failure-domain.beta.kubernetes.io/region=westus2

failure-domain…/zone=0 failure-domain…/zone=1 failure-domain…/zone=2

Page 31: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

High Availability

Scaling Capabilities

Backups

Connection PoolingMonitoring

K8S Integration

Page 32: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Backups

Local Volume Backups Point-in-time-Restore Offsite Backups

ZalandoPostgres Operator n/a

Built-in(wal-e)

Built-in(wal-e)

Crunchy Data PostgreSQL Operator

Built-in (pgBackRest) Built-in

Built-in(Amazon S3)

PostgreSQL Hyperscale- Azure Arc Built-in Built-in

Built-in (K8S Volume Mount)

Page 33: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

High Availability

Scaling Capabilities

Backups

Connection PoolingMonitoring

K8S Integration

Page 34: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Monitoring

Metrics Logs

ZalandoPostgres Operator not built in not built in

Crunchy Data PostgreSQL Operator Grafana Built-in pgbadger

PostgreSQL Hyperscale- Azure Arc

Grafana+

Azure Monitor

Kibana+

Azure Log Analytics

Page 35: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

PostgreSQL Hyperscale - Azure Arc

Page 36: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

High Availability

Scaling Capabilities

Backups

Connection PoolingMonitoring

K8S Integration

Page 37: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Connection Pooling

PostgrespgbouncerApplication

pgbouncer is important for idle connection scaling in Postgres

Idle connection in Postgres: 5-10MBIdle connection in pgbouncer: <1MB

Page 38: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Connection Pooling

Pgbouncer

ZalandoPostgres Operator Built-in

Crunchy Data PostgreSQL Operator Built-in

PostgreSQL Hyperscale- Azure Arc Planned

Page 39: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Postgres

High Availability

Scaling Capabilities

Backups

Connection PoolingMonitoring

K8S Integration

Page 40: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scaling Capabilities

Read Replicas:

Help you scale the read performance; Max data size = max storage size per node

Postgres

Postgres (Read Only)

Postgres (Read Only)

Application

Page 41: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scaling Capabilities

Hyperscale (Citus):

Scales both read and write performance; Max data size = # of data nodes * storage size per node

Postgres (Coordinator)

Postgres (Data Node)

Postgres (Data Node)

Application

Page 42: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Scaling Up

Grow to 100’s of database nodes,without re-architecting your application

Block growth on 1 (monolithic) database vs.

18Total Nodes

Scaling Out

Page 43: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Demo

Deploying & Scaling out with PostgreSQL Hyperscale - Azure Arc

Page 44: Running Postgres-as-a-Service in Kubernetes...Scaling Capabilities Backups Connection Pooling Monitoring K8S Integration. K8S Integration CLIs, Operators & API Servers Namespace handling

Thank you!

[email protected]

@LukasFittl