Облачная функция - подключение к контейнеру Kubernetes
Я хочу подключиться из Google Cloud Function к контейнеру Kubernetes (GKE). В частности, контейнер имеет базу данных postgres, и я хочу читать записи в таблице.
На Голанге:
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 - внутренний IP-адрес модуля, в котором находится контейнер.
Но когда облачная функция пытается выполнить Ping для postgres контейнера, время запроса истекает.
Как я могу решить это?
2 ответа
Сначала вам нужно подключить облачную функцию к VPC, подробно здесь: https://cloud.google.com/functions/docs/connecting-vpc
Чтобы подключиться из облачной функции к контейнеру GKE из внутренней сети, как отметил @Cloud Ace, вам необходимо подключить облачную функцию к вашему VPC.
В противном случае, если вы не хотите иметь дело с соединителем, вы можете подключиться к вашему сервису в кластере GKE через публичный IP-адрес вашего LB или узлов.
В обоих случаях вы должны создать сервис и выставить 5432
порт за пределами вашего кластера kubernetes. Вы не можете использовать напрямую IP-адреса.
Если вы будете использовать vpc-соединитель (внутри), вы можете просто использовать службу типа NodePort и использовать внутренние ip- адреса узла.
Но если вы пойдете без разъема vpc, также type: NodePort
Сервис будет работать с внешними / публичными IP-адресами узлов, и вам также необходимо добавить правило брандмауэра для узлов.
Поэтому я бы предложил использовать службу типа LoadBalancer для вашей конечной точки postgres, поскольку она создаст балансировщик нагрузки на GCP с публичным IP-адресом и автоматически создаст все правила переадресации и межсетевого экрана на GCP.
Надеюсь, поможет!