Kubernetes中的rails + postgres:连接被拒绝

时间:2020-05-10 17:55:23

标签: ruby-on-rails postgresql kubernetes

我的Rails部署无法连接到postgres数据库。日志中的错误:

PG::ConnectionBad (could not connect to server: Connection refused
  Is the server running on host "db" (10.0.105.11) and accepting
  TCP/IP connections on port 5432?
):

这是我的kubectl get services输出:

NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
load-balancer            LoadBalancer   10.0.5.147     60.86.4.33    80:31259/TCP   10m
db                       ClusterIP      10.0.105.11    <none>        5432/TCP       10m
kubernetes               ClusterIP      10.0.0.1       <none>        443/TCP        10m
web                      ClusterIP      10.0.204.107   <none>        3000/TCP       10m

db-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: db
  name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: db
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: db
    spec:
      containers:
      - env:
        - name: POSTGRES_DB
          value: postgres
        - name: POSTGRES_HOST_AUTH_METHOD
          value: trust
        - name: POSTGRES_USER
          value: postgres
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
        ports:
        - containerPort: 5432
        image: postgres
        imagePullPolicy: ""
        name: db
        resources: {}
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgres
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
      - name: postgres
        persistentVolumeClaim:
          claimName: postgres
status: {}

db-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: db
  labels:
    app: db
spec:
  ports:
    - port: 5432
  selector:
    app: db
    tier: database

config / database.yml:

default: &default
  adapter: postgresql
  encoding: utf8
  host: db
  username: postgres
  pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production

如何确保postgres实例正在运行并接受连接?我是否在清单文件中配置错误,还是database.yml文件需要指向其他主机?

1 个答案:

答案 0 :(得分:3)

首先让我惊讶的是,您的public class Tree { public static void main(String[] args) { BinarySearchTree<String> bTree = new BinarySearchTree<String>(); bTree.add("1"); bTree.add("2"); bTree.add("3"); bTree.add("4"); bTree.add("5"); bTree.add("6"); bTree.add("7"); int size = abcTree.treeHeight() - 1; int leftNode = abcTree.size() - abcTree.oobScore2(); double balanced = leftNode / size; for (int i = 0; i < size; i++ ) { if (i < leftNode) { //abcTree.rebalance(); System.out.println(balanced); return; } } } } 服务针对两个选择器dbapp: db,但是对应的tier: database仅具有{{1 }} 标签。您将需要在部署模板元数据中添加deployment.yml标签,以便该服务将适当地定位到正确的pod。

db

通常,如果服务未连接到后端Pod,则可以使用简单的kubectl命令轻松诊断问题。
这将告诉您当前将哪些选择器应用于您的服务

tier

然后,您可以获取选择器所引用的pod,并确保它返回了某些东西。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: db
    tier: database 
  name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: db
      tier: database
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: db
        tier: database

最后,我建议通过kube-proxy使用服务设置的 DNS 名称,而不是群集IP地址。我倾向于将其视为比群集更具弹性的,因为如果服务IP发生更改,它将自动路由。在您的连接字符串中,使用kubectl describe service db -o yaml 代替kubectl get pods -l app=db -l tier=database