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


本教學課程說明如何在無網路連線的 Google Distributed Cloud (GDC) 環境中上傳容器應用程式,並在 Kubernetes 叢集上執行該應用程式。容器化工作負載會在專案命名空間內的 Kubernetes 叢集上執行。叢集在邏輯上與專案和其他叢集分開,可提供不同的故障網域和隔離保證。不過,您必須確保叢集已附加至專案,才能在專案中管理容器化工作負載。

部署容器應用程式的最大障礙之一,是將應用程式的二進位檔傳輸到與網際網路隔離的資料中心。與基礎架構團隊和管理員合作,將應用程式傳輸到工作站,或直接在持續整合和持續推送軟體更新 (CI/CD) 伺服器上實作本教學課程。

本教學課程使用 Artifact Registry 提供的範例網頁伺服器應用程式。 Google Cloud

目標

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

費用

由於 GDC 的設計是在實體隔離的資料中心運作,因此帳單程序和資訊僅限於 GDC 部署作業,不會由其他 Google 產品管理。

如要根據預測用量估算費用,請使用 Pricing Calculator

使用「預估費用」資訊主頁,預估未來帳單的 SKU 費用。

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

事前準備

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

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

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

  4. 請機構 IAM 管理員授予下列角色:

    • 專案命名空間的命名空間管理員角色 (namepspace-admin)。 您必須具備這個角色,才能在專案中部署容器工作負載。

    • 專案命名空間的 Harbor 執行個體管理員角色 (harbor-instance-admin)。如要讀取及寫入所有 Harbor 資源,就必須具備這個角色。刪除 Harbor 執行個體時也需要這個權限。

    • 專案命名空間的 Harbor 執行個體檢視者角色 (harbor-instance-viewer)。需要具備這個角色身分才能查看及選取 Harbor 執行個體。

    • 專案命名空間的 Harbor 專案建立者角色 (harbor-project-creator)。您必須具備這個角色,才能存取及管理 Harbor 專案。

    • 使用者叢集管理員角色 (user-cluster-admin)。建立 Kubernetes 叢集時必須具備這個角色,且這個角色不會繫結至命名空間。

  5. 登入區域管理 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 容器登錄執行個體,請完成下列步驟:

主控台

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

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

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

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

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

  6. 確認新的 Harbor 執行個體是否顯示在「Harbor Instance」(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 容器登錄執行個體:

    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
    

在登錄檔中建立 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 as a Service 設為信任來源。詳情請參閱「設定 Docker 信任 Harbor 根層級 CA」。

  2. 設定 Docker 驗證機制,以便存取 Harbor。詳情請參閱「為 Harbor 登錄檔執行個體設定 Docker 驗證」。

建立 Kubernetes 映像檔提取密鑰

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

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

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

    2. 按一下「機器人帳戶」

    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}
    

    系統提示時,請在「Username」中插入機器人專案名稱,並在「Password」中插入密碼權杖。這些資訊是在上一步中,從 Harbor 控制台的成功畫面取得。

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

    export SECRET=SECRET
    
  4. 建立映像檔提取作業所需的密鑰:

    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. 使用外部網路,從 Docker Hub 將 nginx 映像檔提取到本機工作站:

    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. 按一下「附加專案」,然後選取要附加至叢集的專案。 選擇這個選項後,按一下 [儲存]

  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 DeploymentService 自訂資源:

    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. 按一下「前往 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 叢集的資源,例如運算執行個體、磁碟和網路資源:

後續步驟