[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EM2PCCPVW7GG735B9WP0K8":3,"skill-same:01M6EM2PCCPVW7GG735B9WP0K8":87},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6EM2PCCPVW7GG735B9WP0K8","deploying-postgres-k8s",null,"Deploys PostgreSQL on Kubernetes using the CloudNativePG operator with automated failover.\nUse when setting up PostgreSQL for production workloads, high availability, or local K8s development.\nCovers operator installation, cluster creation, connection secrets, and backup configuration.\nNOT when using managed Postgres (Neon, RDS, Cloud SQL) or simple Docker containers.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fdeploying-postgres-k8s\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"deploying postgres k8s","k8s","postgres","up","availability","cluster","creation","high availability","neon","local","containers","use","secrets","backup","operator","postgresql","development","sql","kubernetes","docker","2026-11-10 10:12:30",false,"---\r\nname: deploying-postgres-k8s\r\ndescription: |\r\n  Deploys PostgreSQL on Kubernetes using the CloudNativePG operator with automated failover.\r\n  Use when setting up PostgreSQL for production workloads, high availability, or local K8s development.\r\n  Covers operator installation, cluster creation, connection secrets, and backup configuration.\r\n  NOT when using managed Postgres (Neon, RDS, Cloud SQL) or simple Docker containers.\r\n---\r\n\r\n# Deploying PostgreSQL on Kubernetes\r\n\r\nDeploy production-ready PostgreSQL clusters using CloudNativePG operator (v1.28+) with automated failover.\r\n\r\n## Quick Start\r\n\r\n```bash\r\n# 1. Install CloudNativePG operator\r\nkubectl apply --server-side -f \\\r\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fcloudnative-pg\u002Fcloudnative-pg\u002Frelease-1.28\u002Freleases\u002Fcnpg-1.28.0.yaml\r\n\r\n# 2. Wait for operator\r\nkubectl rollout status deployment -n cnpg-system cnpg-controller-manager\r\n\r\n# 3. Deploy PostgreSQL cluster\r\nkubectl apply -f - \u003C\u003CEOF\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-cluster\r\nspec:\r\n  instances: 3\r\n  storage:\r\n    size: 10Gi\r\nEOF\r\n\r\n# 4. Wait for cluster\r\nkubectl wait cluster\u002Fpg-cluster --for=condition=Ready --timeout=300s\r\n```\r\n\r\n## Operator Installation\r\n\r\n### Direct Manifest (Recommended)\r\n\r\n```bash\r\nkubectl apply --server-side -f \\\r\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fcloudnative-pg\u002Fcloudnative-pg\u002Frelease-1.28\u002Freleases\u002Fcnpg-1.28.0.yaml\r\n\r\n# Verify\r\nkubectl rollout status deployment -n cnpg-system cnpg-controller-manager\r\nkubectl get pods -n cnpg-system\r\n```\r\n\r\n### Helm Installation\r\n\r\n```bash\r\nhelm repo add cnpg https:\u002F\u002Fcloudnative-pg.github.io\u002Fcharts\r\nhelm repo update\r\n\r\nhelm upgrade --install cnpg \\\r\n  --namespace cnpg-system \\\r\n  --create-namespace \\\r\n  cnpg\u002Fcloudnative-pg\r\n```\r\n\r\n### Namespace-Scoped (Enhanced Security)\r\n\r\n```bash\r\nhelm upgrade --install cnpg \\\r\n  --namespace cnpg-system \\\r\n  --create-namespace \\\r\n  --set config.clusterWide=false \\\r\n  cnpg\u002Fcloudnative-pg\r\n```\r\n\r\n## Cluster Configurations\r\n\r\n### Development (Single Instance)\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-dev\r\nspec:\r\n  instances: 1\r\n  imageName: ghcr.io\u002Fcloudnative-pg\u002Fpostgresql:17.2\r\n  primaryUpdateStrategy: unsupervised\r\n  storage:\r\n    size: 5Gi\r\n  postgresql:\r\n    parameters:\r\n      max_connections: \"100\"\r\n      shared_buffers: \"256MB\"\r\n```\r\n\r\n### Production (HA with 3 Replicas)\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-production\r\nspec:\r\n  instances: 3\r\n  imageName: ghcr.io\u002Fcloudnative-pg\u002Fpostgresql:17.2\r\n  primaryUpdateStrategy: unsupervised\r\n\r\n  storage:\r\n    storageClass: standard\r\n    size: 100Gi\r\n\r\n  resources:\r\n    requests:\r\n      memory: \"2Gi\"\r\n      cpu: \"1\"\r\n    limits:\r\n      memory: \"4Gi\"\r\n      cpu: \"2\"\r\n\r\n  postgresql:\r\n    parameters:\r\n      max_connections: \"200\"\r\n      shared_buffers: \"1GB\"\r\n      effective_cache_size: \"3GB\"\r\n      maintenance_work_mem: \"256MB\"\r\n      checkpoint_completion_target: \"0.9\"\r\n      wal_buffers: \"16MB\"\r\n      default_statistics_target: \"100\"\r\n      random_page_cost: \"1.1\"\r\n      effective_io_concurrency: \"200\"\r\n\r\n  affinity:\r\n    podAntiAffinityType: required  # Spread across nodes\r\n\r\n  monitoring:\r\n    enablePodMonitor: true\r\n```\r\n\r\n### With Bootstrap Database\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-cluster\r\nspec:\r\n  instances: 3\r\n  storage:\r\n    size: 10Gi\r\n\r\n  bootstrap:\r\n    initdb:\r\n      database: learnflow\r\n      owner: app_user\r\n      secret:\r\n        name: app-user-secret\r\n```\r\n\r\nCreate the secret first:\r\n\r\n```bash\r\nkubectl create secret generic app-user-secret \\\r\n  --from-literal=username=app_user \\\r\n  --from-literal=password=$(openssl rand -hex 16)\r\n```\r\n\r\n## Connection Secrets\r\n\r\nCloudNativePG automatically creates connection secrets:\r\n\r\n| Secret | Contents |\r\n|--------|----------|\r\n| `pg-cluster-app` | App credentials (recommended) |\r\n| `pg-cluster-superuser` | Superuser credentials |\r\n\r\n### Get Connection String\r\n\r\n```bash\r\n# Get app credentials\r\nkubectl get secret pg-cluster-app -o jsonpath='{.data.uri}' | base64 -d\r\n\r\n# Get superuser credentials (admin tasks only)\r\nkubectl get secret pg-cluster-superuser -o jsonpath='{.data.uri}' | base64 -d\r\n```\r\n\r\n### Use in Deployment\r\n\r\n```yaml\r\nenv:\r\n  - name: DATABASE_URL\r\n    valueFrom:\r\n      secretKeyRef:\r\n        name: pg-cluster-app\r\n        key: uri\r\n```\r\n\r\n## Service Endpoints\r\n\r\n| Service | Port | Use |\r\n|---------|------|-----|\r\n| `pg-cluster-rw` | 5432 | Read-Write (primary) |\r\n| `pg-cluster-ro` | 5432 | Read-Only (replicas) |\r\n| `pg-cluster-r` | 5432 | Any instance |\r\n\r\n### Connect from Another Namespace\r\n\r\n```yaml\r\nenv:\r\n  - name: DATABASE_URL\r\n    value: \"postgresql:\u002F\u002Fapp_user:password@pg-cluster-rw.default.svc.cluster.local:5432\u002Flearnflow\"\r\n```\r\n\r\n## Database Operations\r\n\r\n### Connect with psql\r\n\r\n```bash\r\n# Using kubectl cnpg plugin (recommended)\r\nkubectl cnpg psql pg-cluster -- -c \"SELECT version();\"\r\n\r\n# Or directly\r\nkubectl exec -it pg-cluster-1 -- psql -U postgres\r\n```\r\n\r\n### Create Database and User\r\n\r\n```bash\r\nkubectl exec -it pg-cluster-1 -- psql -U postgres \u003C\u003CEOF\r\nCREATE DATABASE myapp;\r\nCREATE USER myapp_user WITH ENCRYPTED PASSWORD 'secure_password';\r\nGRANT ALL PRIVILEGES ON DATABASE myapp TO myapp_user;\r\n\\c myapp\r\nGRANT ALL ON SCHEMA public TO myapp_user;\r\nEOF\r\n```\r\n\r\n### Run Migrations\r\n\r\n```bash\r\n# From local machine\r\nkubectl port-forward svc\u002Fpg-cluster-rw 5432:5432 &\r\nDATABASE_URL=\"postgresql:\u002F\u002Fpostgres:password@localhost:5432\u002Flearnflow\" alembic upgrade head\r\n```\r\n\r\n## Backup Configuration\r\n\r\n### Backup to S3\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-cluster\r\nspec:\r\n  instances: 3\r\n  storage:\r\n    size: 10Gi\r\n\r\n  backup:\r\n    barmanObjectStore:\r\n      destinationPath: \"s3:\u002F\u002Fmy-bucket\u002Fpg-backups\"\r\n      s3Credentials:\r\n        accessKeyId:\r\n          name: s3-creds\r\n          key: ACCESS_KEY_ID\r\n        secretAccessKey:\r\n          name: s3-creds\r\n          key: SECRET_ACCESS_KEY\r\n      wal:\r\n        compression: gzip\r\n      data:\r\n        compression: gzip\r\n    retentionPolicy: \"30d\"\r\n```\r\n\r\n### Schedule Backups\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: ScheduledBackup\r\nmetadata:\r\n  name: pg-backup-daily\r\nspec:\r\n  schedule: \"0 0 * * *\"  # Daily at midnight\r\n  backupOwnerReference: cluster\r\n  cluster:\r\n    name: pg-cluster\r\n```\r\n\r\n## Monitoring\r\n\r\n### Check Cluster Status\r\n\r\n```bash\r\nkubectl get cluster pg-cluster\r\nkubectl describe cluster pg-cluster\r\nkubectl get pods -l cnpg.io\u002Fcluster=pg-cluster\r\n```\r\n\r\n### View Logs\r\n\r\n```bash\r\nkubectl logs pg-cluster-1 -f\r\nkubectl logs -l cnpg.io\u002Fcluster=pg-cluster --all-containers\r\n```\r\n\r\n### Prometheus Metrics\r\n\r\nWith `enablePodMonitor: true`, metrics available at:\r\n- `cnpg_backends_total` - Active connections\r\n- `cnpg_pg_replication_lag_seconds` - Replica lag\r\n- `cnpg_pg_database_size_bytes` - Database size\r\n\r\n## Troubleshooting\r\n\r\n### Cluster Not Ready\r\n\r\n```bash\r\nkubectl describe cluster pg-cluster\r\nkubectl get pods -l cnpg.io\u002Fcluster=pg-cluster\r\nkubectl logs pg-cluster-1\r\n```\r\n\r\n### Connection Issues\r\n\r\n```bash\r\n# Test connectivity\r\nkubectl run pg-client --rm -it --restart=Never \\\r\n  --image=postgres:17 -- \\\r\n  psql \"postgresql:\u002F\u002Fapp_user:password@pg-cluster-rw:5432\u002Flearnflow\" -c \"SELECT 1;\"\r\n```\r\n\r\n### Common Issues\r\n\r\n| Error | Cause | Fix |\r\n|-------|-------|-----|\r\n| PVC pending | No storage class | Add `storageClass` to spec |\r\n| Connection refused | Wrong service name | Use `cluster-rw` for writes |\r\n| Auth failed | Wrong credentials | Check secret `cluster-app` |\r\n| Replica lag high | Heavy writes | Scale up, increase resources |\r\n\r\n## Cleanup\r\n\r\n```bash\r\n# Delete cluster (keeps PVCs by default)\r\nkubectl delete cluster pg-cluster\r\n\r\n# Delete PVCs (data loss!)\r\nkubectl delete pvc -l cnpg.io\u002Fcluster=pg-cluster\r\n\r\n# Remove operator\r\nkubectl delete -f \\\r\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fcloudnative-pg\u002Fcloudnative-pg\u002Frelease-1.28\u002Freleases\u002Fcnpg-1.28.0.yaml\r\n```\r\n\r\n## Verification\r\n\r\nRun: `python scripts\u002Fverify.py`\r\n\r\n## Related Skills\r\n\r\n- `operating-k8s-local` - Local Minikube cluster setup\r\n- `scaffolding-fastapi-dapr` - FastAPI services with SQLModel\r\n- `deploying-kafka-k8s` - Kafka for event-driven architecture","# Deploying PostgreSQL on Kubernetes\r\n\r\nDeploy production-ready PostgreSQL clusters using CloudNativePG operator (v1.28+) with automated failover.\r\n\r\n## Quick Start\r\n\r\n```bash\r\n# 1. Install CloudNativePG operator\r\nkubectl apply --server-side -f \\\r\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fcloudnative-pg\u002Fcloudnative-pg\u002Frelease-1.28\u002Freleases\u002Fcnpg-1.28.0.yaml\r\n\r\n# 2. Wait for operator\r\nkubectl rollout status deployment -n cnpg-system cnpg-controller-manager\r\n\r\n# 3. Deploy PostgreSQL cluster\r\nkubectl apply -f - \u003C\u003CEOF\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-cluster\r\nspec:\r\n  instances: 3\r\n  storage:\r\n    size: 10Gi\r\nEOF\r\n\r\n# 4. Wait for cluster\r\nkubectl wait cluster\u002Fpg-cluster --for=condition=Ready --timeout=300s\r\n```\r\n\r\n## Operator Installation\r\n\r\n### Direct Manifest (Recommended)\r\n\r\n```bash\r\nkubectl apply --server-side -f \\\r\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fcloudnative-pg\u002Fcloudnative-pg\u002Frelease-1.28\u002Freleases\u002Fcnpg-1.28.0.yaml\r\n\r\n# Verify\r\nkubectl rollout status deployment -n cnpg-system cnpg-controller-manager\r\nkubectl get pods -n cnpg-system\r\n```\r\n\r\n### Helm Installation\r\n\r\n```bash\r\nhelm repo add cnpg https:\u002F\u002Fcloudnative-pg.github.io\u002Fcharts\r\nhelm repo update\r\n\r\nhelm upgrade --install cnpg \\\r\n  --namespace cnpg-system \\\r\n  --create-namespace \\\r\n  cnpg\u002Fcloudnative-pg\r\n```\r\n\r\n### Namespace-Scoped (Enhanced Security)\r\n\r\n```bash\r\nhelm upgrade --install cnpg \\\r\n  --namespace cnpg-system \\\r\n  --create-namespace \\\r\n  --set config.clusterWide=false \\\r\n  cnpg\u002Fcloudnative-pg\r\n```\r\n\r\n## Cluster Configurations\r\n\r\n### Development (Single Instance)\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-dev\r\nspec:\r\n  instances: 1\r\n  imageName: ghcr.io\u002Fcloudnative-pg\u002Fpostgresql:17.2\r\n  primaryUpdateStrategy: unsupervised\r\n  storage:\r\n    size: 5Gi\r\n  postgresql:\r\n    parameters:\r\n      max_connections: \"100\"\r\n      shared_buffers: \"256MB\"\r\n```\r\n\r\n### Production (HA with 3 Replicas)\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-production\r\nspec:\r\n  instances: 3\r\n  imageName: ghcr.io\u002Fcloudnative-pg\u002Fpostgresql:17.2\r\n  primaryUpdateStrategy: unsupervised\r\n\r\n  storage:\r\n    storageClass: standard\r\n    size: 100Gi\r\n\r\n  resources:\r\n    requests:\r\n      memory: \"2Gi\"\r\n      cpu: \"1\"\r\n    limits:\r\n      memory: \"4Gi\"\r\n      cpu: \"2\"\r\n\r\n  postgresql:\r\n    parameters:\r\n      max_connections: \"200\"\r\n      shared_buffers: \"1GB\"\r\n      effective_cache_size: \"3GB\"\r\n      maintenance_work_mem: \"256MB\"\r\n      checkpoint_completion_target: \"0.9\"\r\n      wal_buffers: \"16MB\"\r\n      default_statistics_target: \"100\"\r\n      random_page_cost: \"1.1\"\r\n      effective_io_concurrency: \"200\"\r\n\r\n  affinity:\r\n    podAntiAffinityType: required  # Spread across nodes\r\n\r\n  monitoring:\r\n    enablePodMonitor: true\r\n```\r\n\r\n### With Bootstrap Database\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-cluster\r\nspec:\r\n  instances: 3\r\n  storage:\r\n    size: 10Gi\r\n\r\n  bootstrap:\r\n    initdb:\r\n      database: learnflow\r\n      owner: app_user\r\n      secret:\r\n        name: app-user-secret\r\n```\r\n\r\nCreate the secret first:\r\n\r\n```bash\r\nkubectl create secret generic app-user-secret \\\r\n  --from-literal=username=app_user \\\r\n  --from-literal=password=$(openssl rand -hex 16)\r\n```\r\n\r\n## Connection Secrets\r\n\r\nCloudNativePG automatically creates connection secrets:\r\n\r\n| Secret | Contents |\r\n|--------|----------|\r\n| `pg-cluster-app` | App credentials (recommended) |\r\n| `pg-cluster-superuser` | Superuser credentials |\r\n\r\n### Get Connection String\r\n\r\n```bash\r\n# Get app credentials\r\nkubectl get secret pg-cluster-app -o jsonpath='{.data.uri}' | base64 -d\r\n\r\n# Get superuser credentials (admin tasks only)\r\nkubectl get secret pg-cluster-superuser -o jsonpath='{.data.uri}' | base64 -d\r\n```\r\n\r\n### Use in Deployment\r\n\r\n```yaml\r\nenv:\r\n  - name: DATABASE_URL\r\n    valueFrom:\r\n      secretKeyRef:\r\n        name: pg-cluster-app\r\n        key: uri\r\n```\r\n\r\n## Service Endpoints\r\n\r\n| Service | Port | Use |\r\n|---------|------|-----|\r\n| `pg-cluster-rw` | 5432 | Read-Write (primary) |\r\n| `pg-cluster-ro` | 5432 | Read-Only (replicas) |\r\n| `pg-cluster-r` | 5432 | Any instance |\r\n\r\n### Connect from Another Namespace\r\n\r\n```yaml\r\nenv:\r\n  - name: DATABASE_URL\r\n    value: \"postgresql:\u002F\u002Fapp_user:password@pg-cluster-rw.default.svc.cluster.local:5432\u002Flearnflow\"\r\n```\r\n\r\n## Database Operations\r\n\r\n### Connect with psql\r\n\r\n```bash\r\n# Using kubectl cnpg plugin (recommended)\r\nkubectl cnpg psql pg-cluster -- -c \"SELECT version();\"\r\n\r\n# Or directly\r\nkubectl exec -it pg-cluster-1 -- psql -U postgres\r\n```\r\n\r\n### Create Database and User\r\n\r\n```bash\r\nkubectl exec -it pg-cluster-1 -- psql -U postgres \u003C\u003CEOF\r\nCREATE DATABASE myapp;\r\nCREATE USER myapp_user WITH ENCRYPTED PASSWORD 'secure_password';\r\nGRANT ALL PRIVILEGES ON DATABASE myapp TO myapp_user;\r\n\\c myapp\r\nGRANT ALL ON SCHEMA public TO myapp_user;\r\nEOF\r\n```\r\n\r\n### Run Migrations\r\n\r\n```bash\r\n# From local machine\r\nkubectl port-forward svc\u002Fpg-cluster-rw 5432:5432 &\r\nDATABASE_URL=\"postgresql:\u002F\u002Fpostgres:password@localhost:5432\u002Flearnflow\" alembic upgrade head\r\n```\r\n\r\n## Backup Configuration\r\n\r\n### Backup to S3\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: Cluster\r\nmetadata:\r\n  name: pg-cluster\r\nspec:\r\n  instances: 3\r\n  storage:\r\n    size: 10Gi\r\n\r\n  backup:\r\n    barmanObjectStore:\r\n      destinationPath: \"s3:\u002F\u002Fmy-bucket\u002Fpg-backups\"\r\n      s3Credentials:\r\n        accessKeyId:\r\n          name: s3-creds\r\n          key: ACCESS_KEY_ID\r\n        secretAccessKey:\r\n          name: s3-creds\r\n          key: SECRET_ACCESS_KEY\r\n      wal:\r\n        compression: gzip\r\n      data:\r\n        compression: gzip\r\n    retentionPolicy: \"30d\"\r\n```\r\n\r\n### Schedule Backups\r\n\r\n```yaml\r\napiVersion: postgresql.cnpg.io\u002Fv1\r\nkind: ScheduledBackup\r\nmetadata:\r\n  name: pg-backup-daily\r\nspec:\r\n  schedule: \"0 0 * * *\"  # Daily at midnight\r\n  backupOwnerReference: cluster\r\n  cluster:\r\n    name: pg-cluster\r\n```\r\n\r\n## Monitoring\r\n\r\n### Check Cluster Status\r\n\r\n```bash\r\nkubectl get cluster pg-cluster\r\nkubectl describe cluster pg-cluster\r\nkubectl get pods -l cnpg.io\u002Fcluster=pg-cluster\r\n```\r\n\r\n### View Logs\r\n\r\n```bash\r\nkubectl logs pg-cluster-1 -f\r\nkubectl logs -l cnpg.io\u002Fcluster=pg-cluster --all-containers\r\n```\r\n\r\n### Prometheus Metrics\r\n\r\nWith `enablePodMonitor: true`, metrics available at:\r\n- `cnpg_backends_total` - Active connections\r\n- `cnpg_pg_replication_lag_seconds` - Replica lag\r\n- `cnpg_pg_database_size_bytes` - Database size\r\n\r\n## Troubleshooting\r\n\r\n### Cluster Not Ready\r\n\r\n```bash\r\nkubectl describe cluster pg-cluster\r\nkubectl get pods -l cnpg.io\u002Fcluster=pg-cluster\r\nkubectl logs pg-cluster-1\r\n```\r\n\r\n### Connection Issues\r\n\r\n```bash\r\n# Test connectivity\r\nkubectl run pg-client --rm -it --restart=Never \\\r\n  --image=postgres:17 -- \\\r\n  psql \"postgresql:\u002F\u002Fapp_user:password@pg-cluster-rw:5432\u002Flearnflow\" -c \"SELECT 1;\"\r\n```\r\n\r\n### Common Issues\r\n\r\n| Error | Cause | Fix |\r\n|-------|-------|-----|\r\n| PVC pending | No storage class | Add `storageClass` to spec |\r\n| Connection refused | Wrong service name | Use `cluster-rw` for writes |\r\n| Auth failed | Wrong credentials | Check secret `cluster-app` |\r\n| Replica lag high | Heavy writes | Scale up, increase resources |\r\n\r\n## Cleanup\r\n\r\n```bash\r\n# Delete cluster (keeps PVCs by default)\r\nkubectl delete cluster pg-cluster\r\n\r\n# Delete PVCs (data loss!)\r\nkubectl delete pvc -l cnpg.io\u002Fcluster=pg-cluster\r\n\r\n# Remove operator\r\nkubectl delete -f \\\r\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fcloudnative-pg\u002Fcloudnative-pg\u002Frelease-1.28\u002Freleases\u002Fcnpg-1.28.0.yaml\r\n```\r\n\r\n## Verification\r\n\r\nRun: `python scripts\u002Fverify.py`\r\n\r\n## Related Skills\r\n\r\n- `operating-k8s-local` - Local Minikube cluster setup\r\n- `scaffolding-fastapi-dapr` - FastAPI services with SQLModel\r\n- `deploying-kafka-k8s` - Kafka for event-driven architecture",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fdeploying-postgres-k8s",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill deploying-postgres-k8s",{"tool":67,"command":68},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill deploying-postgres-k8s",{"tool":70,"command":71},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill deploying-postgres-k8s","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fdeploying-postgres-k8s\u002FSKILL.md",true,[75,81],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"scripts\u002Fverify.py","SCRIPT","脚本",1010,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fdeploying-postgres-k8s\u002Fscripts\u002Fverify.py",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"skill-report.json","REFERENCE","参考文档",11377,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fdeploying-postgres-k8s\u002Fskill-report.json",[88,100,110,119,125,132],{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":96,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[93],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[97,98,99],"model","model hierarchy","model hierarchy skill",{"skillNo":101,"name":102,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":106,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[105],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},[107,108,109],"MCP","zoom","zoom mcp",{"skillNo":111,"name":112,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[116,117,118,108],"sdk","zoom apps sdk","apps",{"skillNo":120,"name":121,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[121],{"skillNo":126,"name":127,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":131,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[130],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},[127],{"skillNo":133,"name":134,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[134]]