本教程提供了一个现成可用的解决方案,该解决方案使用 Google Distributed Cloud on Bare Metal(纯软件)和 Config Sync 在边缘大规模部署 Kubernetes 集群。本教程适用于平台运营者和开发者。在阅读本文档之前,请确保您熟悉以下技术和概念:
- Ansible playbook。
- 边缘部署及其挑战。
- 如何使用 Google Cloud 项目。
- 部署容器化 Web 应用。
gcloud
和kubectl
命令行界面。
在本教程中,您将使用 Compute Engine 虚拟机来模拟在边缘部署的节点,并使用示例销售终端应用作为边缘工作负载。Google Distributed Cloud(纯软件)和 Config Sync 为您的边缘集群提供集中式管理和控制。Config Sync 会从 GitHub 动态拉取新配置,并将这些政策和配置应用到您的集群。
边缘部署架构
零售边缘部署很好地演示了典型裸金属集群部署中使用的架构。
实体零售商店是企业业务部门与消费者之间最近的互动点。商店内的软件系统必须运行其工作负载,接收定时更新,并报告与企业中央管理系统隔离的关键指标。此外,这些软件系统需要设计为将来可以扩展到更多商店位置。虽然任何裸金属集群部署都满足商店软件系统的所有要求,但边缘配置文件实现重要用例:在硬件资源有限的环境中进行部署(例如零售店面)。
下图展示了在零售店中使用边缘配置文件的裸金属集群部署:
上图显示了典型的实体零售店。该商店有一些智能设备,例如读卡器、销售终端机器、摄像头和打印设备。 该商店还有三个实体计算硬件设备(标记为 Node 1
、Node 2
和 Node 3
)。所有这些设备都连接到中央网络交换机。因此,这三个计算设备通过第 2 层网络相互连接。联网的计算设备构成裸金属基础架构。Google Distributed Cloud 软件分别在三个计算设备中运行。这些设备还有自己的磁盘存储,并且配置为在它们之间进行数据复制,以实现高可用性。
该图还显示了裸金属集群部署中的以下关键组件:
Config Sync 组件支持集群状态与源代码库同步。这是一个强烈建议采用的可选插件,它需要单独的安装和配置。如需详细了解如何设置 Config Sync 和不同的术语,请参阅 Config Sync 文档
该商店位置外面的图表顶部显示的根代码库和命名空间代码库代表两个源代码库。
对集群的更改将推送到这些中央源代码库。各种边缘位置的集群部署从源代码库中拉取更新。此行为通过相应箭头表示,这些箭头将图中的两个代码库连接到在设备中运行的集群内的 Config Sync 组件。
作为集群的一部分描述的另一个关键组件是 VM Runtime on GDC。VM Runtime on GDC 允许在集群内运行基于虚拟机的现有工作负载,而无需容器化。VM Runtime on GDC 文档介绍了如何启用它并将虚拟机工作负载部署到集群中。
标记为应用的组件表示由零售店部署到集群中的软件。零售店的自助服务终端中可以看到的销售终端应用就是此类应用的一个例子。
图底部的框表示零售店内的许多设备(例如、平板电脑或摄像头),所有设备都连接到中央网络交换机。商店内的本地网络使得在集群内运行的应用可以访问这些设备。
在下一部分中,您将了解使用 Compute Engine 虚拟机在Google Cloud 中部署此零售店的模拟。此模拟是您在后续教程中试用裸金属集群时使用的内容。
Google Cloud中的模拟边缘部署
下图描绘了本教程中您在Google Cloud 中设置的所有内容。此图与上一部分中的零售店图相关。此部署表示部署销售点应用的模拟边缘位置。该架构还展示了您在本教程中使用的销售终端示例应用工作负载。您可以使用网络浏览器作为自助服务终端,访问集群内的销售终端应用。
上图中的三个 Compute Engine 虚拟机 (VM) 表示典型边缘位置中的物理硬件(或节点)。该硬件将与网络交换机连接以构成裸机基础架构。在我们的 Google Cloud中的模拟环境中,这些虚拟机通过 Google Cloud 项目中的默认虚拟私有云 (VPC) 网络相互连接。
在典型的裸金属集群安装中,您可以配置自己的负载均衡器。但是,在本教程中,您不需要设置外部负载均衡器,而是使用捆绑式 MetalLB 负载均衡器。捆绑式 MetalLB 负载均衡器需要使用节点之间的第 2 层网络连接。因此,可以通过在默认虚拟私有云 (VPC) 网络之上创建 VxLAN 叠加网络来启用 Compute Engine 虚拟机之间的第 2 层连接。
在标有“L2 叠加网络 (VxLAN)”的矩形中,显示了在三个 Compute Engine 虚拟机中运行的软件组件。此 VxLAN 矩形包含集群部署,其中包含集群内的 Kubernetes 命名空间。此 Kubernetes 命名空间内的所有组件构成了部署到集群中的销售终端应用。销售终端应用有三个微服务:API 服务器、库存和付款。所有这些组件一起表示之前的 Edge 部署架构图中的一个“应用”。
您无法直接从虚拟机外部访问集群的捆绑式 MetalLB 负载均衡器。该图显示了配置为在虚拟机内运行的 NGINX 反向代理,用于将传入到 Compute Engine 虚拟机中的流量路由到负载均衡器。这只是本教程使用 Google CloudCompute Engine 虚拟机模拟边缘节点的一种解决方法。在实际边缘位置中,可以通过正确的网络配置实现这一点。
目标
- 使用 Compute Engine 虚拟机模拟在边缘位置运行的裸机基础架构。
- 使用 Google Distributed Cloud 在模拟边缘基础架构中创建集群。
- 连接集群并向 Google Cloud注册该集群。
- 在集群上部署示例销售终端应用工作负载。
- 使用 Google Cloud 控制台验证和监控在边缘位置运行的销售终端应用。
- 使用 Config Sync 更新在集群上运行的销售终端应用。
准备工作
在 Google Cloud 控制台的“项目选择器”页面上,选择或创建 Google Cloud 项目。
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
对 anthos-samples 代码库创建分支并进行克隆
本教程中使用的所有脚本都存储在 anthos-samples 代码库中。/anthos-bm-edge-deployment/acm-config-sink
下的文件夹结构根据 Config Sync 的预期进行组织。请先将此代码库克隆到您自己的 GitHub 账号,然后再继续执行以下步骤。
如果您还没有账号,请在 GitHub 上创建一个。
创建个人访问令牌以在 Config Sync 配置中使用。在尝试同步新更改时,为了进行 GitHub 账号身份验证,集群中的 Config Sync 组件需要执行此操作。
- 仅选择
public_repo
范围。 - 将您创建的访问令牌保存在安全的位置,以供稍后使用。
- 仅选择
为
anthos-samples
代码库创建一个到您自己的 GitHub 账号的分支:- 转到 anthos-samples 代码库。
- 点击页面右上角的 Fork(创建分支)图标。
- 点击要将代码库克隆到的 GitHub 用户账号。 系统会自动将您重定向到包含您的
anthos-samples
代码库分支版本的页面。
在本地环境中打开终端。
通过运行以下命令克隆分支代码库,其中 GITHUB_USERNAME 是您的 GitHub 账号的用户名:
git clone https://github.com/GITHUB_USERNAME/anthos-samples cd anthos-samples/anthos-bm-edge-deployment
设置工作站环境
如需完成本文档中描述的边缘部署,您需要一个可访问互联网的工作站,并安装以下工具:
- Docker
- envsubst 命令行界面工具(通常预安装在 Linux 和其他类似 Unix 的操作系统上)
在本部分中配置的工作站上运行本教程中的所有命令。
在工作站上,在新的 shell 实例中初始化环境变量:
export PROJECT_ID="PROJECT_ID" export REGION="us-central1" export ZONE="us-central1-a" # port on the admin Compute Engine instance you use to set up an nginx proxy # this allows to reach the workloads inside the cluster via the VM IP export PROXY_PORT="8082" # should be a multiple of 3 since N/3 clusters are created with each having 3 nodes export GCE_COUNT="3" # url to the fork of: https://github.com/GoogleCloudPlatform/anthos-samples export ROOT_REPO_URL="https://github.com/GITHUB_USERNAME/anthos-samples" # this is the username used to authenticate to your fork of this repository export SCM_TOKEN_USER="GITHUB_USERNAME" # access token created in the earlier step export SCM_TOKEN_TOKEN="ACCESS_TOKEN"
替换以下值:
- PROJECT_ID:您的 Google Cloud 项目 ID。
- GITHUB_USERNAME:您的 GitHub 用户名。
- ACCESS_TOKEN:您为 GitHub 代码库创建的个人访问令牌。
让其他环境变量保留默认值。后续部分介绍了这些步骤。
在您的工作站上,初始化 Google Cloud CLI:
gcloud config set project "${PROJECT_ID}" gcloud services enable compute.googleapis.com gcloud config set compute/region "${REGION}" gcloud config set compute/zone "${ZONE}"
在您的工作站上,为 Compute Engine 实例创建 Google Cloud 服务账号。此脚本会在
<REPO_ROOT>/anthos-bm-edge-deployment/build-artifacts/consumer-edge-gsa.json
中为新的服务账号创建 JSON 密钥文件。它还将设置 SSH 私钥加密的 Cloud Key Management Service 密钥环和密钥。./scripts/create-primary-gsa.sh
以下示例仅显示了脚本的一部分。如需查看整个脚本,请点击在 GitHub 上查看。
预配 Compute Engine 实例
在本部分中,您会创建将在其中安装 Google Distributed Cloud(纯软件)的 Compute Engine 虚拟机。在继续安装部分之前,您还需要验证与这些虚拟机的连接。
在您的工作站上,创建用于 Compute Engine 实例之间通信的 SSH 密钥:
ssh-keygen -f ./build-artifacts/consumer-edge-machine
使用 Cloud Key Management Service 加密 SSH 私钥:
gcloud kms encrypt \ --key gdc-ssh-key \ --keyring gdc-ce-keyring \ --location global \ --plaintext-file build-artifacts/consumer-edge-machine \ --ciphertext-file build-artifacts/consumer-edge-machine.encrypted
生成环境配置文件
.envrc
并获取该文件。创建后,请检查.envrc
文件,以确保已将环境变量替换为正确的值。envsubst < templates/envrc-template.sh > .envrc source .envrc
下面是一个通过替换
templates/envrc-template.sh
文件中的环境变量生成的.envrc
文件的示例。请注意,突出显示了更新后的行:创建 Compute Engine 实例:
./scripts/cloud/create-cloud-gce-baseline.sh -c "$GCE_COUNT" | \ tee ./build-artifacts/gce-info
使用 Ansible 安装裸金属集群
本指南中使用的脚本会在三个 Compute Engine 实例构成的组中创建集群。创建的集群数量由 GCE_COUNT
环境变量控制。例如,将环境变量 GCE_COUNT
设置为 6
可创建两个集群,每个集群各有 3
个虚拟机实例。默认情况下,GCE_COUNT
环境变量设置为 3
。因此,在本指南中,将创建一个包含 3
个 Compute Engine 实例的集群。虚拟机实例的命名方式为前缀 cnuc-
后跟数字。每个集群的第一个虚拟机实例都充当触发安装的管理员工作站。该集群还会获得与管理员工作站虚拟机相同的名称(例如 cnuc-1
、cnuc-4
、cnuc-7
)。
Ansible 操作手册执行以下操作:
- 使用必要的工具(例如
docker
、bmctl
、gcloud
和nomos
)配置 Compute Engine 实例。 - 在配置的 Compute Engine 实例中安装裸金属集群。
- 创建一个名为
cnuc-1
的独立集群。 - 向 Google Cloud注册
cnuc-1
集群。 - 将 Config Sync 安装到
cnuc-1
集群中。 - 配置 Config Sync 以与位于分支代码库中的
anthos-bm-edge-deployment/acm-config-sink
的集群配置同步。 - 为集群生成
Login token
。
完成以下步骤以设置和开始安装过程:
在您的工作站上,创建用于安装的 Docker 映像。此映像包含安装过程所需的所有工具,例如 Ansible、Python 和 Google Cloud CLI。
gcloud builds submit --config docker-build/cloudbuild.yaml docker-build/
Build 成功运行后,会生成如下输出:
... latest: digest: sha256:99ded20d221a0b2bcd8edf3372c8b1f85d6c1737988b240dd28ea1291f8b151a size: 4498 DONE ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 2238baa2-1f41-440e-a157-c65900b7666b 2022-08-17T19:28:57+00:00 6M53S gs://my_project_cloudbuild/source/1660764535.808019-69238d8c870044f0b4b2bde77a16111d.tgz gcr.io/my_project/consumer-edge-install (+1 more) SUCCESS
从模板生成 Ansible 库存文件:
envsubst < templates/inventory-cloud-example.yaml > inventory/gcp.yaml
运行从之前构建的映像启动 Docker 容器的安装脚本。该脚本在内部使用 Docker 将含有卷装载的容器生成到当前工作目录。成功完成此脚本后,您必须进入所创建的 Docker 容器。您可以从此容器内触发 Ansible 安装。
./install.sh
脚本成功运行后,会生成如下输出:
... Check the values above and if correct, do you want to proceed? (y/N): y Starting the installation Pulling docker install image... ============================== Starting the docker container. You will need to run the following 2 commands (cut-copy-paste) ============================== 1: ./scripts/health-check.sh 2: ansible-playbook all-full-install.yaml -i inventory 3: Type 'exit' to exit the Docker shell after installation ============================== Thank you for using the quick helper script! (you are now inside the Docker shell)
在 Docker 容器中,验证对 Compute Engine 实例的访问权限:
./scripts/health-check.sh
脚本成功运行后,会生成如下输出:
... cnuc-2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} cnuc-3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} cnuc-1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
在 Docker 容器中,运行 Ansible playbook 以在 Compute Engine 实例上安装裸金属集群:
完成后,您将在屏幕上看到集群的
Login Token
。ansible-playbook all-full-install.yaml -i inventory | tee ./build-artifacts/ansible-run.log
安装成功运行后,会生成如下输出:
... TASK [abm-login-token : Display login token] ************************************************************************** ok: [cnuc-1] => { "msg": "eyJhbGciOiJSUzI1NiIsImtpZCI6Imk2X3duZ3BzckQyWmszb09sZHFMN0FoWU9mV1kzOWNGZzMyb0x2WlMyalkifQ.eymljZS1hY2NvdW iZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImVkZ2Etc2EtdG9rZW4tc2R4MmQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2Nvd 4CwanGlof6s-fbu8" } skipping: [cnuc-2] skipping: [cnuc-3] PLAY RECAP *********************************************************************************************************** cnuc-1 : ok=205 changed=156 unreachable=0 failed=0 skipped=48 rescued=0 ignored=12 cnuc-2 : ok=128 changed=99 unreachable=0 failed=0 skipped=108 rescued=0 ignored=2 cnuc-3 : ok=128 changed=99 unreachable=0 failed=0 skipped=108 rescued=0 ignored=2
在 Google Cloud 控制台中登录集群
Ansible playbook 运行完成后,系统会在 Compute Engine 虚拟机中安装一个独立集群。此集群也可以通过 Connect Agent 注册到Google Cloud。但是,如需查看此集群的详细信息,您必须从 Google Cloud 控制台登录此集群。
如需登录集群,请完成以下步骤:
从上一部分中的 Ansible playbook 的输出中复制令牌。
在 Google Cloud 控制台中,前往 Kubernetes 集群页面,然后使用复制的令牌登录
cnuc-1
集群。- 在集群列表中,点击
cnuc-1
集群旁边的 操作,然后点击登录。 - 选择令牌,然后粘贴复制的令牌。
- 点击 Login(登录)。
- 在集群列表中,点击
- 在 Google Cloud 控制台中,转到功能部分下的配置页面。
在软件包标签页上,检查集群表中的同步状态列。验证状态是否为已同步。 状态已同步表示 Config Sync 已成功将 GitHub 配置与已部署的集群 cnuc-1
同步。
为外部流量配置代理
前面步骤中安装的集群使用名为 MetalLB 的捆绑式负载均衡器。此负载均衡器服务只能通过虚拟私有云 (VPC) IP 地址访问。如需将传入的流量通过其外部 IP 路由到捆绑式负载均衡器,请在管理员主机 (cnuc-1
) 中设置反向代理服务。借助此反向代理服务,您可以通过管理员主机 (cnuc-1
) 的外部 IP 访问销售终端应用的 API 服务器。
前面步骤中的安装脚本在管理员主机中安装了 NGINX 以及示例配置文件。更新此文件以使用负载均衡器服务的 IP 地址并重启 NGINX。
在您的工作站上,使用 SSH 登录管理员工作站:
ssh -F ./build-artifacts/ssh-config abm-admin@cnuc-1
从管理员工作站内,设置 NGINX 反向代理,以将流量路由到 API 服务器负载均衡器服务。获取负载均衡器类型 Kubernetes 服务的 IP 地址:
ABM_INTERNAL_IP=$(kubectl get services api-server-lb -n pos | awk '{print $4}' | tail -n 1)
使用提取的 IP 地址更新模板配置文件:
sudo sh -c "sed 's/<K8_LB_IP>/${ABM_INTERNAL_IP}/g' \ /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf"
重启 NGINX 以确保应用新配置:
sudo systemctl restart nginx
检查并验证 NGINX 服务器的状态是否报告“active (running)”(活动 [正在运行]):
sudo systemctl status nginx
NGINX 成功运行时,它会生成类似于如下示例的输出:
● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2021-09-17 02:41:01 UTC; 2s ago Docs: man:nginx(8) Process: 92571 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 92572 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 92573 (nginx) Tasks: 17 (limit: 72331) Memory: 13.2M CGroup: /system.slice/nginx.service ├─92573 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; ├─92574 nginx: worker process ├─92575 nginx: worker process ├─92577 nginx: .... ... ...
从 SSH 会话退出到管理员工作站:
exit
从 shell 会话退出到 Docker 容器中。退出管理员实例后,您仍然位于用于安装的 Docker 容器中:
exit
访问销售终端应用
使用外部代理设置,您可以访问在集群内运行的应用。如需访问示例销售点应用,请完成以下步骤。
在您的工作站上,获取管理员 Compute Engine 实例的外部 IP 地址,并访问销售终端应用的界面:
EXTERNAL_IP=$(gcloud compute instances list \ --project ${PROJECT_ID} \ --filter="name:cnuc-1" \ --format="get(networkInterfaces[0].accessConfigs[0].natIP)") echo "Point the browser to: ${EXTERNAL_IP}:${PROXY_PORT}"
脚本成功运行后,会生成如下输出:
Point the browser to: 34.134.194.84:8082
打开网络浏览器并导航至在上一个命令输出中显示的 IP 地址。您可以访问并测试销售终端应用示例,如以下示例屏幕截图所示:
使用 Config Sync 更新 API 服务器
通过更新根代码库中的配置文件,可以将示例应用升级到较新版本。Config Sync 会检测更新并自动更改集群。在此示例中,根代码库是您在本指南开头克隆的 anthos-samples
代码库。如需查看示例销售终端应用如何升级到较新版本,请完成以下步骤。
在您的工作站上,更新
image
字段以将 API 服务器版本从v1
更改为v2
。部署的 YAML 配置位于anthos-bm-edge-deployment/acm-config-sink/namespaces/pos/api-server.yaml
处的文件中。添加、提交更改并将更改推送到分支代码库:
git add acm-config-sink/namespaces/pos/api-server.yaml git commit -m "chore: updated api-server version to v2" git push
在 Google Cloud 控制台中,前往 Config Sync 页面以查看配置规范状态。验证状态是否为已同步。
在 Google Cloud 控制台中,转到 Kubernetes Engine 工作负载页面,以验证 Deployment 是否已更新。
当部署的状态为正常时,请将浏览器指向上一部分中的 IP 地址,以查看销售终端应用。请注意,标题中的版本显示“V2”,这表示您的应用更改已部署,如以下示例屏幕截图所示:
您可能必须强制刷新浏览器标签页才能看到更改。
清理
为避免产生不必要的 Google Cloud 费用,请在使用本指南后删除本指南使用的资源。您可以手动删除这些资源,也可以删除 Google Cloud 项目,此操作也会清除所有资源。此外,您可能还需要清理在本地工作站中所做的更改:
本地工作站
必须更新以下文件以清除安装脚本所做的更改。
- 移除添加到
/etc/hosts
文件的 Compute Engine 虚拟机 IP 地址。 - 移除
~/.ssh/config
文件中cnuc-*
的 SSH 配置。 - 从
~/.ssh/known_hosts
文件中移除 Compute Engine 虚拟机指纹。
删除项目
如果您为此过程创建了一个专用项目,请从 Google Cloud 控制台中删除该 Google Cloud 项目。
手动
如果您在此过程中使用了现有项目,请执行以下操作:
- 取消注册名称前缀为
cnuc-
的所有 Kubernetes 集群。 - 删除名称前缀为
cnuc-
的所有 Compute Engine 虚拟机。 - 删除名称前缀为
abm-edge-boot
的 Cloud Storage 存储桶。 - 删除防火墙规则
allow-pod-ingress
和allow-pod-egress
。 - 删除 Secret Manager Secret
install-pub-key
。
后续步骤
您可以通过添加其他边缘位置来扩展本指南。将 GCE_COUNT
环境变量设置为 6
并重新运行前面部分中相同的步骤,会创建三个新的 Compute Engine 实例(cnuc-4
、cnuc-5
、cnuc-6
)和新的独立集群(名为 cnuc-4
)。
您还可以尝试更新分支代码库中的集群配置,选择性地使用 ClusterSelectors 将销售终端应用的不同版本应用于两个集群(cnuc-1
和 cnuc-4
)。
如需详细了解本指南中的各个步骤以及所涉及的脚本,请参阅 anthos-samples 代码库。