Je rencontre des problèmes pour accéder à une instance Cloud SQL exécutant Postgres à partir d'un cluster GKE en utilisant l'IP privée de la base de données. Toute la documentation que j'ai trouvée suggère d'utiliser un cluster activé pour VPC pour accomplir cela, mais j'ai toujours du mal à accéder à la base de données.
Plus précisément, je peux accéder à la base de données à partir des nœuds de mon cluster, mais je ne peux pas y accéder à partir d'un conteneur sur le nœud à moins d'exécuter le conteneur Docker en utilisant le réseau de l'hôte. Cela me fait penser que j'ai une incompréhension de la façon dont les composants de réseau d'un VPC GCP et de Kubernetes interagissent les uns avec les autres.
VPC
Mon VPC a un sous-réseau avec deux plages secondaires :
Plage IP : 10.0.0.0/16
Plage secondaire - pods : 10.1.0.0/16
Plage secondaire - services : 10.2.0.0/16
Ceci est créé en utilisant la configuration Terraform suivante :
resource "google_compute_subnetwork" "cluster" {
ip_cidr_range = "10.0.0.0/16"
name = "cluster"
network = google_compute_network.vpc.self_link
secondary_ip_range {
ip_cidr_range = "10.1.0.0/16"
range_name = "pods"
}
secondary_ip_range {
ip_cidr_range = "10.2.0.0/16"
range_name = "services"
}
}
Base de Données
Ma base de données Cloud SQL exécute Postgres 11 et est configurée pour autoriser uniquement les connexions via l'IP privée. J'ai mis en place une connexion de couplage avec un ensemble d'adresses de calcul globales pour permettre l'accès à l'instance Cloud SQL depuis mon VPC. Dans ce cas, j'ai obtenu les valeurs suivantes :
Plage d'IP de connexion de service privé : 172.26.0.0/16
IP Privée de la Base de Données : 172.26.0.3
Ces ressources sont provisionnées avec la configuration Terraform suivante :
resource "google_compute_global_address" "db_private_ip" {
provider = "google-beta"
name = "db-private-ip"
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 16
network = google_compute_network.vpc.self_link
}
resource "google_service_networking_connection" "db_vpc_connection" {
network = google_compute_network.vpc.self_link
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.db_private_ip.name]
}
resource "google_sql_database_instance" "db" {
depends_on = [google_service_networking_connection.db_vpc_connection]
database_version = "POSTGRES_11"
settings {
availability_type = "ZONAL"
tier = "db-f1-micro"
ip_configuration {
ipv4_enabled = false
private_network = google_compute_network.vpc.self_link
}
}
}
Cluster
Mon cluster GKE est configuré pour être natif VPC et pour utiliser les plages secondaires du sous-réseau cluster
du VPC. Informations importantes sur le cluster :
Version du Master : 1.14.8-gke.17
Réseau : my-vpc
Sous-réseau : cluster
Natif VPC : Activé
Plage d'adresses des Pods : 10.1.0.0/16
Plage d'adresses des Services : 10.2.0.0/16
Le cluster est créé en utilisant la configuration Terraform suivante :
resource "google_container_cluster" "primary" {
location = var.gcp_region
min_master_version = data.google_container_engine_versions.latest_patch.latest_master_version
name = "my-cluster"
network = google_compute_network.vpc.self_link
subnetwork = google_compute_subnetwork.cluster.self_link
# We can't create a cluster with no node pool defined, but we want to only use
# separately managed node pools. So we create the smallest possible default
# node pool and immediately delete it.
remove_default_node_pool = true
initial_node_count = 1
ip_allocation_policy {
use_ip_aliases = true
cluster_secondary_range_name = "pods"
services_secondary_range_name = "services"
}
master_auth {
username = ""
password = ""
client_certificate_config {
issue_client_certificate = false
}
}
}
Tentatives de Connexion
J'ai essayé de me connecter à la base de données depuis de nombreux contextes différents pour essayer de comprendre le problème.
Instance Autonome
J'ai créé une nouvelle VM de calcul Ubuntu dans mon VPC et j'ai pu me connecter à la base de données en utilisant à la fois nping
et psql
.
Depuis un Conteneur sur un Nœud
En utilisant soit kubectl attach
sur un pod de mon cluster, soit en me connectant en SSH sur un nœud et en exécutant ma propre commande docker, je constate que tous les paquets vers la base de données ne parviennent pas.
# En se connectant en SSH et en exécutant un conteneur docker.
docker run -it ubuntu /bin/bash -c 'apt update && apt install -y nmap && nping --tcp -p 5432 172.26.0.3'
Depuis un Conteneur sur un Nœud avec le Réseau de l'Hôte
Si je répète la commande ci-dessus mais en utilisant le réseau de l'hôte, je peux me connecter à la base de données.
docker run -it --net host ubuntu /bin/bash -c 'apt update && apt install -y nmap && nping --tcp -p 5432 172.26.0.3'
Suggestions?
Étant donné que la plupart des questions sur la connexion à une instance Cloud SQL depuis GKE via une IP privée sont résolues lorsqu'ils configurent leur cluster pour être VPC-native, je suppose que mon problème réside quelque part dans ma configuration réseau. Je serais reconnaissant pour toute suggestion et je suis prêt à fournir des informations supplémentaires. Merci.
Questions Connexes
Problème de Connexion à Cloud SQL Postgres en utilisant une IP Privée depuis GKE
Mise à Jour 2019-12-05
En convertissant les commandes de la question connexe liée ci-dessus en Terraform (appelons cela la configuration MVP), je suis en mesure de me connecter à l'instance Postgres en utilisant une IP privée, je pense donc maintenant que le problème réside plus en profondeur dans ma configuration. Je n'ai toujours pas déterminé quel élément exact de mon infrastructure diffère de la configuration MVP.
Ma prochaine tentative consistera probablement à améliorer la configuration MVP pour utiliser un pool de nœuds configuré séparément plutôt que le pool de nœuds par défaut pour voir si cela explique le comportement que je constate.