在 GKE 和 Cloud SQL 上部署 Apache Guacamole

Last reviewed 2023-11-15 UTC

本文档介绍了如何在 GKE 和 Cloud SQL 上部署 Apache Guacamole

以下说明适用于希望在 GKE 和 Cloud SQL 上托管 Guacamole 的服务器管理员和工程师。本文档假定您熟悉如何将工作负载部署到 Kubernetes 和 Cloud SQL for MySQL。我们建议您同时熟悉 Identity and Access Management 和 Google Compute Engine。

架构

下图展示了如何使用 IAP 配置 Google Cloud 负载均衡器,以保护在 GKE 中运行的 Guacamole 客户端实例:

使用 IAP 配置的 Google Cloud 负载均衡器的架构。

Guacamole 客户端连接到 guacd 后端服务,该服务作为与一个或多个 Compute Engine 虚拟机的远程桌面连接的代理。这些脚本还会部署 Cloud SQL 实例来管理 Guacamole 的配置数据。

如需了解详情,请参阅 GKE 和 Cloud SQL 上的 Apache Guacamole

目标

  • 使用 Terraform 部署基础架构。
  • 在 Cloud SQL 中创建 Guacamole 数据库。
  • 使用 Skaffold 将 Guacamole 部署到 GKE 集群。
  • 通过 Guacamole 测试与虚拟机的连接。

费用

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

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

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

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 Resource Manager, Service Usage, Artifact Registry, and Compute Engine API。

    启用 API

  4. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

部署基础架构

在本部分中,您将使用 Terraform 部署以下资源:

  • 虚拟私有云
  • 防火墙规则
  • GKE 集群
  • Artifact Registry 制品库
  • Cloud SQL for MySQL
  • 用于管理 MySQL 数据库的虚拟机
  • 服务账号

Terraform 配置还支持在您的项目中使用 IAP。

  1. 在 Cloud Shell 中,克隆 GitHub 代码库:

    git clone https://github.com/GoogleCloudPlatform/guacamole-on-gcp.git
    
  2. 使用 Terraform 部署所需的基础架构:

    cd guacamole-on-gcp/tf-infra
    unset GOOGLE_CLOUD_QUOTA_PROJECT
    terraform init -upgrade
    terraform apply
    
  3. 按照说明输入您的 Google Cloud 项目 ID。

  4. 如需批准 Terraform 将资源部署到您的项目的请求,请输入 yes

    部署所有资源需要几分钟时间才能完成。

部署 Guacamole 数据库

在本部分中,您将在 Cloud SQL for MySQL 中创建 Guacamole 数据库和表,并使用管理员用户信息填充数据库。

  1. 在 Cloud Shell 中,设置环境变量并找到数据库 root 密码:

    cd ..
    source bin/read-tf-output.sh
    

    记下数据库 root 密码;您需要在后续步骤中用到它。

    脚本会从 Terraform 运行中读取输出变量并设置以下环境变量,这些环境变量用于整个过程:

    CLOUD_SQL_INSTANCE
    ZONE
    REGION
    DB_MGMT_VM
    PROJECT_ID
    GKE_CLUSTER
    GUACAMOLE_URL
    SUBNET
    
  2. create-schema.sqlinsert-admin-user.sql 脚本文件复制到数据库管理虚拟机,然后连接到虚拟机:

    gcloud compute scp \
        --tunnel-through-iap \
        --zone=$ZONE \
        create-schema.sql \
        insert-admin-user.sql \
        $DB_MGMT_VM:
    
    gcloud compute ssh $DB_MGMT_VM \
        --zone=$ZONE \
        --tunnel-through-iap
    

    现在,已通过 Cloud Shell 建立与数据库管理虚拟机的控制台会话。

  3. 安装 MySQL 客户端工具:

    sudo apt-get update
    sudo apt-get install -y mariadb-client
    
  4. 连接到 Cloud SQL 并创建数据库。当系统提示您输入密码时,请使用您在本部分前面记下的 root 密码。

    export CLOUD_SQL_PRIVATE_IP=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/cloud_sql_ip -H "Metadata-Flavor: Google")
    mysql -h $CLOUD_SQL_PRIVATE_IP -u root -p
    
  5. 为数据库用户授予对新创建的数据库的权限:

    CREATE DATABASE guacamole;
    USE guacamole;
    GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole.* TO 'guac-db-user';
    FLUSH PRIVILEGES;
    SOURCE create-schema.sql;
    SOURCE insert-admin-user.sql;
    quit
    
  6. MySQL 命令运行完毕后,退出虚拟机 SSH 会话:

    exit
    

使用 Skaffold 将 Guacamole 部署到 GKE

