本教學課程介紹可立即使用的解決方案,該解決方案會在裸機上使用 Google Distributed Cloud (僅限軟體),並透過 Config Sync 大規模部署邊緣 Kubernetes 叢集。本教學課程適用於平台營運人員和開發人員。閱讀本文前,請務必熟悉下列技術和概念:
- Ansible 劇本。
- 邊緣部署作業及其挑戰。
- 如何使用 Google Cloud 專案。
- 部署容器化網路應用程式。
gcloud
和kubectl
指令列介面。
在本教學課程中,您會使用 Compute Engine 虛擬機器 (VM) 模擬部署在邊緣的節點,並使用銷售點應用程式範例做為邊緣工作負載。Google Distributed Cloud 軟體 (僅限軟體) 和 Config Sync 可為邊緣叢集提供集中式管理和控制功能。Config Sync 會從 GitHub 動態提取新設定,並將這些政策和設定套用至叢集。
邊緣部署架構
零售邊緣部署作業是說明典型裸機叢集部署作業所用架構的好方法。
實體零售商店是企業業務部門與消費者之間最接近的互動點。店內軟體系統必須執行工作負載、及時接收更新,並回報重要指標,且不得與企業的中央管理系統連線。此外,這些軟體系統的設計必須能擴充,以便日後在更多商店地點使用。雖然任何裸機叢集部署作業都能滿足商店軟體系統的所有需求,但邊緣設定檔可支援一項重要用途:在硬體資源有限的環境中部署,例如零售商店面。
下圖顯示在零售商店中使用 Edge 設定檔的裸機叢集部署作業:
上圖顯示典型的實體零售商店。店內有智慧型裝置,例如讀卡機、銷售點終端機、攝影機和印表機。商店也有三部實體運算硬體裝置 (標示為 Node 1
、Node 2
和 Node 3
)。所有這些裝置都連線到中央網路交換器。因此,這三部運算裝置會透過第 2 層網路彼此連線。透過網路連線的運算裝置會構成裸機基礎架構。Google Distributed Cloud 軟體會在三個運算裝置中執行。這些裝置也有自己的磁碟儲存空間,並設定為在彼此之間複製資料,以確保高可用性。
此外,圖中也顯示裸機叢集部署作業的下列重要元件:
Config Sync 元件可讓叢集狀態與來源存放區保持同步。強烈建議您安裝這個選用外掛程式,但必須另外安裝及設定。如要進一步瞭解如何設定 Config Sync 和不同的命名方式,請參閱 Config Sync 說明文件
商店位置外部圖表頂端顯示的根存放區和命名空間存放區,代表兩個來源存放區。
叢集的變更會推送至這些中央來源存放區。 各個邊緣位置的叢集部署作業會從來源存放區提取更新。圖中連接兩個存放區的箭頭,代表這種行為,並指向裝置中執行的叢集內 Config Sync 元件。
叢集的一部分是 GDC 上的 VM 執行階段,這是另一個重要元件。透過 GDC 上的 VM Runtime,您可以在叢集內執行現有的 VM 型工作負載,不必進行容器化。請參閱 GDC 上的 VM Runtime 說明文件,瞭解如何啟用這項功能,並將 VM 工作負載部署到叢集。
標示為「應用程式」的元件表示零售商店部署到叢集中的軟體。零售商店資訊站的銷售點應用程式就是這類應用程式的例子。
圖表底部的方塊代表零售商店內的許多裝置 (例如資訊亭、平板電腦或攝影機),這些裝置都連線至中央網路交換器。商店內的區域網路可讓叢集內執行的應用程式連線至這些裝置。
下一節將說明如何使用 Compute Engine VMGoogle Cloud 模擬部署這間零售商店。在後續教學課程中,您會使用這項模擬功能,實驗裸機叢集。
在 Google Cloud中模擬邊緣部署作業
下圖說明您在本教學課程中Google Cloud 設定的所有項目。這個圖表與前一節的零售商店圖表相關。這項部署作業代表模擬的邊緣位置,銷售點應用程式會部署在該位置。架構也顯示您在本教學課程中使用的銷售點範例應用程式工作負載。您可以使用網路瀏覽器做為資訊亭,存取叢集內的銷售點應用程式。
上圖中的三部 Compute Engine 虛擬機器 (VM) 代表一般邊緣位置的實體硬體 (或節點)。這類硬體會透過網路交換器連線,組成裸機基礎架構。在 Google Cloud的模擬環境中,這些 VM 會透過 Google Cloud 專案中的預設虛擬私有雲 (VPC) 網路彼此連線。
在典型的 Bare Metal 叢集安裝作業中,您可以設定自己的負載平衡器。不過,在本教學課程中,您不會設定外部負載平衡器。而是使用套裝組合的 MetalLB 負載平衡器。套裝組合 MetalLB 負載平衡器需要節點之間的第 2 層網路連線。因此,在預設的虛擬私有雲 (VPC) 網路上建立 VxLAN 疊加網路,即可啟用 Compute Engine VM 之間的第 2 層連線。
在標示為「L2 overlay network (VxLAN)」的矩形內,顯示在三個 Compute Engine VM 中執行的軟體元件。這個 VxLAN 矩形包含叢集部署作業,其中包含叢集內的 Kubernetes 命名空間。這個 Kubernetes 命名空間中的所有元件,都會構成部署到叢集中的銷售點應用程式。銷售點應用程式有三個微服務:API 伺服器、庫存和付款。所有這些元件共同代表一個「應用程式」,如先前的 Edge 推出架構圖所示。
叢集的隨附 MetalLB 負載平衡器無法從 VM 外部直接連線。下圖顯示如何設定在 VM 內執行的 NGINX 反向 Proxy,將傳入 Compute Engine VM 的流量轉送至負載平衡器。這只是本教學課程的權宜做法,因為邊緣節點是使用 Google CloudCompute Engine VM 模擬。在實際的邊緣位置,這項作業可透過適當的網路設定完成。
目標
- 使用 Compute Engine VM 模擬在邊緣位置執行的裸機基礎架構。
- 使用 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 設定。叢集中的 Config Sync 元件嘗試同步處理新變更時,必須使用這個權杖向 GitHub 帳戶進行驗證。
- 僅選取
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 的作業系統上)
在本節設定的工作站上,執行本教學課程中的所有指令。
在工作站上,於新的殼層執行個體中初始化環境變數:
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 金鑰檔案。並設定 Cloud Key Management Service 金鑰環和金鑰,用於加密 SSH 私密金鑰。./scripts/create-primary-gsa.sh
以下範例僅為部分指令碼。如要查看完整指令碼,請按一下「在 GitHub 上查看」。
佈建 Compute Engine 執行個體
在本節中,您將建立 Compute Engine VM,並在其中安裝 Google Distributed Cloud 軟體。您也必須先驗證與這些 VM 的連線,再繼續前往安裝章節。
在工作站上建立 SSH 金鑰,用於 Compute Engine 執行個體之間的通訊:
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 安裝 Bare Metal 叢集
本指南使用的指令碼會以三組 Compute Engine 執行個體為一組,建立叢集。建立的叢集數量由 GCE_COUNT
環境變數控管。舉例來說,您可以將環境變數 GCE_COUNT
設為 6
,建立兩個叢集,每個叢集有 3
個 VM 執行個體。根據預設,GCE_COUNT
環境變數會設為 3
。因此,本指南將建立一個叢集,其中包含 3
個 Compute Engine 執行個體。VM 執行個體的名稱會以 cnuc-
為前置字串,後面加上數字。每個叢集的第一個 VM 執行個體會做為管理員工作站,從中觸發安裝作業。叢集也會獲得與管理工作站 VM 相同的名稱 (例如 cnuc-1
、cnuc-4
、cnuc-7
)。
Ansible 劇本會執行下列作業:
- 使用
docker
、bmctl
、gcloud
和nomos
等必要工具設定 Compute Engine 執行個體。 - 在設定的 Compute Engine 執行個體中安裝 Bare Metal 叢集。
- 建立名為
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/
建構作業成功執行後,會產生類似下列的輸出內容:
... 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 劇本,在 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 劇本執行完畢後,Compute Engine VM 內就會安裝獨立叢集。這個叢集也已使用 Connect 代理程式向Google Cloud註冊。不過,如要查看這個叢集的詳細資料,您必須從 Google Cloud 控制台登入叢集。
如要登入叢集,請完成下列步驟:
從上一節 Ansible 劇本的輸出內容複製符記。
在 Google Cloud 控制台中,前往「Kubernetes clusters」(Kubernetes 叢集) 頁面,然後使用複製的權杖登入
cnuc-1
叢集。前往 Kubernetes 的「clusters」(叢集) 頁面
- 在叢集清單中,按一下
cnuc-1
叢集旁的 「Actions」(動作),然後按一下「Log in」(登入)。 - 選取「權杖」,然後貼上複製的權杖。
- 按一下 [Login] (登入)。
- 在叢集清單中,按一下
- 前往 Google Cloud 控制台的「Features」(功能) 區段,然後點選「Config」(設定) 頁面。
在「套件」分頁中,查看叢集表格的「同步狀態」欄。
確認狀態為「已同步」。「已同步」狀態表示 Config Sync 已成功將 GitHub 設定與已部署的叢集 cnuc-1
同步。
設定外部流量的 Proxy
先前步驟中安裝的叢集會使用名為 MetalLB 的套裝組合負載平衡器。這項負載平衡器服務只能透過虛擬私有雲 (VPC) IP 位址存取。如要將透過外部 IP 傳入的流量,轉送至隨附的負載平衡器,請在管理主機 (cnuc-1
) 中設定反向 Proxy 服務。透過這項反向 Proxy 服務,您可以使用管理主機 (cnuc-1
) 的外部 IP,連線至銷售點應用程式的 API 伺服器。
先前步驟中的安裝指令碼已在管理主機中安裝 NGINX,以及範例設定檔。更新這個檔案,以使用負載平衡器服務的 IP 位址,然後重新啟動 NGINX。
在工作站上,使用 SSH 登入管理員工作站:
ssh -F ./build-artifacts/ssh-config abm-admin@cnuc-1
在管理工作站內,設定 NGINX 反向 Proxy,將流量路由至 API 伺服器負載平衡器服務。取得 Load balancer 類型的 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
從殼層工作階段退出 Docker 容器。離開管理員執行個體後,您仍處於用於安裝的 Docker 容器內:
exit
存取銷售點應用程式
設定外部 Proxy 後,您就能存取叢集內執行的應用程式。如要存取銷售點應用程式範例,請完成下列步驟。
在工作站上,取得管理員 Compute Engine 執行個體的外部 IP 位址,並存取銷售點應用程式的 UI:
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」頁面,查看「Config spec status」。確認狀態為「已同步」。
前往 Google Cloud 控制台的「Kubernetes Engine Workloads」(Kubernetes Engine 工作負載) 頁面,確認 Deployment 已更新。
當「部署」狀態為「OK」時,請將瀏覽器指向上一節中的 IP 位址,即可查看銷售點應用程式。請注意,標題中的版本顯示「V2」,表示應用程式變更已部署,如下方螢幕截圖範例所示:
您可能需要強制重新整理瀏覽器分頁,才能看到變更。
清除所用資源
為避免產生不必要的 Google Cloud 費用,請在完成本指南的內容後,刪除使用的資源。您可以手動刪除這些資源,也可以刪除 Google Cloud 專案,這樣一來,所有資源都會一併刪除。此外,您可能還需要清除本機工作站所做的變更:
本機工作站
您必須更新下列檔案,才能清除安裝指令碼所做的變更。
- 從
/etc/hosts
檔案中移除新增的 Compute Engine VM IP 位址。 - 在
~/.ssh/config
檔案中移除cnuc-*
的 SSH 設定。 - 從
~/.ssh/known_hosts
檔案中移除 Compute Engine VM 指紋。
刪除專案
如果您是特地為這個程序建立專案,請從 Google Cloud 控制台刪除 Google Cloud 專案。
手動
如果您使用現有專案執行這項程序,請按照下列步驟操作:
- 取消註冊名稱前置字元為
cnuc-
的所有 Kubernetes 叢集。 - 刪除名稱前置字串為
cnuc-
的所有 Compute Engine VM。 - 刪除名稱前置字元為
abm-edge-boot
的 Cloud Storage bucket。 - 刪除防火牆規則
allow-pod-ingress
和allow-pod-egress
。 - 刪除 Secret Manager 密鑰
install-pub-key
。
後續步驟
您可以新增另一個邊緣位置,擴充本指南的內容。將 GCE_COUNT
環境變數設為 6
,然後重新執行前幾節的相同步驟,即可建立三個新的 Compute Engine 執行個體 (cnuc-4
、cnuc-5
、cnuc-6
) 和一個名為 cnuc-4
的新獨立叢集。
您也可以嘗試更新分叉存放區中的叢集設定,使用 ClusterSelectors,將不同版本的銷售點應用程式選擇性套用至兩個叢集 cnuc-1
和 cnuc-4
。
如要瞭解本指南中各個步驟的詳細資訊和相關指令碼,請參閱 anthos-samples 存放區。