部署容器化網路伺服器應用程式

Google Distributed Cloud (GDC) 實體隔離方案中的共用叢集,可讓您在整個組織的獨立故障域中,執行容器化應用程式。將其附加至專案後,您可以在專屬命名空間中管理這些工作負載。在本教學課程中,您將設定代管 Harbor 登錄檔、從 Docker Hub 推送範例 NGINX 映像檔,以及部署網路伺服器。

這個工作流程適用於應用程式操作員群組中的開發人員,他們會為組織建立工作負載。詳情請參閱「GDC 實體隔離方案的目標對象」說明文件。

目標

  • 建立代管 Harbor 登錄檔。
  • 將容器映像檔推送至代管 Harbor 登錄檔。
  • 建立共用 Kubernetes 叢集。
  • 將範例容器應用程式部署至叢集。

費用

GDC 專為在實體隔離的資料中心內執行而設計,因此計費程序和資訊僅限於 GDC 部署作業,不受其他 Google 產品管理。

您可以使用 Pricing Calculator 根據預測用量估算費用。

使用預計費用資訊主頁,預測月結單中未來的 SKU 費用。

如要追蹤儲存空間和運算資源用量,請使用帳單用量資訊主頁。

事前準備

如要完成本文件中的工作,您必須要求必要權限並準備環境。

請與基礎架構團隊和管理員合作,將應用程式二進位檔傳輸至實體隔離工作站,或直接在持續整合和持續推送軟體更新 (CI/CD) 伺服器上執行本教學課程。

要求 IAM 角色

您必須具備特定角色,才能取得完成本教學課程工作流程所需的權限。您必須要求專案和組織範圍內的角色。

機構角色

如要建立、刪除、編輯或查看共用 Kubernetes 叢集,請要求 IAM 機構組織管理員授予使用者叢集管理員 (user-cluster-admin) 角色。這個角色未繫結至命名空間。

如果您沒有建立共用叢集的權限,請要求平台管理員為您建立。

專案角色

請要求 IAM 專案管理員根據要執行的工作,在專案命名空間中授予您下列角色:

  • 命名空間管理員 (namepspace-admin):建立、刪除、編輯及查看專案資源。必須具備這個角色,才能在專案中部署容器工作負載。

  • Harbor 執行個體管理員 (harbor-instance-admin):建立、刪除、編輯及查看 Harbor 資源,包括 Harbor 執行個體。

  • Harbor 執行個體檢視者 (harbor-instance-viewer):查看及選取 Harbor 執行個體。

  • Harbor 專案建立者 (harbor-project-creator):建立及查看 Harbor 專案。

準備環境

如要完成這份文件,您必須具備下列資源:

  1. 請確認您有專案可管理容器化部署項目。如果沒有專案,請建立專案。

  2. 將專案命名空間設為環境變數:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. 下載並安裝 gdcloud CLI。

  4. 登入可用區管理 API 伺服器,並使用使用者身分產生其 kubeconfig 檔案。將 kubeconfig 路徑設為環境變數:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

建立代管 Harbor 登錄檔

GDC 實體隔離方案提供 Harbor 即服務,這項全代管服務可讓您使用 Harbor 儲存及管理容器映像檔。

如要使用 Harbor 即服務,您必須先建立 Harbor 登錄檔執行個體和 Harbor 專案。

建立 Harbor 登錄檔執行個體

如要建立 Harbor Container Registry 執行個體,請完成下列步驟:

控制台

  1. 在導覽選單中,選取「CI/CD」部分中的「Harbor Container Registry」。

  2. 選取要建立 Harbor 執行個體的可用區。Harbor 執行個體是可用區資源,必須在每個可用區中手動建立,才能確保高可用性。

  3. 點選「建立執行個體」。

  4. 輸入執行個體名稱,並接受 Harbor 代管服務條款。

  5. 點選「建立執行個體」。

  6. 確認「Harbor Instance」(Harbor 執行個體) 區段中是否有新的 Harbor 執行個體。

  7. 按一下「Go to Harbor Instance」(前往 Harbor 執行個體) 外部連結,並記下執行個體網址。舉例來說,執行個體網址格式類似於 harbor-1.org-1.zone1.google.gdc.test。執行個體網址不得包含 https:// 前置字元。

  8. 將執行個體網址設為變數,以便在教學課程後續步驟中使用:

    export INSTANCE_URL=INSTANCE_URL
    

    將 INSTANCE_URL 替換為 Harbor 登錄檔執行個體的網址。

    例如:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

gdcloud

  1. 建立新的 Harbor Container Registry 執行個體:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT \
    

    更改下列內容:

    • INSTANCE_NAME:Harbor 執行個體的名稱。
    • PROJECT:GDC 專案的名稱。
  2. 列出執行個體的網址:

    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
    
  3. 將執行個體網址設為變數,以便在教學課程後續步驟中使用:

    export INSTANCE_URL=INSTANCE_URL
    

    將 INSTANCE_URL 替換為 Harbor 登錄檔執行個體的網址。請確認執行個體網址不含 https:// 前置字元。

    例如:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

在 Registry 中建立 Harbor 專案

您必須在 Harbor 登錄檔執行個體中建立 Harbor 專案,才能管理容器映像檔:

控制台

  1. 在「Harbor Container Registry」頁面中,按一下「Create A Harbor Project」。

  2. 輸入專案名稱。

  3. 點選「建立」。

  4. 將 Harbor 專案名稱設為變數,以便在教學課程後續步驟中使用:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. 建立新的 Harbor 專案:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=PROJECT \
        --instance=INSTANCE_NAME
    

    更改下列內容:

    • HARBOR_PROJECT:要建立的 Harbor 專案名稱。
    • PROJECT:GDC 專案的名稱。
    • INSTANCE_NAME:Harbor 執行個體的名稱。
  2. 將 Harbor 專案名稱設為變數,以便在教學課程後續步驟中使用:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

設定 Docker

如要在 Harbor 登錄檔中使用 Docker,請完成下列步驟:

  1. 設定 Docker 信任 Harbor 即服務。詳情請參閱「將 Docker 設為信任 Harbor 根 CA」。

  2. 設定 Docker 對 Harbor 的驗證機制。詳情請參閱「設定 Harbor 登錄檔執行個體的 Docker 驗證」。

建立 Kubernetes 映像檔提取 Secret

由於您使用的是私人 Harbor 專案,因此必須建立 Kubernetes 映像檔提取密鑰。

  1. 新增 Harbor 專案機器人帳戶,做為服務帳戶。

    1. 在 Harbor 控制台中,選取 Harbor 專案。

    2. 按一下「Robot Accounts」。

    3. 選取「New Robot Account」。

    4. 為新的機器人帳戶命名,並定義任何其他設定。

    5. 按一下「新增」。

    6. 機器人帳戶名稱和密鑰會顯示在成功畫面。請勿關閉這個畫面,下一個步驟會用到。

    詳情請參閱 Harbor 的說明文件:https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account。

  2. 在新的終端機視窗中,使用 Harbor 專案機器人帳戶和密鑰權杖登入 Docker:

    docker login ${INSTANCE_URL}
    

    系統提示時,請輸入上一個步驟中 Harbor 控制台成功畫面提供的機器人專案名稱做為「Username」,並輸入密鑰權杖做為「Password」。

  3. 為映像檔提取密鑰設定任意名稱:

    export SECRET=SECRET
    
  4. 建立提取映像檔所需的 Secret:

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n ${NAMESPACE}
    

    將 DOCKER_CONFIG 替換為 .docker/config.json 檔案的路徑。

  5. 確認密鑰存在於 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 存放區取得。

  1. 使用外部網路,將 nginx 映像檔從 Docker Hub 提取至本機工作站:

    docker pull nginx
    
  2. 使用存放區名稱標記本機映像檔:

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. 將 nginx 容器映像檔推送至代管 Harbor 登錄檔:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

建立 Kubernetes 叢集

您已將 nginx 容器映像檔儲存在代管 Harbor 登錄檔,且可存取該映像檔,現在請建立共用 Kubernetes 叢集,以便執行 nginx 網路伺服器。

控制台

  1. 在導覽選單中,依序選取 「Kubernetes Engine」 > 「叢集」。

  2. 點選「建立叢集」。

  3. 在「Name」(名稱) 欄位中,指定叢集名稱。

  4. 選取要建立 Kubernetes 叢集的可用區。Kubernetes 叢集是可用區資源,必須在每個可用區手動建立,才能確保高可用性。

  5. 按一下「Attach Project」(附加專案),然後選取要附加至叢集的專案。然後點選「儲存」。

  6. 點選「建立」。

  7. 等待叢集建立完成。叢集可供使用時,叢集名稱旁會顯示 READY 狀態。

API

  1. 建立 Cluster 自訂資源,並儲存為 YAML 檔案,例如 cluster.yaml:

    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    

    將 CLUSTER_NAME 值替換為叢集名稱。

  2. 將自訂資源套用至 GDC 執行個體:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. 使用 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 叢集:

  1. 登入 Kubernetes 叢集,並使用使用者身分產生 kubeconfig 檔案。將 kubeconfig 路徑設為環境變數:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. 建立及部署 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
    
  3. 確認 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
    
  4. 建立網路政策,允許所有網路流量進入命名空間:

    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
    
  5. 匯出 nginx 服務的 IP 位址:

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  6. 使用 curl 測試 nginx 伺服器 IP 位址:

      curl http://$IP
    

清除所用資源

為避免系統向您的 GDC 帳戶收取本教學課程所用資源的費用,請務必刪除您建立的資源。

刪除容器映像檔

如要從 GDC 實體隔離方案環境刪除容器映像檔,請刪除含有該映像檔的 Harbor 執行個體,或保留 Harbor 執行個體並刪除個別容器映像檔。

如要從代管 Harbor 登錄檔刪除容器映像檔,請使用 GDC 控制台:

  1. 在導覽選單中,選取「CI/CD」部分中的「Harbor Container Registry」。

  2. 按一下「Go to Harbor Instance」(前往 Harbor 執行個體) 外部連結。

  3. 使用 Harbor UI 刪除容器映像檔。詳情請參閱「刪除 Harbor 登錄檔執行個體」。

刪除容器應用程式

如要刪除已部署的容器應用程式,請刪除包含資源的 GDC 專案,或保留 GDC 專案並刪除個別資源。

如要刪除個別資源,請完成下列步驟:

  1. 刪除容器應用程式的 Service 物件:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. 刪除容器應用程式的 Deployment 物件:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. 如果您建立測試 Kubernetes 叢集只是為了完成本教學課程,請刪除該叢集:

    kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \
        -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
    

    這麼做會刪除組成 Kubernetes 叢集的資源,例如運算執行個體、磁碟和網路資源:

後續步驟