我正在 GCP 中设置 HTTPS 负载平衡器,但遇到了一些挑战。
我有两个想要对流量进行负载平衡的现有虚拟机,它们位于两个不同的 GCP VCP 网络中。
通过 GCP 控制台创建负载均衡器时,我被要求选择或创建一个实例组,但在创建一个实例组时,我发现没有添加现有虚拟机的选项。
我想要完成的是创建一个可通过 Internet 使用的负载均衡器,该负载均衡器将流量平衡到位于不同区域的两个不同网络中的两个现有 VM 的流量。我怎样才能做到这一点?
我正在 GCP 中设置 HTTPS 负载平衡器,但遇到了一些挑战。
我有两个想要对流量进行负载平衡的现有虚拟机,它们位于两个不同的 GCP VCP 网络中。
通过 GCP 控制台创建负载均衡器时,我被要求选择或创建一个实例组,但在创建一个实例组时,我发现没有添加现有虚拟机的选项。
我想要完成的是创建一个可通过 Internet 使用的负载均衡器,该负载均衡器将流量平衡到位于不同区域的两个不同网络中的两个现有 VM 的流量。我怎样才能做到这一点?
我在 GCP Compute Engine 上托管一个 Wordpress 实例(使用 Marketplace 图像)。当我直接访问实例 IP 时效果很好,延迟在 20 毫秒左右。
但是,为了确保站点安全,我在实例前面使用了 GCP HTTP 负载均衡器。我已将我的域指向负载均衡器。
当我通过负载平衡器(HTTP 或 HTTPS)访问 Wordpress 时,我得到了一些延迟时间非常长的查询(大约 17 毫秒),但随后每 4 或 5 个查询,就有一个大约需要 5 秒的请求。当我直接访问实例时,这不会发生。
我启用了负载均衡器日志,我观察到实例每隔几个请求就响应缓慢。我尝试将实例的 KeepAlive Apache2 参数设置为 300,但没有任何区别。
这可能是什么根本原因?(我不确定是 Wordpress、实例还是负载均衡器)。
谢谢
我是这个话题的新手。我们使用 GCP(App Engine,标准)来托管一个 nodejs 应用程序。然而,出于不同的原因,我们决定创建两个服务——stage和default(认为是同一个应用程序并行运行)。
默认一个与自定义域(GAE 提供的 SSL 证书)连接并正常工作。可以使用 google 生成的 URL (stage-dot-example.appspot.com) 访问舞台服务,并且显然受到 ssl 证书的保护。
然后,我们必须通过合作伙伴的安全审查,我们为此使用了阶段。
结果是我们必须禁用 TLSv1.0 和 TLSv1.1。使用 GAE - 我们需要创建负载均衡器并将 SSL 策略切换到特定于 TLS 的策略。
问题:要创建外部 HTTPS 负载平衡器 - 您必须创建 SSL 证书资源(即您必须拥有域)。使用自定义域,我想这应该不难,但我该如何为舞台做到这一点?我是否在 SSL 证书资源中使用我的阶段域 (...appspot.com)?如果是这样 - 我如何处理 DNS 记录和外部 IP(您需要将 IP 切换到 A 和 AAAA 记录中的外部 IP)?
或者如果我做错了什么 - 你能指出我正确的方向吗?
更新 + 更新 2
我决定走 Wojtek_B 提出的路径。所以我验证了 stage.example.com,它在没有负载均衡器的情况下运行良好。
那时,我的 DNS 记录包括来自 @ 的 4 条 A 和 4 条 AAAA 记录,带有 google 提供的 IP,以及 3 条 CNAME 记录(www、stage、www.stage)指向“ghs.googlehosted.com”。
接下来,我创建了具有 4 个域的 SSL 证书资源:example.com、www.example.com、stage.example.com、www.stage.example.com。
然后我添加了一个外部 HTTPS 负载均衡器(使用外部 IP,例如,1.2.3.4 和上面提到的 SSL 证书)。
我为@、www、stage 和www.stage 添加了新的A 记录以指向1.2.3.4。我已经删除了 CNAME 记录,因为它们过多。
等待 2-3 小时(TTL 为 1/2 小时)后,所有子域都被激活,除了 example.com(卡在 FAILED_NOT_VISIBLE 中)。
回答
一段时间以来,我一直在与托管 SSL 证书陷入供应状态作斗争。我遵循本教程,您应该只创建外部 IP (v4)。但我也有 4 条 AAAA 记录(在域验证期间获得)(显然)ipv6。所以我尝试保留外部 IP (v6),不到一分钟就将所有 4 个(子)域推送到活动状态。
在短短几分钟内,通过 LB 的两个服务都启动并运行所需的 TLS 配置。
创建网络端点组时,我需要指定网络端点。对于这些,我可以选择我的 VM 实例并指定主要(内部)IP 地址。
然后我可以选择这个 NEG 作为全局 HTTPS 负载均衡器的后端。
全局分布式负载均衡器如何将流量转发到没有外部 IP 的虚拟机?
如果我创建一个内部负载均衡器,负载均衡器将部署到同一 VPC 中的子网,因此它可以看到我的实例,但全局 HTTPS 负载均衡器不在我的 VPC 中。
我有以下外部谷歌云负载均衡器配置:
INTERNET_IP_PORT
指向 Kubernetes 集群的 IP。INTERNET_FQDN_PORT
指向由 Yandex S3 服务管理。由于某种原因,某些后端服务无法工作,当我尝试连接它们时,它们会响应 HTML 页面显示502 Server Error:
错误:服务器错误
服务器遇到临时错误,无法完成您的请求。
请在 30 秒后重试。
在失败的后端服务日志中总是有以下错误:
jsonPayload: {
cacheId: "GRU-c0ee45d8"
@type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
statusDetails: "failed_to_pick_backend"
}
对后端服务的请求在 1 毫秒内失败(如日志中所述),因此它们似乎甚至没有尝试连接到我的 Kubernetes 集群的 IP 或托管 S3 并立即失败。
在发布此问题时,S3 和 Imgproxy 后端服务状况良好,但其他服务无法正常工作:
如果我重新部署所有内容,其他一些服务可能会失败,例如:
所以这绝对是随机的,我不明白为什么会发生。如果我足够幸运,重新部署后所有后端服务都会运行良好。也有可能它们都不起作用。
Kubernetes 集群可以正常工作,它接受连接,托管 S3 也可以正常工作。它看起来像一个错误,但我在 Google 中找不到任何关于此的内容。
这是我的 Terraform 配置的外观:
resource "google_compute_global_network_endpoint_group" "kubernetes-cluster" {
name = "kubernetes-cluster-${var.ENVIRONMENT_NAME}"
network_endpoint_type = "INTERNET_IP_PORT"
depends_on = [
module.kubernetes-resources
]
}
resource "google_compute_global_network_endpoint" "kubernetes-cluster" {
global_network_endpoint_group = google_compute_global_network_endpoint_group.kubernetes-cluster.name
port = 80
ip_address = yandex_vpc_address.kubernetes.external_ipv4_address.0.address
}
resource "google_compute_global_network_endpoint_group" "s3" {
name = "s3-${var.ENVIRONMENT_NAME}"
network_endpoint_type = "INTERNET_FQDN_PORT"
}
resource "google_compute_global_network_endpoint" "s3" {
global_network_endpoint_group = google_compute_global_network_endpoint_group.s3.name
port = 443
fqdn = trimprefix(local.s3.endpoint, "https://")
}
resource "google_compute_backend_service" "s3" {
name = "s3-${var.ENVIRONMENT_NAME}"
backend {
group = google_compute_global_network_endpoint_group.s3.self_link
}
custom_request_headers = [
"Host:${google_compute_global_network_endpoint.s3.fqdn}"
]
cdn_policy {
cache_key_policy {
include_host = true
include_protocol = false
include_query_string = false
}
}
enable_cdn = true
load_balancing_scheme = "EXTERNAL"
log_config {
enable = true
sample_rate = 1.0
}
port_name = "https"
protocol = "HTTPS"
timeout_sec = 60
}
resource "google_compute_backend_service" "imgproxy" {
name = "imgproxy-${var.ENVIRONMENT_NAME}"
backend {
group = google_compute_global_network_endpoint_group.kubernetes-cluster.self_link
}
cdn_policy {
cache_key_policy {
include_host = true
include_protocol = false
include_query_string = false
}
}
enable_cdn = true
load_balancing_scheme = "EXTERNAL"
log_config {
enable = true
sample_rate = 1.0
}
port_name = "http"
protocol = "HTTP"
timeout_sec = 60
}
resource "google_compute_backend_service" "api" {
name = "api-${var.ENVIRONMENT_NAME}"
custom_request_headers = [
"Access-Control-Allow-Origin:${var.ALLOWED_CORS_ORIGIN}"
]
backend {
group = google_compute_global_network_endpoint_group.kubernetes-cluster.self_link
}
load_balancing_scheme = "EXTERNAL"
log_config {
enable = true
sample_rate = 1.0
}
port_name = "http"
protocol = "HTTP"
timeout_sec = 60
}
resource "google_compute_backend_service" "front" {
name = "front-${var.ENVIRONMENT_NAME}"
backend {
group = google_compute_global_network_endpoint_group.kubernetes-cluster.self_link
}
cdn_policy {
cache_key_policy {
include_host = true
include_protocol = false
include_query_string = true
}
}
enable_cdn = true
load_balancing_scheme = "EXTERNAL"
log_config {
enable = true
sample_rate = 1.0
}
port_name = "http"
protocol = "HTTP"
timeout_sec = 60
}
resource "google_compute_url_map" "default" {
name = "default-${var.ENVIRONMENT_NAME}"
default_service = google_compute_backend_service.front.self_link
host_rule {
hosts = [
local.hosts.api,
local.hosts.fps
]
path_matcher = "api"
}
host_rule {
hosts = [
local.hosts.s3
]
path_matcher = "s3"
}
host_rule {
hosts = [
local.hosts.imgproxy
]
path_matcher = "imgproxy"
}
path_matcher {
default_service = google_compute_backend_service.api.self_link
name = "api"
}
path_matcher {
default_service = google_compute_backend_service.s3.self_link
name = "s3"
}
path_matcher {
default_service = google_compute_backend_service.imgproxy.self_link
name = "imgproxy"
}
test {
host = local.hosts.docs
path = "/"
service = google_compute_backend_service.front.self_link
}
test {
host = local.hosts.api
path = "/"
service = google_compute_backend_service.api.self_link
}
test {
host = local.hosts.fps
path = "/"
service = google_compute_backend_service.api.self_link
}
test {
host = local.hosts.s3
path = "/"
service = google_compute_backend_service.s3.self_link
}
test {
host = local.hosts.imgproxy
path = "/"
service = google_compute_backend_service.imgproxy.self_link
}
}
# See: https://github.com/hashicorp/terraform-provider-google/issues/5356
resource "random_id" "managed-certificate-name" {
byte_length = 4
prefix = "default-${var.ENVIRONMENT_NAME}-"
keepers = {
domains = join(",", values(local.hosts))
}
}
resource "google_compute_managed_ssl_certificate" "default" {
name = random_id.managed-certificate-name.hex
lifecycle {
create_before_destroy = true
}
managed {
domains = values(local.hosts)
}
}
resource "google_compute_ssl_policy" "default" {
name = "default-${var.ENVIRONMENT_NAME}"
profile = "MODERN"
}
resource "google_compute_target_https_proxy" "default" {
name = "default-${var.ENVIRONMENT_NAME}"
url_map = google_compute_url_map.default.self_link
ssl_policy = google_compute_ssl_policy.default.self_link
ssl_certificates = [
google_compute_managed_ssl_certificate.default.self_link
]
}
resource "google_compute_global_forwarding_rule" "default" {
name = "default-${var.ENVIRONMENT_NAME}"
load_balancing_scheme = "EXTERNAL"
port_range = "443-443"
target = google_compute_target_https_proxy.default.self_link
}
UPD。我发现重新创建 NEG 将解决这个问题:
但这绝对是 hack,似乎没有办法用 Terraform 自动化它。我会继续调查这个问题。
我目前有一个托管在 Google Compute Engine 上的网站,该网站通过位于负载均衡器后面的 Identity-Aware-Proxy 进行了身份验证。这一切都适用于 https,但我想确保 http 重定向到 https,因为它目前只响应 404。
因此,我遵循了https://cloud.google.com/load-balancing/docs/https/setting-up-http-https-redirect,它告诉您设置第二个负载均衡器以将 http 流量重定向到 https。
但是,问题是,按照这些说明操作后,当我浏览到http://my-website.com时,我收到以下错误:
错误 403(禁止)!!1
- 那是一个错误。
您的客户端无权从此服务器获取 URL /。我们知道的就这些。
尽管 http 负载均衡器设置了 301 - 永久移动完整路径重定向,但在浏览器开发人员工具网络选项卡中没有发生重定向。它只是立即以 403 响应。URL 也使用 http:// 方案。
总而言之,我的设置如下所示:
外部 HTTPS 负载均衡器
外部 HTTP 负载均衡器
任何想法如何解决这个问题,而不是得到 403 将不胜感激!