云服务器部署(使用GCE和GCS部署可热恢复的Web服务器)

引言负载均衡器会将流量定向到传送内容的代管式实例组中的 Compute Engine 实例。在服务中断时,您需要更新外部 HTTP(S) 负载平衡配置并故障切换到 Cloud Storage 中的静态站点。在生产部署中,您的网站在代管式实例组虚拟机 (VM) 上包含的文件和附加应用代码可能比本文档中显示的要多。然后,Cloud Storage 会托管一个较受限的静态版本,该版本提供最少的功能。在热故障切换场景中,直到代管式实例组恢复并可以传送流量以实现完整的网站体验前,用户只能看到此受限网站。在本教程中,您将部署资源以创建环境,如下图所示:如果需要进行故障切换,请更新负载均衡器配置以将流量定向到 Cloud Storage,如下图所示:这种热故障切换模式会平衡在其他区域运行另一个代管式实例组的费用,该区域仅在主区域发生故障时使用。使用 Cloud Storage 的静态网站的费用低于运行另一个代管式实例组的费用,但在更新托管选项之间的负载均衡器配置时,会出现短暂的延迟。Cloud Storage 中的有限网站体验优于不可用的网站和糟糕的客户体验。目标使用自定义虚拟机映像创建区域级代管式实例组。创建 Cloud Storage 存储分区。创建和配置外部 HTTP(S) 负载平衡。使用更新后的负载均衡器配置测试Web服务器热故障切换。使用更新后的负载均衡器配置测试恢复和故障恢复。准备工作安装并初始化 Cloud SDK。您将为资源名称和位置定义一些变量。在您部署资源时,gcloud 命令行工具命令会使用这些变量。请将 PROJECT_ID 替换为您自己的项目 ID。如果需要,您可以为资源提供自己的名称后缀,以帮助搜索和识别这些资源,例如 app。指定两个区域(如 us-west1 和 us-west2),以及其中一个区域中的可用区(如 us-west1-a)。此可用区定义用于创建初始基础虚拟机的位置,该虚拟机用于为代管式实例组创建映像。最后,设置用于静态网站的网域,例如 example.com。示例:PROJECT_ID=PROJECT_ID
NAME_SUFFIX=app
REGION1=us-west1
REGION2=us-west2
ZONE=us-west1-a
DOMAIN=example.com
创建 VPC 和子网如需提供对虚拟机的网络访问权限,请创建 Virtual Private Cloud (VPC) 和子网。您需要两个区域中的代管式实例组时,可以在每个区域中创建一个子网。使用自定义子网模式创建 VPC:gcloud compute networks create network-$NAME_SUFFIX –subnet-mode=custom
现在,在新 VPC 中创建两个子网,每个区域一个。自行定义适合您的网络范围的地址范围(例如 10.1.0.0/20和 10.2.0.0/20):gcloud compute networks subnets create \
subnet-$NAME_SUFFIX-$REGION1 \
–network=network-$NAME_SUFFIX \
–range= 10.1.0.0/20\
–region=$REGION1

gcloud compute networks subnets create \
subnet-$NAME_SUFFIX-$REGION2 \
–network=network-$NAME_SUFFIX \
–range= 10.2.0.0/20\
–region=$REGION2
创建防火墙规则如需在 VPC 中正确处理网络流量,您可以使用防火墙规则。创建防火墙规则,以允许负载均衡器和代管式实例组的网络流量和健康检查:gcloud compute firewall-rules create allow-http-$NAME_SUFFIX \
–network=network-$NAME_SUFFIX \
–direction=INGRESS \
–priority=1000 \
–action=ALLOW \
–rules=tcp:80 \
–source-ranges=0.0.0.0/0 \
–target-tags=http-server

gcloud compute firewall-rules create allow-health-check-$NAME_SUFFIX \
–network=network-$NAME_SUFFIX \
–action=allow \
–direction=ingress \
–source-ranges=130.211.0.0/22,35.191.0.0/16 \
–target-tags=allow-health-check \
–rules=tcp:80

HTTP 规则允许流量进入任何应用 http-server 标记的虚拟机,以及来自使用 0.0.0.0/0 范围的任何来源的流量。对于健康检查规则,Google Cloud 的默认范围需设置为允许平台正确检查资源的运行状况。如需允许基本虚拟机映像对 SSH 流量进行初始配置,请使用 –source-range 参数将防火墙规则范围限定到您的环境。您可能需要与网络团队合作,以确定您的组织使用的来源范围。!重要提示:我们不建议使用允许所有流量的宽泛 0.0.0.0/0 范围。要将流量限定到单个 IP 地址,请使用/32网络掩码,例如 35.230.62.163/32。将 IP_ADDRESS_SCOPE 替换为您自己的 IP 地址范围:gcloud compute firewall-rules create allow-ssh-$NAME_SUFFIX \
–network=network-$NAME_SUFFIX \
–direction=INGRESS \
–priority=1000 \
–action=ALLOW \
–rules=tcp:22 \
–source-ranges=35.230.62.163/32

创建防火墙规则后,请验证是否添加了这三条规则:gcloud compute firewall-rules list \
–project=$PROJECT_ID \
–filter="NETWORK=network-$NAME_SUFFIX"
以下示例输出显示了已正确创建三个规则:NAME NETWORK DIRECTION PRIORITY ALLOW
allow-health-check-app network-app INGRESS 1000 tcp:80
allow-http-app network-app INGRESS 1000 tcp:80
allow-ssh-app network-app INGRESS 1000 tcp:22
创建和配置基本虚拟机映像如需创建无需额外配置即可部署的相同虚拟机,请使用自定义虚拟机映像。此映像会捕获操作系统和 Apache 配置,并用于在后续步骤中创建代管式实例组中的每个虚拟机。在虚拟机上,在永久性磁盘上创建基本的 index.html 文件并将其装载到 /var/www/example.com。位于 /etc/apache2/sites-available/example.com.conf 的 Apache 配置文件从已装载的永久性磁盘位置提供网页内容。下图展示了由永久性磁盘上存储的 Apache 提供的基本 HTML 页面。您可以按照以下步骤构建此环境。创建挂接了永久性磁盘的基本虚拟机:gcloud compute instances create vm-base-$NAME_SUFFIX \
–zone=$ZONE \
–machine-type=n1-standard-1 \
–subnet=subnet-$NAME_SUFFIX-$REGION1 \
–tags=http-server \
–image=debian-10-buster-v20210420 \
–image-project=debian-cloud \
–boot-disk-size=10GB \
–boot-disk-type=pd-balanced \
–boot-disk-device-name=vm-base-$NAME_SUFFIX \
–create-disk=type=pd-ssd,name=disk-base-$NAME_SUFFIX,size=10GB,device-name=disk-base-$NAME_SUFFIX
您可以使用本文档开头定义的参数来命名虚拟机并连接到正确的子网。名称还会从启动磁盘的数据参数和数据磁盘的参数进行分配。如需安装和配置简单网站,请使用 SSH 连接到基本虚拟机:gcloud compute ssh vm-base-$NAME_SUFFIX –zone=$ZONE
在与虚拟机的 SSH 会话中,创建一个脚本以在您选择的编辑器中配置虚拟机。以下示例使用 Vim 作为编辑器:vim configure-vm.sh
将以下配置脚本粘贴到该文件中:#!/bin/bash
NAME_SUFFIX=app

# Create directory for the basic website files
sudo mkdir -p /var/www/example.com
sudo chmod a+w /var/www/example.com
sudo chown -R www-data: /var/www/example.com

# Find the disk name, then format and mount it
DISK_NAME="google-disk-base-$NAME_SUFFIX"
DISK_PATH="$(find /dev/disk/by-id -name "${DISK_NAME}" | xargs -I '{}' readlink -f '{}')"

sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard $DISK_PATH
sudo mount -o discard,defaults $DISK_PATH /var/www/example.com

