如果您完全不熟悉容器化工作負載,這篇教學課程非常適合您。本課程會逐步說明如何從原始碼設定簡單的應用程式,到在 GKE 上執行的容器,藉此介紹容器和容器自動化調度管理。
本教學課程不要求學員具備容器或 Kubernetes 的使用經驗。不過,如果您想在開始本教學課程前,先概略瞭解 Kubernetes 的核心術語,請參閱「開始瞭解 Kubernetes」(如果您想透過漫畫瞭解 Kubernetes,請參閱 Kubernetes 漫畫)。如需更詳細的資源,請參閱本教學課程結尾的「後續步驟」一節。
如果您已熟悉容器和 Kubernetes,可以略過本教學課程,直接瞭解 GKE。
目標
- 探索簡單的多服務「Hello World」應用程式。
- 從來源執行應用程式。
- 將應用程式容器化。
- 建立 Kubernetes 叢集。
- 將容器部署至叢集。
事前準備
請按照下列步驟啟用 Kubernetes Engine API:- 前往 Google Cloud 控制台的 Kubernetes Engine 頁面。
- 建立或選取專案。
- 等待 API 和相關服務完成啟用。 這可能需要幾分鐘的時間。
準備 Cloud Shell
本教學課程使用 Cloud Shell,這會佈建執行 Debian 型 Linux 作業系統的 g1-small Compute Engine 虛擬機器 (VM)。
使用 Cloud Shell 的優點如下:
- 已完整設定 Python 3 開發環境 (包括
virtualenv)。 - 本教學課程使用的
gcloud、docker、git和kubectl指令列工具已安裝完畢。 您可以選擇內建的文字編輯器:
Cloud Shell 編輯器:點選 Cloud Shell 視窗頂端的「開啟編輯器」即可存取。
Emacs、Vim 或 Nano,可透過 Cloud Shell 的指令列存取。
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
下載程式碼範例
下載
helloserver原始碼:git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples切換至程式碼範例目錄:
cd anthos-service-mesh-samples/docs/helloserver
探索多服務應用程式
範例應用程式是以 Python 編寫。其中包含下列元件,會使用 REST 進行通訊:
server:基本伺服器,具有一個GET端點/,可將「hello world」列印到終端機視窗。loadgen:將流量傳送至server的指令碼,每秒要求數 (RPS) 可設定。
從來源執行應用程式
如要熟悉範例應用程式,請在 Cloud Shell 中執行:
從
sample-apps/helloserver目錄執行server:python3 server/server.pyserver啟動時會顯示以下內容:INFO:root:Starting server...
開啟另一個終端機視窗,以便將要求傳送至
server。如要在 Cloud Shell 中執行這項操作,請點按「開啟新分頁」,開啟另一個工作階段。在新終端機視窗中,將要求傳送至
server:curl http://localhost:8080server的輸出內容如下:Hello World!
在同一個分頁中,切換至包含
loadgen指令碼的目錄:cd anthos-service-mesh-samples/docs/helloserver/loadgen
建立下列的環境變數:
export SERVER_ADDR=http://localhost:8080 export REQUESTS_PER_SECOND=5開始時間
virtualenv:virtualenv --python python3 env啟用虛擬環境:
source env/bin/activate安裝
loadgen的必要條件:pip3 install -r requirements.txt執行
loadgen應用程式,為server產生流量:python3 loadgen.py啟動時,
loadgen的輸出內容大致如下:Starting loadgen: 2024-10-11 09:49:51.798028 5 request(s) complete to http://localhost:8080
現在,請開啟執行
server的終端機視窗。您應該會看到類似下方的訊息:127.0.0.1 - - [11/Oct/2024 09:51:28] "GET / HTTP/1.1" 200 - INFO:root:GET request, Path: / Headers: Host: localhost:8080 User-Agent: python-requests/2.32.3 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive
從網路的角度來看,整個應用程式現在都在同一個主機上執行,因此您可以使用
localhost將要求傳送至server。如要停止
loadgen和server,請在每個終端機視窗中按下Ctrl-c。在
loadgen終端機視窗中,停用虛擬環境:deactivate
將應用程式容器化
如要在 GKE 上執行應用程式,您必須將範例應用程式的兩個元件封裝至容器。容器是套件,內含應用程式在任何環境中執行的所有必要元素。本教學課程使用 Docker 將應用程式容器化。
如要使用 Docker 將應用程式容器化,您需要 Dockerfile。Dockerfile 是文字檔案,定義將應用程式原始碼及其依附元件組合成容器映像檔所需的指令。建構映像檔後,請將其上傳至 Container Registry,例如 Artifact Registry。
本教學課程的原始碼包含 server 和 loadgen 的 Dockerfile,其中包含建構映像檔所需的所有指令。以下是 server 的 Dockerfile:
在這個檔案中,您可以看到以下內容:
FROM python:3-slim as base指令會指示 Docker 使用最新的 Python 3 映像檔做為基礎映像檔。COPY . .指令會將目前工作目錄 (在本例中為server.py) 中的來源檔案,複製到容器的檔案系統。ENTRYPOINT會定義用於執行容器的指令。在本範例中,指令與您用來從原始碼執行server.py的指令類似。EXPOSE指令會指定server監聽通訊埠8080。這項指令不會公開任何通訊埠,但會做為說明文件,指出您在執行容器時需要開啟通訊埠8080。
準備將應用程式容器化
在將應用程式容器化之前,您需要為要使用的工具和服務進行一些設定:
設定 Google Cloud CLI 的預設 Google Cloud 專案。
gcloud config set project PROJECT_ID
設定 Google Cloud CLI 的預設區域。
gcloud config set compute/region us-central1
建立存放區
如要在 Artifact Registry 中建立 Docker 容器映像檔的新存放區,請按照下列步驟操作:
確認Google Cloud 專案已啟用 Artifact Registry 服務。
gcloud services enable artifactregistry.googleapis.com建立 Artifact Registry 存放區:
gcloud artifacts repositories create container-intro --repository-format=docker \ --location=us-central1 \ --description="My new Docker repository"使用 Google Cloud CLI 設定 Docker 對 Artifact Registry 的驗證機制:
gcloud auth configure-docker us-central1-docker.pkg.dev
將 server 容器化
現在可以將應用程式容器化。首先,請將「hello
world」server 容器化,然後將映像檔推送至 Artifact Registry:
切換至範例
server所在的目錄:cd ~/anthos-service-mesh-samples/docs/helloserver/server/
使用
Dockerfile建構映像檔:docker build -t us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver:v0.0.1 .- 將
PROJECT_ID替換為 Google Cloud 專案 ID。
-t旗標代表 Docker 標記。這是您部署容器時使用的映像檔名稱。- 將
將映像檔推送至 Artifact Registry:
docker push us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver:v0.0.1
將 loadgen 容器化
接著,以相同方式將負載產生器服務容器化:
切換至範例
loadgen所在的目錄:cd ../loadgen建構映像檔:
docker build -t us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen:v0.0.1 .將映像檔推送至 Artifact Registry:
docker push us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen:v0.0.1
列出映像檔
取得存放區中的圖片清單,確認圖片已推送:
gcloud container images list --repository us-central1-docker.pkg.dev/PROJECT_ID/container-intro
輸出內容應列出您推送的映像檔名稱,類似以下內容:
NAME us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen
建立 GKE 叢集
此時,您可以使用 docker run 指令,在 Cloud Shell VM 上執行容器。不過,如要執行可靠的正式環境工作負載,您需要以更統一的方式管理容器。舉例來說,您需要確保容器在失敗時重新啟動,並需要擴充及啟動額外容器執行個體的方法,以處理流量增加的情況。
GKE 可協助您滿足這些需求。GKE 是容器自動化調度管理平台,運作方式是將 VM 連結至叢集。每個 VM 稱為一個節點。GKE 叢集是由 Kubernetes 開放原始碼叢集管理系統提供技術支援。此外,也可以透過 Kubernetes 提供的機制與叢集互動
如要在 GKE 上執行容器,您必須先建立叢集,然後連線至叢集:
建立叢集:
gcloud container clusters create-auto container-intro
gcloud指令會在您先前設定的預設 Google Cloud 專案和區域中建立叢集。建立叢集的指令需要幾分鐘才能完成。叢集就緒時,輸出內容會與下列內容相似:
NAME: container-intro LOCATION: us-central1 MASTER_VERSION: 1.30.4-gke.1348000 MASTER_IP: 34.44.14.166 MACHINE_TYPE: e2-small NODE_VERSION: 1.30.4-gke.1348000 NUM_NODES: 3 STATUS: RUNNING
將憑證提供給
kubectl指令列工具,以便使用該工具管理叢集:gcloud container clusters get-credentials container-intro
檢查 Kubernetes 資訊清單
從原始碼執行應用程式時,您使用了命令式指令:python3 server.py
命令式表示以動詞為導向:「執行這項操作」。
相較之下,Kubernetes 採用宣告式模型運作。 也就是說,您不必明確指示 Kubernetes 該怎麼做,而是提供 Kubernetes 預期狀態。舉例來說,Kubernetes 會視需要啟動及終止 Pod,確保實際系統狀態符合所需狀態。
您可以在資訊清單檔案中指定所需狀態。資訊清單以 YAML 或 JSON 等語言編寫,內含一或多個 Kubernetes 物件的規格。
範例包含 server 和 loadgen 的資訊清單。每個資訊清單都會指定 Kubernetes Deployment 物件的所需狀態 (該物件會管理容器的執行作業,並封裝為 Kubernetes Pod 以利管理),以及 Service (該物件會為 Pod 提供 IP 位址)。Pod 是 Kubernetes 中可建立及管理的最小運算部署單位,內含一或多個容器。
下圖說明在 GKE 上執行的應用程式:
如要進一步瞭解 Pod、Deployment 和 Service,請參閱「開始學習 Kubernetes」一文,或本頁結尾的資源。
伺服器
首先,查看「hello world」server 的資訊清單:
這個資訊清單包含下列欄位:
kind表示物件類型。metadata.name指定 Deployment 的名稱。- 第一個
spec欄位包含所需狀態的說明。 spec.replicas指定所需的 Pod 數量。spec.template區段定義了 Pod 範本。Pod 的規格包含image欄位,這是要從 Artifact Registry 提取的映像檔名稱。在下一個步驟中,您將更新為剛才建立的新映像檔。
hellosvc 服務的定義如下:
LoadBalancer:用戶端會將要求傳送至網路負載平衡器的 IP 位址,該位址具有穩定性,且可在叢集外部存取。targetPort:請注意,Dockerfile中的EXPOSE 8080指令實際上不會公開任何通訊埠。公開通訊埠8080,以便從叢集外部連線至server容器。在本例中,hellosvc.default.cluster.local:80(簡短名稱:hellosvc) 會對應至helloserverPod IP 的通訊埠8080。port:這是叢集中其他服務傳送要求時使用的通訊埠編號。
負載產生器
loadgen.yaml 中的 Deployment 物件與 server.yaml 類似。值得注意的一項差異是,loadgen Deployment 的 Pod 規格具有名為 env 的欄位。本節定義 loadgen 需要的環境變數,您先前從來源執行應用程式時已設定這些變數。
由於 loadgen 不接受傳入的要求,因此 type 欄位會設為 ClusterIP。這種類型的 Service 會提供叢集中的實體可使用的穩定 IP 位址,但不會向外部用戶端公開 IP 位址。
將容器部署至 GKE
如要部署容器,請使用 kubectl「套用」指定所需狀態的資訊清單。
部署 server
切換至範例
server所在的目錄:cd ~/anthos-service-mesh-samples/docs/helloserver/server/
在 Cloud Shell 編輯器 (或慣用的文字編輯器) 中開啟
server.yaml。將
image欄位中的名稱替換為 Docker 映像檔的名稱。image: us-central1-docker.pkg.dev/PROJECT_ID/container-intro/helloserver:v0.0.1
將 PROJECT_ID 替換為 Google Cloud 專案 ID。
- 如果您使用 Cloud Shell 編輯器,系統會自動儲存檔案。按一下「Open terminal」(開啟終端機),返回終端機視窗。
- 如果您在 Cloud Shell 中使用文字編輯器,請儲存並關閉
server.yaml。
將資訊清單部署至 Kubernetes:
kubectl apply -f server.yaml輸出結果大致如下:
deployment.apps/helloserver created service/hellosvc created
部署 loadgen
切換至
loadgen所在的目錄。cd ../loadgen和之前一樣,在文字編輯器中開啟
loadgen.yaml。同樣地,請將
image欄位中的名稱替換為 Docker 映像檔名稱。image: us-central1-docker.pkg.dev/PROJECT_ID/container-intro/loadgen:v0.0.1
將 PROJECT_ID 替換為 Google Cloud 專案 ID。
- 如果您使用 Cloud Shell 編輯器,系統會自動儲存檔案。按一下「Open terminal」(開啟終端機),返回終端機視窗。
- 如果您在 Cloud Shell 中使用文字編輯器,請儲存並關閉
loadgen.yaml。
將資訊清單部署至叢集:
kubectl apply -f loadgen.yaml如果成功,指令會傳回下列內容:
deployment.apps/loadgenerator created service/loadgensvc created
驗證部署作業
將資訊清單部署至叢集後,請確認容器已成功部署:
檢查叢集中的 Pod 狀態:
kubectl get pods指令會傳回類似以下內容的狀態:
NAME READY STATUS RESTARTS AGE helloserver-69b9576d96-mwtcj 1/1 Running 0 58s loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
從
loadgenPod 取得應用程式記錄。將 POD_ID 替換為上一個輸出內容中的負載產生器 Pod ID。kubectl logs POD_ID
取得
hellosvc的外部 IP 位址:kubectl get service hellosvc輸出結果會與下列內容相似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hellosvc LoadBalancer 10.81.15.158 192.0.2.1 80:31127/TCP 33m
向
hellosvc傳送要求。將 EXTERNAL_IP 替換為hellosvc的外部 IP 位址。curl http://EXTERNAL_IP
您應該會看到伺服器傳送的「Hello World!」訊息。
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
如不想刪除整個專案,請按照下列步驟操作:
刪除 GKE 叢集。刪除叢集會一併刪除組成叢集的所有資源,例如 Compute Engine 執行個體、磁碟和網路資源。
gcloud container clusters delete container-intro刪除 Artifact Registry 存放區:
gcloud artifacts repositories delete container-intro --location=us-central1
後續步驟
進一步瞭解本教學課程中使用的技術:
進一步瞭解工具:
進一步瞭解 Kubernetes 概念: