将 ASP.NET 应用部署到 Compute Engine


本教程介绍如何将 .NET Web 应用部署到 Compute Engine。

本教程适用于对 Microsoft .NET 和 Compute Engine 有基本了解的开发者和 DevOps 工程师。

目标

将使用 .NET 6 并在 Linux 上运行的 ASP.NET Core Web 应用部署到单个 Compute Engine 实例。

本教程介绍了如何完成以下任务来实现目标:

  • 部署 Compute Engine 虚拟机
  • 设置负载均衡
  • 部署 ASP.NET 应用

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine API.

    Enable the API

部署 Compute Engine 虚拟机

本部分介绍了如何创建在 Compute Engine 上运行 Microsoft Internet Information Services (IIS) Web 服务器的 Linux 虚拟机或 Windows Server 虚拟机。

  1. 为项目 ID 和 Compute Engine 可用区设置默认值。这有助于您节省时间。

    gcloud config set project PROJECT_ID
    gcloud config set compute/zone ZONE
    

    请替换以下内容:

    • PROJECT_ID 替换为您的 Google Cloud 项目的 ID。
    • ZONE 替换为您将用于创建资源的可用区的名称。如果您不确定要选择哪个可用区,请使用距离您最近的可用区。

    例如:

    gcloud config set project test-project-12345
    gcloud config set compute/zone us-central1-a
    
  2. 创建虚拟机实例:

    如需创建 Linux 虚拟机,请执行以下操作:

    1. 为虚拟机实例创建启动脚本。该脚本会在虚拟机初始化期间运行并安装 .NET 运行时

      "if ! dpkg-query -W aspnetcore-runtime-6.0
      then
          curl https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb  -O
          sudo dpkg -i packages-microsoft-prod.deb
          rm packages-microsoft-prod.deb
          sudo apt-get update && sudo apt-get install -y aspnetcore-runtime-6.0
      fi
      " | Out-File -Encoding ASCII startup.sh
      
    2. 创建虚拟机实例并将 startup.sh 用作启动脚本:

      gcloud compute instances create clouddemo-1 `
          --image-family debian-11 `
          --image-project debian-cloud `
          --machine-type n1-standard-2 `
          --boot-disk-type pd-ssd `
          --tags loadbalancer-backend `
          --metadata-from-file startup-script=startup.sh
      
  3. 通过查看虚拟机的串行端口输出来监控其初始化过程:

    gcloud compute instances tail-serial-port-output clouddemo-1
    

    等待大约 5 分钟,直到您看到输出 Instance setup finishedStartup finished,然后按 Ctrl+C。此时,前提条件已安装完毕,虚拟机实例已准备就绪。

设置负载均衡

如需通过互联网提供 ASP.NET 应用,您必须使用 HTTPS 负载均衡器。要将您的虚拟机实例与负载均衡器相关联,请创建一个实例组并将此实例组分配给负载均衡器:

  1. 创建非托管实例组并添加虚拟机实例:

    gcloud compute instance-groups unmanaged create clouddemo-1
    gcloud compute instance-groups unmanaged add-instances clouddemo-1 --instances clouddemo-1
    
  2. 创建一项健康检查,以检查 Web 服务器是否正在运行:

    gcloud compute http-health-checks create clouddemo-health `
        --check-interval 5s `
        --unhealthy-threshold 2 `
        --request-path / `
        --port 5000
    gcloud compute instance-groups set-named-ports clouddemo-1 --named-ports=http:5000
    
  3. 创建一个负载均衡器后端服务,该服务使用您之前创建的 HTTP 健康检查和实例组:

    gcloud compute backend-services create clouddemo-backend `
      --http-health-checks clouddemo-health `
      --port-name http `
      --protocol HTTP `
      --global
    gcloud compute backend-services add-backend clouddemo-backend `
      --instance-group clouddemo-1 `
      --global `
      --instance-group-zone $(gcloud config get-value compute/zone)
    
  4. 为负载均衡器创建前端:

    gcloud compute url-maps create clouddemo-map --default-service clouddemo-backend
    gcloud compute target-http-proxies create clouddemo-proxy --url-map clouddemo-map
    gcloud compute forwarding-rules create clouddemo-frontend --global --target-http-proxy clouddemo-proxy --ports 80
    
  5. 创建防火墙规则,以允许负载均衡器向已使用 loadbalancer-backend 标记添加注解的实例发送 HTTP 请求。

    gcloud compute firewall-rules create loadbalancer-backend `
      --source-ranges "130.211.0.0/22,35.191.0.0/16" `
      --target-tags loadbalancer-backend `
      --allow tcp:80,tcp:5000
    
  6. 查找负载均衡器的 IP 地址:

    gcloud compute forwarding-rules describe clouddemo-frontend --global --format "value(IPAddress)"
    

    记下 IP 地址。以便稍后使用。

部署 ASP.NET 应用

  1. 打开 PowerShell 控制台。

  2. 下载并解压缩,或从 GitHub 克隆示例代码库:

    git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
    
  3. 构建部署包:

    1. 切换到包含示例应用的目录:

      cd dotnet-docs-samples\applications\clouddemo\netcore
      
    2. 构建解决方案:

      dotnet publish -c Release
      
  4. 将部署包复制到虚拟机:

    1. publish 文件夹的内容复制到虚拟机上的主目录:

      gcloud compute scp --recurse CloudDemo.MvcCore\bin\Release\net6.0\publish clouddemo-1:
      
    2. 使用 SSH 连接到虚拟机

    3. 在虚拟机上,创建一个文件夹 /var/www/clouddemo,并将应用文件复制到此文件夹中:

      sudo mkdir -p /var/www/clouddemo
      sudo chown -R www-data:www-data /var/www/clouddemo
      sudo cp -r publish/* /var/www/clouddemo
      
    4. 将应用注册为系统单元:

      cat <<EOF > kestrel-clouddemo.service
      [Unit]
      Description=Cloud Demo ASP.NET app
      
      [Service]
      WorkingDirectory=/var/www/clouddemo
      ExecStart=/usr/bin/dotnet /var/www/clouddemo/CloudDemo.MvcCore.dll
      Restart=always
      Environment=ASPNETCORE_ENVIRONMENT=Production
      Environment=ASPNETCORE_URLS=http://0.0.0.0:5000
      
      [Install]
      WantedBy=multi-user.target
      EOF
      
      sudo mv kestrel-clouddemo.service /etc/systemd/system/
      sudo systemctl daemon-reload
      sudo systemctl start kestrel-clouddemo
      
  5. 在本地计算机上,打开网络浏览器并导航到以下地址:

    http://LOADBALANCER_IP/
    

    LOADBALANCER_IP 替换为您在部署负载均衡器后获得的 IP 地址。

    现在,您会看到演示版应用和标题为此应用正在 Compute Engine 上运行

清理

完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。

删除项目

若要避免产生费用,最简单的方法是删除您为本教程创建的项目。

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

删除各个资源

您需要逐个删除为项目创建的所有资源(例如实例组、健康检查、后端服务、http 代理和转发规则)。只有在删除所有这些资源之后,您才能删除虚拟机实例。

后续步骤