# Install Apache
sudo apt-get update && sudo apt-get -y install apache2

# Write out a basic HTML file to the mounted persistent disk
sudo tee -a /var/www/example.com/index.html >/dev/null <<'EOF'
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<title>HA / DR example</title>
</head>
<body>
<p>Welcome to a Compute Engine website with warm failover to Cloud Storage!</p>
</body>
</html>
EOF

# Write out an Apache configuration file
sudo tee -a /etc/apache2/sites-available/example.com.conf >/dev/null <<'EOF'
<VirtualHost *:80>
ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/example.com

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF

# Enable the Apache configuration file and reload service
sudo a2dissite 000-default
sudo a2ensite example.com.conf
sudo systemctl reload apache2
更新 NAME_SUFFIX 变量以匹配本文档开头设置的值,例如 app。保存该文件并退出编辑器。将配置脚本设为可执行,然后运行它:chmod +x configure-vm.sh
./configure-vm.sh
退出与虚拟机的 SSH 会话:exit
获取虚拟机的 IP 地址,并使用 curl 查看基本网页:curl $(gcloud compute instances describe vm-base-$NAME_SUFFIX \
–zone $ZONE \
–format="value(networkInterfaces.accessConfigs.[0].natIP)")
系统会返回基本网站,如以下示例输出所示:<!doctype html>

<html lang=en>
<head>
<meta charset=utf-8>
<title>HA / DR example</title>
</head>
<body>
<p>Welcome to a Compute Engine website with warm failover to Cloud Storage!</p>
</body>
</html>
此步骤确认 Apache 已正确配置,并且已从挂接的永久性磁盘加载页面。在下面的部分中,您将使用此基本虚拟机创建映像,并使用启动脚本配置实例模板。部署 Compute Engine 资源热故障切换模式使用代管式实例组运行虚拟机。代管式实例组在两个区域中运行,每组均监控虚拟机的运行状况。如果发生服务中断并且其中一个虚拟机发生故障,则代管式实例组会重新创建该虚拟机。此配置会创建高可用性应用,即使没有热故障切换到 Cloud Storage 中的静态网站也是如此。您必须先停止虚拟机,然后才能创建映像:gcloud compute instances stop vm-base-$NAME_SUFFIX –zone=$ZONE
运行下面一组命令来创建虚拟机映像、实例模板和代管式实例组:# Create the base VM images
gcloud compute images create image-$NAME_SUFFIX \
–source-disk=vm-base-$NAME_SUFFIX \
–source-disk-zone=$ZONE

gcloud compute images create image-disk-$NAME_SUFFIX \
–source-disk=disk-base-$NAME_SUFFIX \
–source-disk-zone=$ZONE

# Create instance templates
gcloud compute instance-templates create template-$NAME_SUFFIX-$REGION1 \
–machine-type=n1-standard-1 \
–subnet=projects/$PROJECT_ID/regions/$REGION1/subnetworks/subnet-$NAME_SUFFIX-$REGION1 \
–region=$REGION1 \
–tags=http-server \
–metadata=^,@^startup-script=\!\#\ /bin/bash#39;\n'echo\ UUID=\`blkid\ -s\ UUID\ -o\ value\ /dev/sdb\`\ /var/www/example.com\ ext4\ discard,defaults,nofail\ 0\ 2\ \|\ tee\ -a\ /etc/fstab#39;\n'mount\ -a \
–image=image-$NAME_SUFFIX \
–create-disk=image=image-disk-$NAME_SUFFIX,auto-delete=yes

gcloud compute instance-templates create template-$NAME_SUFFIX-$REGION2 \
–machine-type=n1-standard-1 \
–subnet=projects/$PROJECT_ID/regions/$REGION2/subnetworks/subnet-$NAME_SUFFIX-$REGION2 \
–region=$REGION2 \
–tags=http-server \
–metadata=^,@^startup-script=\!\#\ /bin/bash#39;\n'echo\ UUID=\`blkid\ -s\ UUID\ -o\ value\ /dev/sdb\`\ /var/www/example.com\ ext4\ discard,defaults,nofail\ 0\ 2\ \|\ tee\ -a\ /etc/fstab#39;\n'mount\ -a \
–image=image-$NAME_SUFFIX \
–create-disk=image=image-disk-$NAME_SUFFIX,auto-delete=yes

