本教學課程說明如何在無網路連線的 Google Distributed Cloud (GDC) 環境中上傳容器應用程式,並在 Kubernetes 叢集上執行該應用程式。容器化工作負載會在專案命名空間內的 Kubernetes 叢集上執行。叢集在邏輯上與專案和其他叢集分開,可提供不同的故障網域和隔離保證。不過,您必須確保叢集已附加至專案,才能在專案中管理容器化工作負載。
部署容器應用程式的最大障礙之一,是將應用程式的二進位檔傳輸到與網際網路隔離的資料中心。與基礎架構團隊和管理員合作,將應用程式傳輸到工作站,或直接在持續整合和持續推送軟體更新 (CI/CD) 伺服器上實作本教學課程。
本教學課程使用 Artifact Registry 提供的範例網頁伺服器應用程式。 Google Cloud
目標
- 建立代管式 Harbor 登錄檔。
- 將容器映像檔推送至受管理 Harbor 登錄檔。
- 建立 Kubernetes 叢集。
- 將範例容器應用程式部署至叢集。
費用
由於 GDC 的設計是在實體隔離的資料中心運作,因此帳單程序和資訊僅限於 GDC 部署作業,不會由其他 Google 產品管理。
如要根據預測用量估算費用,請使用 Pricing Calculator。
如要追蹤儲存空間和運算資源用量,請使用帳單用量資訊主頁。
事前準備
請確認您有專案可管理容器化部署作業。 如果沒有專案,請建立專案。
將專案命名空間設為環境變數:
export NAMESPACE=PROJECT_NAMESPACE
請機構 IAM 管理員授予下列角色:
專案命名空間的命名空間管理員角色 (
namepspace-admin
)。 您必須具備這個角色,才能在專案中部署容器工作負載。專案命名空間的 Harbor 執行個體管理員角色 (
harbor-instance-admin
)。如要讀取及寫入所有 Harbor 資源,就必須具備這個角色。刪除 Harbor 執行個體時也需要這個權限。專案命名空間的 Harbor 執行個體檢視者角色 (
harbor-instance-viewer
)。需要具備這個角色身分才能查看及選取 Harbor 執行個體。專案命名空間的 Harbor 專案建立者角色 (
harbor-project-creator
)。您必須具備這個角色,才能存取及管理 Harbor 專案。使用者叢集管理員角色 (
user-cluster-admin
)。建立 Kubernetes 叢集時必須具備這個角色,且這個角色不會繫結至命名空間。
登入區域管理 API 伺服器,並使用使用者身分產生 kubeconfig 檔案。將 kubeconfig 路徑設為環境變數:
export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
建立代管型 Harbor 登錄檔
Google Distributed Cloud Air-Gapped 提供 Harbor 即服務,這是一項全代管服務,可讓您使用 Harbor 儲存及管理容器映像檔。
如要使用 Harbor 即服務,請先建立 Harbor 登錄檔執行個體和 Harbor 專案。
建立 Harbor 登錄執行個體
如要建立 Harbor 容器登錄執行個體,請完成下列步驟:
主控台
在導覽選單中,選取「CI/CD」部分中的「Harbor Container Registry」。
選取要建立 Harbor 執行個體的區域。Harbor 執行個體是區域資源,必須在每個區域手動建立,才能確保高可用性。
點選「建立執行個體」。
輸入執行個體的名稱,並接受 Harbor 代管服務條款。
點選「建立執行個體」。
確認新的 Harbor 執行個體是否顯示在「Harbor Instance」(Harbor 執行個體) 區段中。
按一下「Go to Harbor Instance」(前往 Harbor 執行個體) 外部連結,並記下執行個體網址。舉例來說,執行個體網址格式類似於
harbor-1.org-1.zone1.google.gdc.test
。執行個體網址不得包含https://
前置字元。將執行個體網址設為變數,以供本教學課程稍後使用:
export INSTANCE_URL=INSTANCE_URL
將 INSTANCE_URL 替換為 Harbor 登錄執行個體的網址。
例如:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
建立新的 Harbor 容器登錄執行個體:
gdcloud harbor instances create INSTANCE_NAME \ --project=PROJECT \
更改下列內容:
INSTANCE_NAME
:Harbor 執行個體的名稱。PROJECT
:GDC 專案的名稱。
列出執行個體的網址:
gdcloud harbor instances describe INSTANCE_NAME \ --project=PROJECT
輸出看起來類似以下內容:
# Several lines of code are omitted here. status: url: https://harbor-1.org-1.zone1.google.gdc.test
將執行個體網址設為變數,以供本教學課程稍後使用:
export INSTANCE_URL=INSTANCE_URL
將 INSTANCE_URL 替換為 Harbor 登錄檔執行個體的網址。請確認執行個體網址不包含
https://
前置字串。例如:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
在登錄檔中建立 Harbor 專案
您必須在 Harbor 登錄檔執行個體中建立 Harbor 專案,才能管理容器映像檔:
主控台
在「Harbor Container Registry」頁面中,按一下「Create A Harbor Project」。
輸入專案名稱。
點選「建立」。
將 Harbor 專案名稱設為變數,以便在後續教學課程中使用:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
建立新的 Harbor 專案:
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAME
更改下列內容:
HARBOR_PROJECT
:要建立的 Harbor 專案名稱。PROJECT
:GDC 專案的名稱。INSTANCE_NAME
:Harbor 執行個體的名稱。
將 Harbor 專案名稱設為變數,以便在後續教學課程中使用:
export HARBOR_PROJECT=HARBOR_PROJECT
設定 Docker
如要在 Harbor 登錄檔中使用 Docker,請完成下列步驟:
設定 Docker,將 Harbor as a Service 設為信任來源。詳情請參閱「設定 Docker 信任 Harbor 根層級 CA」。
設定 Docker 驗證機制,以便存取 Harbor。詳情請參閱「為 Harbor 登錄檔執行個體設定 Docker 驗證」。
建立 Kubernetes 映像檔提取密鑰
由於您使用的是私人 Harbor 專案,因此必須建立 Kubernetes 映像檔提取密鑰。
新增 Harbor 專案機器人帳戶做為服務帳戶。
在 Harbor 控制台中,選取您的 Harbor 專案。
按一下「機器人帳戶」。
選取「New Robot Account」。
為新的機器人帳戶命名,並定義任何其他設定。
按一下「新增」。
成功畫面會顯示機器人帳戶名稱和密碼。請保留這個畫面,以便在下一個步驟中參考。
詳情請參閱 Harbor 說明文件: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account。
在新的終端機視窗中,使用 Harbor 專案機器人帳戶和密碼權杖登入 Docker:
docker login ${INSTANCE_URL}
系統提示時,請在「Username」中插入機器人專案名稱,並在「Password」中插入密碼權杖。這些資訊是在上一步中,從 Harbor 控制台的成功畫面取得。
為映像檔提取密鑰設定任意名稱:
export SECRET=SECRET
建立映像檔提取作業所需的密鑰:
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n ${NAMESPACE}
將
DOCKER_CONFIG
替換為.docker/config.json
檔案的路徑。確認密鑰是否位於 GDC 專案命名空間中:
kubectl get secrets -n ${NAMESPACE}
輸出結果會與下列內容相似:
NAME TYPE DATA AGE my-secret kubernetes.io/dockerconfigjson 1 23s
將容器映像檔推送至代管 Harbor 登錄檔
在本教學課程中,您將下載 nginx
網路伺服器映像檔並推送至代管的 Harbor 登錄檔,然後使用該映像檔將範例 nginx 網路伺服器應用程式部署至 Kubernetes 叢集。nginx 網路伺服器應用程式可從公開的 Docker Hub 存放區取得。
使用外部網路,從 Docker Hub 將
nginx
映像檔提取到本機工作站:docker pull nginx
使用存放區名稱標記本機映像檔:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
將
nginx
容器映像檔推送到受管理 Harbor 登錄檔:docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
建立 Kubernetes 叢集
您已將 nginx
容器映像檔儲存在受管理 Harbor 登錄檔中,並可存取該映像檔,現在請建立 Kubernetes 叢集來執行 nginx 網路伺服器。
主控台
在導覽選單中,依序選取「Kubernetes Engine」>「叢集」。
點選「建立叢集」。
在「Name」(名稱) 欄位中,指定叢集的名稱。
選取要建立 Kubernetes 叢集的可用區。Kubernetes 叢集是區域資源,必須在每個區域手動建立,才能確保高可用性。
按一下「附加專案」,然後選取要附加至叢集的專案。 選擇這個選項後,按一下 [儲存]。
點選「建立」。
等待叢集建立完成。叢集可供使用時,叢集名稱旁會顯示
READY
狀態。
API
建立
Cluster
自訂資源,並儲存為 YAML 檔案,例如cluster.yaml
:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform
將
CLUSTER_NAME
值替換為叢集名稱。將自訂資源套用至 GDC 執行個體:
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
使用 GDC 控制台將專案附加至 Kubernetes 叢集。目前無法使用 API 將專案附加至叢集。
如要進一步瞭解如何建立 Kubernetes 叢集,請參閱「建立 Kubernetes 叢集」。
部署範例容器應用程式
您現在可以將 nginx
容器映像檔部署至 Kubernetes 叢集。
Kubernetes 會以 Pod
資源的形式呈現應用程式,Pod 是可擴充的單位,其中包含一或多個容器。Pod 是 Kubernetes 中最小的可部署單位。通常,您會部署一組可擴充的 Pod 副本,並將這些副本一起分散到叢集各處。您可以透過 Kubernetes Deployment
部署一組副本。
在本節中,您將建立 Kubernetes Deployment
,以便在叢集上執行 nginx
容器應用程式。這個 Deployment 有備用資源或 Pod。一個 Deployment
Pod 只包含一個容器:nginx
容器映像檔。您也會建立 Service
資源,為用戶提供穩定方式,將要求傳送至 Deployment
的 Pod。
將 nginx 網路伺服器部署至 Kubernetes 叢集:
登入 Kubernetes 叢集,並使用使用者身分產生 kubeconfig 檔案。將 kubeconfig 路徑設為環境變數:
export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
建立及部署 Kubernetes
Deployment
和Service
自訂資源:kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25 ports: - containerPort: 80 imagePullSecrets: - name: ${SECRET} --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - port: 80 protocol: TCP type: LoadBalancer EOF
確認 Deployment 已建立 Pod:
kubectl get pods -l app=nginx -n ${NAMESPACE}
輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE nginx-deployment-1882529037-6p4mt 1/1 Running 0 1h nginx-deployment-1882529037-p29za 1/1 Running 0 1h nginx-deployment-1882529037-s0cmt 1/1 Running 0 1h
建立網路政策,允許所有網路流量進入命名空間:
kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \ create -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOF
匯出
nginx
服務的 IP 位址:export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
使用
curl
測試nginx
伺服器 IP 位址:curl http://$IP
清除所用資源
如要避免系統向您的 GDC 帳戶收取您在本教學課程中所用資源的相關費用,請刪除您建立的資源。
刪除容器映像檔
如要從 GDC 氣隙環境刪除容器映像檔,請刪除含有該映像檔的 Harbor 執行個體,或保留 Harbor 執行個體並刪除個別容器映像檔。
如要從受管理 Harbor 登錄檔刪除容器映像檔,請使用 GDC 控制台:
在導覽選單中,選取「CI/CD」部分中的「Harbor Container Registry」。
按一下「前往 Harbor 執行個體」外部連結。
使用 Harbor UI 刪除容器映像檔。詳情請參閱「刪除 Harbor 登錄檔執行個體」。
刪除容器應用程式
如要刪除已部署的容器應用程式,請刪除含有相關資源的 GDC 專案,或者保留 GDC 專案但刪除個別資源。
如要刪除個別資源,請完成下列步驟:
刪除容器應用程式的
Service
物件:kubectl delete service nginx-service -n ${NAMESPACE}
刪除容器應用程式的
Deployment
物件:kubectl delete deployment nginx-deployment -n ${NAMESPACE}
如果您是專為本教學課程建立測試 Kubernetes 叢集,請將其刪除:
kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \ -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
這會刪除組成 Kubernetes 叢集的資源,例如運算執行個體、磁碟和網路資源:
後續步驟
探索資源階層,以及資源隔離的相關詳細資料。
瞭解叢集架構。
請參閱 Kubernetes 容器 (適用於 GDC) 說明文件,瞭解如何管理部署至 Kubernetes 叢集的容器。
瞭解如何在部署容器工作負載後管理 Kubernetes 叢集。
瞭解設定容器工作負載和其他服務資源的最佳做法。