【问题标题】:Cloud Function - Connecting to Kubernetes containerCloud Function - 连接到 Kubernetes 容器
【发布时间】:2019-10-02 19:45:39
【问题描述】:

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

在 Go 语言中:

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 容器时,请求会超时。

我该如何解决这个问题?

【问题讨论】:

    标签: kubernetes google-cloud-platform google-cloud-functions google-kubernetes-engine gke-networking


    【解决方案1】:

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

    【讨论】:

    • 当我尝试创建 VPC 连接器时,我总是收到错误消息:“连接器处于错误状态,建议手动删除”我尝试了各种未使用的 IP 范围。示例中是 10.182.0.0/28,testvpc 网络的 IP 范围是 10.32.0.0/14,这是我们的集群 IP 范围。
    【解决方案2】:

    要从内部网络从 Cloud Function 连接到 GKE 容器,如 @Cloud Ace 所述,您必须connect your Cloud Function to your VPC

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

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

    如果您将使用 vpc 连接器(内部),您可以使用NodePort type service 并使用节点的内部 ip 地址。

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

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

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 2020-07-01
      • 2019-05-26
      • 2020-01-23
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      相关资源
      最近更新 更多