# Create a health check for VM instances
gcloud compute health-checks create http http-basic-check-$NAME_SUFFIX \
–port 80

# Create the managed instance groups
gcloud compute instance-groups managed create instance-group-$NAME_SUFFIX-$REGION1 \
–template=template-$NAME_SUFFIX-$REGION1 \
–size=2 \
–region=$REGION1 \
–health-check=http-basic-check-$NAME_SUFFIX

gcloud compute instance-groups managed create instance-group-$NAME_SUFFIX-$REGION2 \
–template=template-$NAME_SUFFIX-$REGION2 \
–size=2 \
–region=$REGION2 \
–health-check=http-basic-check-$NAME_SUFFIX
创建和配置负载平衡器为了让用户能够访问您的网站,您需要允许流量流向代管式实例组中运行的虚拟机。如果代管式实例组中有区域故障,您还需要将流量自动重定向到新虚拟机。在下面的部分中,您将创建外部负载均衡器和后端服务,以获取端口 80 上的 HTTP 流量,使用在前面步骤中创建的健康检查,并将外部 IP 地址映射到后端服务。为您的应用创建和配置负载平衡器:# Configure port rules for HTTP port 80
gcloud compute instance-groups set-named-ports \
instance-group-$NAME_SUFFIX-$REGION1 \
–named-ports http:80 \
–region $REGION1

gcloud compute instance-groups set-named-ports \
instance-group-$NAME_SUFFIX-$REGION2 \
–named-ports http:80 \
–region $REGION2

# Create a backend service and add the managed instance groups to it
gcloud compute backend-services create \
web-backend-service-$NAME_SUFFIX \
–protocol=HTTP \
–port-name=http \
–health-checks=http-basic-check-$NAME_SUFFIX \
–global

gcloud compute backend-services add-backend \
web-backend-service-$NAME_SUFFIX \
–instance-group=instance-group-$NAME_SUFFIX-$REGION1 \
–instance-group-region=$REGION1 \
–global

gcloud compute backend-services add-backend \
web-backend-service-$NAME_SUFFIX \
–instance-group=instance-group-$NAME_SUFFIX-$REGION2 \
–instance-group-region=$REGION2 \
–global

# Create a URL map for the backend service
gcloud compute url-maps create web-map-http-$NAME_SUFFIX \
–default-service web-backend-service-$NAME_SUFFIX

# Configure forwarding for the HTTP traffic
gcloud compute target-http-proxies create \
http-lb-proxy-$NAME_SUFFIX \
–url-map web-map-http-$NAME_SUFFIX

gcloud compute forwarding-rules create \
http-content-rule-$NAME_SUFFIX \
–global \
–target-http-proxy=http-lb-proxy-$NAME_SUFFIX \
–ports=80
获取 Web 流量的转发规则的 IP 地址:IP_ADDRESS=$(gcloud compute forwarding-rules describe http-content-rule-$NAME_SUFFIX \
–global \
–format="value(IPAddress)")
使用 curl 或打开网络浏览器,以使用上一步中的负载均衡器的 IP 地址查看网站:curl $IP_ADDRESS
负载均衡器完成部署并将流量正确定向到您的后端需要几分钟时间。如果负载均衡器仍在部署,则系统会返回 HTTP 404 错误。如需要,请等待几分钟,再尝试访问网站。系统会返回基本网站,如以下示例输出所示:<!doctype html>

