【问题标题】:Expose database to deployment on GKE向 GKE 上的部署公开数据库
【发布时间】:2018-08-25 15:17:46
【问题描述】:

我有一个运行 pod 的部署,它需要访问我在与 kubernetes 集群相同的集群中运行的 postgres 数据库。如何创建一个服务来选择部署以便它可以访问。随着连接超时,我的 pod 不断重启。我在 vpc 子网中创建了防火墙规则以允许内部通信,并修改了 pg_hba.conf 和 postgresql.conf 我的部署定义如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  labels: 
    name: server
    app: api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: gcr.io/api:v1
          ports:
            - containerPort: 80
          env:
            - name: DB_HOSTNAME
              valueFrom:
                secretKeyRef:
                  name: api-config
                  key: hostname
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: api-config
                  key: username
            - name: DB_NAME
              valueFrom:
                secretKeyRef:
                  name: api-config
                  key: name
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: api-config
                  key: password

这是我公开数据库的服务定义,但我认为我没有选择部署。我已经按照here的例子做了。

kind: Service
apiVersion: v1
metadata:
  name: postgres
  label:
spec:
  type: ClusterIP
  ports:
  - port: 5432
    targetPort: 5432
---
kind: Endpoints
apiVersion: v1
metadata:
  name: postgres
subsets:
  - addresses:
      - ip: 10.0.0.50
    ports:
      - port: 5432

【问题讨论】:

  • 对不起,我不确定我是否理解。您的数据库在集群内部,您想从外部访问它吗?还是反过来(数据库在集群之外)?
  • 它在 kubernetes 集群之外,但在同一个 vpc 中,但我想从集群内访问它
  • 你是尝试连接ip还是服务名?你能告诉我们你的连接字符串吗?另外,你可以使用外部ip连接到数据库吗?
  • user=postgres 密码=password dbname=test host=postgres.c.kube-cluster.internal;我正在使用 gcp 实例名称,这会正确解析为内部 IP
  • @driftavalii,我已经查看了Exp. 上的所有场景,它似乎与问题不符。您能否确认 Postgres 数据库确实在集群之外还是在集群内?通常应使用ClusterIP service 公开数据库部署以启用内部通信。

标签: kubernetes google-kubernetes-engine


【解决方案1】:

您可以使用以下方法将数据库公开到 GKE 上的部署:

$ kubectl expose deployment name-of-db --type=LoadBalancer --port 80 --target-port 8080

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
  • 这会暴露出我不想要的部署,我希望部署中的 pod 能够访问集群外的数据库
  • 由于您可以从集群中的 pod 中点击 ClusterIP,因此应使用 ClusterIP 公开部署。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 2020-07-24
  • 2020-07-11
  • 2020-10-06
相关资源
最近更新 更多