本文档介绍了如何在 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 客户端实例:
Guacamole 客户端连接到 guacd 后端服务,该服务作为与一个或多个 Compute Engine 虚拟机的远程桌面连接的代理。这些脚本还会部署 Cloud SQL 实例来管理 Guacamole 的配置数据。
如需了解详情,请参阅 GKE 和 Cloud SQL 上的 Apache Guacamole。
目标
- 使用 Terraform 部署基础架构。
- 在 Cloud SQL 中创建 Guacamole 数据库。
- 使用 Skaffold 将 Guacamole 部署到 GKE 集群。
- 通过 Guacamole 测试与虚拟机的连接。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Resource Manager, Service Usage, Artifact Registry, and Compute Engine APIs.
-
In the Google Cloud console, activate Cloud Shell.
部署基础架构
在本部分中,您将使用 Terraform 部署以下资源:
- 虚拟私有云
- 防火墙规则
- GKE 集群
- Artifact Registry 制品库
- Cloud SQL for MySQL
- 用于管理 MySQL 数据库的虚拟机
- 服务账号
Terraform 配置还支持在您的项目中使用 IAP。
在 Cloud Shell 中,克隆 GitHub 代码库:
git clone https://github.com/GoogleCloudPlatform/guacamole-on-gcp.git
使用 Terraform 部署所需的基础架构:
cd guacamole-on-gcp/tf-infra unset GOOGLE_CLOUD_QUOTA_PROJECT terraform init -upgrade terraform apply
按照说明输入您的 Google Cloud 项目 ID。
如需批准 Terraform 将资源部署到项目的请求,请输入
yes
。部署所有资源需要几分钟才能完成。
部署 Guacamole 数据库
在本部分中,您将在 Cloud SQL for MySQL 中创建 Guacamole 数据库和表,并使用管理员用户信息填充数据库。
在 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
将
create-schema.sql
和insert-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 建立了与数据库管理虚拟机的控制台会话。
安装 MySQL 客户端工具:
sudo apt-get update sudo apt-get install -y mariadb-client
连接到 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
为数据库用户授予对新创建的数据库的权限:
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
MySQL 命令运行完毕后,退出虚拟机 SSH 会话:
exit
使用 Skaffold 将 Guacamole 部署到 GKE
在本部分中,您使用 Skaffold 将 Guacamole 应用部署到 GKE 集群。Skaffold 可处理构建、推送 Guacamole 映像并将其部署到 GKE 集群的工作流。
在 Cloud Shell 中,使用 Terraform 部署 GKE 配置:
cd tf-k8s terraform init -upgrade terraform apply -parallelism=1
获取 GKE 集群的凭据:
gcloud container clusters get-credentials \ --region $REGION $GKE_CLUSTER
从克隆的 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。
验证是否已预配证书:
kubectl get -w managedcertificates/guacamole-client-cert \ -n guacamole \ -o jsonpath="{.spec.domains[0]} is {.status.domainStatus[0].status}"
预配证书最多可能需要 60 分钟才能完成。
证书预配完毕后,您可以在浏览器中访问您的网址。
查看来自 terraform 输出的网址:
echo $GUACAMOLE_URL
在浏览器窗口中,输入您在上一步获得的网址。
当 IAP 提示您时,请使用您的 Google 凭据登录。
登录后,根据您先前在此过程中运行的
insert-admin-user.sql
脚本,以管理员权限登录 Guacamole。
现在,您可以通过 Guacamole 界面根据用户的电子邮件地址添加其他用户。如需了解详情,请参阅 Guacamole 文档中的管理。这些其他用户还需要通过 Google IAM(具有 IAP-secured Web App User
角色)获得权限。
测试与虚拟机的连接
在部署、配置和成功登录 Guacamole 后,您可以创建 Windows 虚拟机并通过 Guacamole 连接到新创建的虚拟机。
创建虚拟机
在 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 完成初始化,然后再继续下一步。
重置您刚刚创建的虚拟机的 Windows 密码:
gcloud compute reset-windows-password $TEST_VM \ --user=admin \ --zone=$ZONE
添加与虚拟机的新连接
- 在浏览器窗口中,输入从使用 Skaffold 将 Guacamole 部署到 GKE 获得的 Guacamole 实例网址,然后通过 IAP 登录。
- 在 Guacamole 界面中,点击您的用户名,然后点击设置。
- 在连接标签页下,点击新建连接。
- 在名称字段中,输入连接的名称。
- 在位置字段中,输入连接的位置。
- 从协议下拉列表中,选择 RDP。
在网络下的主机名字段中,输入您创建的虚拟机的名称
windows-vm
。您的项目 DNS 会将此主机名解析为实例的内部 IP 地址。
在身份验证部分中,设置以下字段:
- 用户名:
admin
- 密码:重置虚拟机的密码时获得的密码
- 安全模式:
NLA
(网络级身份验证) 忽略服务器证书:选中该复选框
Compute Engine Windows 虚拟机预配了远程桌面服务的自签名证书,因此您需要指示 Guacamole 忽略证书验证问题。
- 用户名:
点击保存。
点击您的用户名,然后选择主页。
点击您刚刚创建的连接以测试连接性。几秒钟后,您应该看到虚拟机实例的桌面。
如需详细了解如何配置 Guacamole,请参阅 Apache Guacamole 手册。
清理
为避免因此过程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- 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
后续步骤
- 查看有关强化集群的安全性的 GKE 指导。
- 查看在应用层对 Secret 加密,以了解如何增强 Secret(例如数据库凭据和 OAuth 凭据)的安全性。
- 查看 IAM Conditions,以了解如何更精细地控制用户对 Guacamole 的访问权限。
- 查看 GitHub 代码库中的自定义身份验证提供方,以详细了解 IAP 集成的工作原理。
- 如需查看更多参考架构、图表和最佳实践,请浏览云架构中心。