<html lang=en>
<head>
<meta charset=utf-8>
<title>HA / DR example</title>
</head>
<body>
<p>Welcome to a Compute Engine website with warm failover to Cloud Storage!</p>
</body>
</html>
创建和配置存储桶Cloud Storage 用于保存静态网站文件。在此基本示例中,您将创建一个文本与虚拟机上的文本略有不同的文件。在生产部署中,您的网站在代管式实例组虚拟机上包含的文件和附加应用代码可能比本文档中显示的要多。然后,托管在 Cloud Storage 中的静态版本通常是一个较受限的版本,该版本提供最少的功能。在热故障切换场景中,直到代管式实例组恢复并可以传送流量以获得完整的网站体验前,都会这一直显示 Cloud Storage 的有限网站。验证您要用于 Cloud Storage 存储桶的网域。创建一个 Cloud Storage 存储桶,以匹配您拥有的且要使用的网域名称:gsutil mb gs://static-web.$DOMAIN
使用本文档开头定义的 DOMAIN 变量,例如 example.com。此示例将静态文件存储在 static-web.example.com 中。创建您在下一步中复制到 Cloud Storage 存储桶的本地文件:cat <<EOF > index.html
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<title>HA / DR example</title>
</head>
<body>
<p>Welcome to a test static web server with warm failover from Cloud Storage!</p>
</body>
</html>
EOF
将基本 HTML 文件上传到 Cloud Storage 存储桶:gsutil cp index.html gs://static-web.$DOMAIN
如需允许用户查看静态 Web 内容,请对 Cloud Storage 存储桶设置适当的权限:gsutil iam ch allUsers:objectViewer gs://static-web.$DOMAIN
配置 Cloud Storage 存储桶以将 index.html 文件用作默认网页:gsutil web set -m index.html gs://static-web.$DOMAIN
将 Cloud Storage 存储桶添加到负载均衡器创建 Cloud Storage 存储桶并将其配置为托管静态网络内容后,负载均衡器需要将流量定向到它的信息。在创建和配置负载均衡器中,您为代管式实例组创建了后端服务。后端服务具有网址映射,HTTP 目标代理有助于通过负载均衡器将用户定向到虚拟机。为了将流量定向到 Cloud Storage 存储桶,请使用该存储桶的新后端和网址映射配置负载均衡器。如果需要进行故障切换,请更新负载均衡器以使用此配置。为 Cloud Storage 存储桶添加后端:gcloud compute backend-buckets create \
web-bucket-$NAME_SUFFIX \
–gcs-bucket-name=static-web.$DOMAIN
创建一个允许流量流向后端的网址映射:gcloud compute url-maps create \
web-map-http-bucket-$NAME_SUFFIX \
–default-backend-bucket=web-bucket-$NAME_SUFFIX
在模拟地区故障之前,请查看资源部署。支持该环境的所有资源均以创建,如下图所示:负载均衡器将流量定向到两个托管式实例组。每个托管式实例组都包含两个运行基本网站的虚拟机。如果代管式实例组发生服务中断,则系统会将 Cloud Storage 存储桶配置为托管静态页面。负载均衡器配置为使用 Cloud Storage 中的静态站点,但目前无法将流量定向到存储桶。故障切换到 Cloud Storage 存储桶在实际环境中,如果代管式实例组出现问题,您可能会收到使用 Cloud Monitoring 或其他监控解决方案的提醒。在更新负载均衡器以将流量重定向到 Cloud Storage 托管的静态网站之前,此提醒会提示用户了解故障的范围。另一种方法是使用监控解决方案自动响应代管式实例组的服务中断。故障切换时,外部 HTTP(S) 负载平衡会将流量定向到 Cloud Storage 托管的静态网站,如下图所示:当您或监控解决方案确定最合适的操作是更新负载平衡器以将流量定向到存储桶时,请更新 HTTP 代理目标以使用您在上一部分中创建的网址映射。在本文档中,手动更新负载平衡器以将流量重定向到 Cloud Storage 托管的静态网站。更新现有 HTTP 代理目标以使用 Cloud Storage 存储桶的网址映射:gcloud compute target-http-proxies update \
http-lb-proxy-$NAME_SUFFIX \
–url-map=web-map-http-bucket-$NAME_SUFFIX
现在,使用 curl 或打开网络浏览器来访问负载均衡器的 IP 地址:curl $IP_ADDRESS
系统会返回 Cloud Storage 中的静态网站,如以下示例输出中所示:<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<title>HA / DR example</title>
</head>
<body>
<p>Welcome to a test static web server with warm failover from Cloud Storage!</p>
</body>
</html>
负载均衡器可能需要几分钟时间才能更新配置并将流量正确定向到您的 Cloud Storage 存储桶。如需要,请等待几分钟,再尝试访问网站。故障恢复至代管式实例组代管式实例组问题解决后,您可以通过再次更新网址映射配置来切换回负载平衡的代管式实例组中的内容。同样,相关人员可能会使用 Cloud Monitoring 数据分析来判断代管式实例组的运行状况。或者,您可以使用自动化功能来响应代管式实例组的恢复运行状况。在本文档中,您将手动更新负载均衡器配置。更新 HTTP 代理目标以再次使用代管式实例组的网址映射:gcloud compute target-http-proxies update \
http-lb-proxy-$NAME_SUFFIX \
–url-map=web-map-http-$NAME_SUFFIX
再次使用 curl,或打开网络浏览器访问负载均衡器的 IP 地址:curl $IP_ADDRESS
负载均衡器可能需要几分钟才能更新配置并将流量正确定向回您的代管式实例组。如需要,请等待几分钟,再尝试访问网站。系统会返回代管式实例组中的主网站,如以下示例输出中所示:<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<title>HA / DR example</title>
</head>
<body>
p>Welcome to a Compute Engine website with warm failover to Cloud Storage!</p>
</body>
</html>
清除数据要删除本文档中创建的各资源,请完成以下步骤。删除 Cloud Storage 存储分区:gsutil rm -r gs://static-web.$DOMAIN
删除负载平衡器配置:gcloud compute forwarding-rules delete \
http-content-rule-$NAME_SUFFIX –global –quiet