在本部分中,您将使用 Skaffold 将 Guacamole 应用部署到 GKE 集群。Skaffold 可处理构建、推送 Guacamole 映像并将其部署到 GKE 集群的工作流。

  1. 在 Cloud Shell 中,使用 terraform 部署 GKE 配置:

    cd tf-k8s
    terraform init -upgrade
    terraform apply -parallelism=1
    
  2. 获取 GKE 集群的凭据:

    gcloud container clusters get-credentials \
        --region $REGION $GKE_CLUSTER
    
  3. 从克隆的 git 代码库的根目录运行 Skaffold:

    cd ..
    skaffold --default-repo $REGION-docker.pkg.dev/$PROJECT_ID/guac-repo run
    

    Skaffold 工具会通过 Google Cloud Build 为 Guacamole 构建容器映像(命令行包含一个标志,用于指定要将映像推送到哪个代码库)。该工具还会运行 kustomize 步骤,以根据 Terraform 运行的输出生成 Kubernetes ConfigMap 和 Secret。

  4. 验证是否已预配证书:

    kubectl get -w managedcertificates/guacamole-client-cert \
    -n guacamole \
    -o jsonpath="{.spec.domains[0]} is {.status.domainStatus[0].status}"
    

    预配证书最多可能需要 60 分钟才能完成。

  5. 预配证书后,您可以在浏览器中访问网址。

    1. 查看来自 terraform 输出的网址:

      echo $GUACAMOLE_URL
      
    2. 在浏览器窗口中,输入您在上一步中获得的网址。

    3. 当 IAP 提示您时,使用您的 Google 凭据登录。

      登录后,根据您先前在此过程中运行的 insert-admin-user.sql 脚本,以管理员权限登录 Guacamole。

现在,您可以通过 Guacamole 界面根据电子邮件地址添加其他用户。如需了解详情,请参阅 Guacamole 文档中的管理。这些其他用户还需要通过 Google IAM(具有 IAP-secured Web App User 角色)获得权限。

测试与虚拟机的连接

在部署、配置和成功登录 Guacamole 后,您可以创建 Windows 虚拟机并通过 Guacamole 连接到新创建的虚拟机。

创建虚拟机

  1. 在 Cloud Shell 中,创建 Windows 虚拟机以测试与以下虚拟机的连接:

    export TEST_VM=windows-vm
    gcloud compute instances create $TEST_VM \
        --project=$PROJECT_ID \
        --zone=$ZONE \
        --machine-type=n1-standard-1 \
        --subnet=$SUBNET \
        --no-address \
        --image-family=windows-2019 \
        --image-project=windows-cloud \
        --boot-disk-size=50GB \
        --boot-disk-type=pd-standard \
        —-shielded-secure-boot
    

    运行该命令后,您可能需要等待几分钟,以便 Windows 完成初始化,然后再继续执行下一步。

  2. 重置您刚刚创建的虚拟机的 Windows 密码:

    gcloud compute reset-windows-password $TEST_VM \
        --user=admin \
        --zone=$ZONE
    

添加与虚拟机的新连接

  1. 在浏览器窗口中,输入从使用 Skaffold 将 Guacamole 部署到 GKE 获得的 Guacamole 实例网址,然后通过 IAP 登录。
  2. 在 Guacamole 界面中,点击您的用户名,然后点击设置
  3. 连接标签页下,点击新建连接
    1. 名称字段中,输入连接的名称。
    2. 位置字段中,输入连接的位置。
    3. 协议下拉列表中,选择 RDP
  4. 网络下的主机名字段中,输入您创建的虚拟机的名称 windows-vm

    您的项目 DNS 会将此主机名解析为实例的内部 IP 地址。

  5. 身份验证部分中,设置以下字段:

    1. 用户名admin
    2. 密码:重置虚拟机的密码时获得的密码
    3. 安全模式NLA(网络级身份验证)
    4. 忽略服务器证书:选中该复选框

      Compute Engine Windows 虚拟机预配了远程桌面服务的自签名证书,因此您需要指示 Guacamole 忽略证书验证问题。

  6. 点击保存

  7. 点击您的用户名,然后选择主页

  8. 点击您刚刚创建的连接以测试连接性。几秒钟后,您应该会看到虚拟机实例的桌面。

如需详细了解如何配置 Guacamole,请参阅 Apache Guacamole 手册

清理

为避免因此过程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除新资源

作为删除整个项目的替代方法,您可以删除在此过程中创建的各个资源。请注意,您无法从项目中移除 OAuth 权限请求页面配置,只能进行修改。

  • 在 Cloud Shell 中,使用 terraform 删除资源:

    cd ~/guacamole-on-gcp/tf-k8s
    terraform destroy
    
    cd ~/guacamole-on-gcp/tf-infra
    terraform destroy
    
    gcloud compute instances delete $TEST_VM –-zone=$ZONE
    

后续步骤