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


本教學課程說明如何在 Google Distributed Cloud (GDC) 氣隙裝置環境中上傳容器應用程式,並在裝置環境中執行該應用程式。在本教學課程中,您將瞭解如何建立 Harbor 專案、將映像檔上傳至 Harbor,以及建立工作負載。容器化工作負載會在專案命名空間中執行。

GDC 氣隙隔離裝置環境會預先設定名為 tear-harbor 的 Harbor 登錄檔,供您在名為 tear 的 GDC 專案中使用。您將在本範例中使用這個登錄檔。

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

目標

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

事前準備

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

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

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

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

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

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

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

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

    export KUBECONFIG=CLUSTER_KUBECONFIG
    

在登錄檔中建立 Harbor 專案

GDC 提供 Harbor 即服務,這是一項全代管服務,可讓您使用 Harbor 儲存及管理容器映像檔。

如要使用 Harbor as a Service,您必須在 tear-harbor 登錄執行個體中建立 Harbor 專案,以便管理容器映像檔:

  1. 您需要 tear-harbor 的網址。列出執行個體的網址:

    gdcloud harbor instances describe tear-harbor --project=tear
    

    輸出內容類似於 harbor-1.org-1.zone1.google.gdc.test

  2. 將執行個體網址設為變數,以供本教學課程稍後使用:

    export INSTANCE_URL=INSTANCE_URL
    
  3. 建立專案前,請務必使用上一步的網址登入 Harbor。使用瀏覽器開啟這個網址,並登入 Harbor 執行個體。

  4. 建立 Harbor 專案:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=tear \
        --instance=tear-harbor
    

    HARBOR_PROJECT 替換為要建立的 Harbor 專案名稱。您無法在任何專案命名空間中建立 Harbor 專案。您必須使用 tear 專案。

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

    export HARBOR_PROJECT=HARBOR_PROJECT
    

設定 Docker

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

  1. 設定 Docker,將 Harbor as a Service 設為信任來源。詳情請參閱「設定 Docker 信任 Harbor 根層級 CA」。

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

  3. 由於 tear-harbor 是預先設定的 Harbor 登錄檔,您必須信任由 Google Distributed Cloud Air-gapped 內部 CA 簽署的憑證:

    1. 請向 IO 索取下列資訊:

      1. Harbor 叢集的外部網址。
      2. Google Distributed Cloud 氣隙隔離內部 CA 的 .crt 檔案。檔案通常會以 anthos-creds 命名空間中的 trust-store-internal-only 名稱,以密鑰形式儲存在控制平面。
    2. 與上一個步驟類似,建立以 Harbor 叢集外部網址命名的資料夾,並將 .crt 檔案保留在該資料夾中。

建立 Kubernetes 映像檔提取密鑰

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

  1. 新增 Harbor 專案機器人帳戶。按照 Harbor 使用者介面中的步驟建立機器人帳戶,並複製機器人密鑰權杖: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account

  2. 請注意新的機器人專案帳戶名稱,其語法如下:

    <PREFIX><PROJECT_NAME>+<ACCOUNT_NAME>
    

    舉例來說,機器人專案帳戶名稱格式類似 harbor@library+artifact-account

    如要進一步瞭解如何在 Harbor 中找出機器人專案帳戶名稱,請參閱 Harbor 說明文件: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#view-project-robot-accounts

  3. 使用 Harbor 專案機器人帳戶和密碼權杖登入 Docker:

    docker login ${INSTANCE_URL}
    

    系統提示時,請插入 Username 的機器人專案帳戶名稱和 Password 的密鑰權杖。

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

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

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

    更改下列內容:

    • DOCKER_CONFIG.docker/config.json 檔案的路徑。
    • NAMESPACE:您建立的密鑰命名空間。

將容器映像檔推送至代管 Harbor 登錄檔

在本教學課程中,您將下載 nginx 網路伺服器映像檔並推送至代管的 Harbor 登錄檔,然後使用該映像檔將範例 nginx 網路伺服器應用程式部署至 Kubernetes 叢集。nginx 網路伺服器應用程式可從公開的 Google Cloud Artifact Registry 取得。

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

    docker pull gcr.io/cloud-marketplace/google/nginx:1.25
    
  2. 設定圖片名稱。完整圖片名稱的格式如下:

    ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx
    
  3. 使用存放區名稱標記本機映像檔:

    docker tag gcr.io/cloud-marketplace/google/nginx:1.25 ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  4. nginx 容器映像檔推送到受管理 Harbor 登錄檔:

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

部署範例容器應用程式

您現在可以將 nginx 容器映像檔部署至設備叢集。

Kubernetes 會以 Pod 資源的形式呈現應用程式,Pod 是可擴充的單位,其中包含一或多個容器。Pod 是 Kubernetes 中最小的可部署單位。通常,您會部署一組可擴充的 Pod 副本,並將這些副本一起分散到叢集各處。您可以透過 Kubernetes Deployment 部署一組副本。

在本節中,您將建立 Kubernetes Deployment,以便在叢集上執行 nginx 容器應用程式。這個 Deployment 有備用資源或 Pod。一個 Deployment Pod 只包含一個容器:nginx 容器映像檔。您也會建立 Service 資源,為用戶提供穩定方式,將要求傳送至 Deployment 的 Pod。

部署 nginx 網路伺服器:

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

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

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

      curl http://$IP
    

後續步驟

  • 如要瞭解如何管理容器,請參閱容器說明文件。