gcloud compute target-http-proxies delete \
http-lb-proxy-$NAME_SUFFIX –quiet

gcloud compute url-maps delete web-map-http-$NAME_SUFFIX –quiet

gcloud compute url-maps delete web-map-http-bucket-$NAME_SUFFIX –quiet

gcloud compute backend-services delete \
web-backend-service-$NAME_SUFFIX –global –quiet

gcloud compute backend-buckets delete web-bucket-$NAME_SUFFIX –quiet
删除代管式实例组和健康检查:gcloud compute instance-groups managed delete \
instance-group-$NAME_SUFFIX-$REGION1 \
–region=$REGION1 –quiet

gcloud compute instance-groups managed delete \
instance-group-$NAME_SUFFIX-$REGION2 \
–region=$REGION2 –quiet

gcloud compute health-checks delete http-basic-check-$NAME_SUFFIX –quiet
删除实例模板、映像、基本虚拟机和永久性磁盘:gcloud compute instance-templates delete \
template-$NAME_SUFFIX-$REGION1 –quiet

gcloud compute instance-templates delete \
template-$NAME_SUFFIX-$REGION2 –quiet

gcloud compute images delete image-$NAME_SUFFIX –quiet

gcloud compute images delete image-disk-$NAME_SUFFIX –quiet

gcloud compute instances delete vm-base-$NAME_SUFFIX \
–zone=$ZONE –quiet
删除防火墙规则。gcloud compute firewall-rules delete \
allow-health-check-$NAME_SUFFIX –quiet

gcloud compute firewall-rules delete \
allow-ssh-$NAME_SUFFIX –quiet

gcloud compute firewall-rules delete \
allow-http-$NAME_SUFFIX –quiet
删除子网和 VPC。gcloud compute networks subnets delete \
subnet-$NAME_SUFFIX-$REGION1 –region=$REGION1 –quiet

gcloud compute networks subnets delete \
subnet-$NAME_SUFFIX-$REGION2 –region=$REGION2 –quiet

gcloud compute networks delete network-$NAME_SUFFIX –quiet

本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.175ku.com/27026.html