2

我想从 Google Cloud Function 连接到 Kubernetes (GKE) 容器。具体来说,容器有 postgres 数据库,我想读取表中的记录。

在 Golang 中:

func ConnectPostgres(w http.ResponseWriter, r *http.Request) {

    db, err := sql.Open("postgres", "postgresql://postgres@10.32.0.142:5432/myDatabase")

    if err != nil {
        http.Error(w, "Error opening conn:" + err.Error(), http.StatusInternalServerError)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        http.Error(w, "Error ping conn:" + err.Error(), http.StatusInternalServerError)
    }

    rows, err := db.Query("SELECT * FROM myTable")

    fmt.Println(rows)

    w.Write([]byte(rows))
}

10.32.0.142 是拥有容器的 pod 的内部 IP。

但是当云函数尝试 Ping 到 postgres 容器时,请求会超时。

我该如何解决这个问题?

4

2 回答 2

4

您需要先将 Cloud Function 连接到 VPC,此处详细说明:https ://cloud.google.com/functions/docs/connecting-vpc

于 2019-05-16T00:30:16.697 回答
0

要从内部网络从 Cloud Function 连接到 GKE 容器,正如@Cloud Ace提到的,您必须将 Cloud Function 连接到您的 VPC

否则,如果您不想处理连接器,则可以通过 LB 或节点的公共 IP 地址连接到 GKE 集群上的服务。

在这两种情况下,您都必须创建服务并将5432端口公开到 Kubernetes 集群之外。您不能直接使用 pod ip 地址。

如果您将使用vpc 连接器(内部),您可以只使用NodePort 类型的服务并使用节点的内部 IP地址。

但是,如果您不使用vpc 连接器,type: NodePort则服务也将使用节点的外部/公共 IP 地址,您还必须为节点添加防火墙规则

所以我建议为您的 postgres 端点使用LoadBalancer类型的服务,因为它会在 GCP 上使用公共 IP 地址创建负载均衡器,并将在 GCP 上自动创建所有转发和防火墙规则。

希望能帮助到你!

于 2019-05-16T09:59:53.373 回答