在 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  3. Enable the Resource Manager, Service Usage, Artifact Registry, and Compute Engine APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除新资源

作为删除整个项目的替代方法,您还可以删除在此过程中创建的各个资源。请注意,您无法从项目中移除 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
    

后续步骤