練習 - 將微服務容器部署到 Kubernetes

已完成

Kubernetes 會為您執行容器。 您可以透過 YAML 檔案描述您想要 Kubernetes 執行的動作。 此練習會引導您逐步建立檔案,以便在 Kubernetes 上部署和執行後端服務。

重要

繼續後續作業之前,您必須確定已安裝 Kubernetes 實作。 我們將使用在 Codespace 中執行的 k3d 實作。 我們將安裝此實作來啟動實驗室。

安裝 Kubernetes 工具和實作

我們需要安裝 kubectl 工具和 k3d Kubernetes 實作:

  1. 在 Codespace 中,切換至 [終端] 索引標籤,然後執行下列命令以安裝必要條件:

    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl
    
  2. 接下來,若要下載 Kubernetes 套件存放庫的簽署金鑰,請執行下列命令:

    sudo mkdir /etc/apt/keyrings
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    

    如果您收到目錄已存在的錯誤,請個別執行 curl 命令。

  3. 將 Kubernetes 存放庫新增至您的 apt 組態:

    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    
  4. 現在,您可以安裝 kubectl 工具:

    sudo apt-get update
    sudo apt-get install -y kubectl
    
  5. 最後,安裝 Kubernetes 的 k3d 實作並建立叢集:

    curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
    k3d cluster create devcluster --config k3d.yml
    

建立後端服務的部署檔案

您可以建立一個檔案,使用 YAML 檔案來管理 Kubernetes 的容器部署。 讓我們建立一個檔案來部署後端服務。

  1. 在名為 backend-deploy.yml 之 Codespace 的 donet-kubernetes 資料夾建立新檔案。

  2. 將下列文字複製並儲存到檔案中。

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
        name: productsbackend
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: productsbackend
        spec:
          containers:
          - name: productsbackend
            image: [YOUR DOCKER USER NAME]/productservice:latest
            ports:
            - containerPort: 80
            env:
            - name: ASPNETCORE_URLS
              value: http://*:80
      selector:
        matchLabels:
          app: productsbackend
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: productsbackend
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        nodePort: 32001
      selector:
        app: productsbackend
    
  3. 將預留位置 [YOUR DOCKER USER NAME] 更換為您實際的 Docker 使用者名稱。

此檔案會執行幾項作業。

第一個部分針對要部署至 Kubernetes 的容器定義部署規格。 其會指定一個複本,在此複本中可找到容器映像、要在容器上開啟的連接埠,以及設定某些環境變數。 這第一個部分也會定義可用於參考容器和規格的標籤和名稱。

第二個部分則會定義以 Kubernetes NodePort 服務形式執行的容器。 針對本課程模組,您不需要瞭解 NodePorts 的所有細節。 不過,您應該瞭解這種類型的服務會公開外部 IP 位址,以便您可以從叢集外部測試服務。

部署和執行後端微服務

接下來,讓我們部署和執行微服務。

  1. 終端 索引標籤中,執行下列命令:

    kubectl apply -f backend-deploy.yml
    

    此命令會告知 Kubernetes 執行已建立的檔案。 其會從 Docker Hub 下載映像並建立容器。

  2. kubectl apply 命令會快速傳回。 但建立容器可能需要一些時間。 若要檢視進度,請使用下列程式碼。

    kubectl get pods
    

    在產生的輸出中,您有一個資料列,productsbackend 後面接著 [名稱] 資料行下的一串隨機字元。 當一切就緒後,[就緒] 資料行下會有 [1/1],而 [狀態] 資料行會顯示 [正在執行]

  3. 若要測試服務,請切換至 [連接埠] 索引標籤,在 [後端] 連接埠的本機位址,請選取地球圖示。 瀏覽器會在該位址開啟新的索引標籤。

  4. 若要查詢某些產品,請在位址附加 /api/product ,然後按 Enter。 您應會看到以 JSON 格式列出的一些產品資訊。

    [
        {
            "id": 1,
            "name": "Solar Powered Flashlight",
            "description": "A fantastic product for outdoor enthusiasts",
            "price": 19.99,
            "imageUrl": "product1.png"
        },
        {
            "id": 2,
            "name": "Hiking Poles",
            "description": "Ideal for camping and hiking trips",
            "price": 24.99,
            "imageUrl": "product2.png"
        },
        {
            "id": 3,
            "name": "Outdoor Rain Jacket",
            "description": "This product will keep you warm and dry in all weathers",
            "price": 49.99,
            "imageUrl": "product3.png"
        },
        ...
    

建立部署檔案並執行前端服務

與後端服務極其類似,我們在前端也需要有部署檔案。

  1. 在名為 frontend-deploy.ymldonet-kubernetes 資料夾中建立新檔案

  2. 將下列程式碼貼到檔案中:

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: storefrontend
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: storefrontend
        spec:
          containers:
          - name: storefrontend
            image: [YOUR DOCKER USER NAME]/storeimage:latest
            ports:
            - containerPort: 80
            env:
            - name: ASPNETCORE_URLS
              value: http://*:80
            - name: ProductEndpoint
              value: http://productsbackend
      selector:
        matchLabels:
          app: storefrontend
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: storefrontend
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        nodePort: 32000
      selector:
        app: storefrontend
    
  3. 將預留位置 [YOUR DOCKER USERNAME] 更換為您實際的 Docker 使用者名稱。

    請注意,這個檔案類似我們為後端微服務所建立的檔案。 有兩個差異:

    • 在部署的 spec.template.spec.containers.image 值下要指定不同的執行容器。
    • spec.template.spec.containers.env 區段下有一個新的環境變數。 storefrontend 應用程式中的程式碼會呼叫後端,但因為我們未指定完整網域名稱 (FQDN),因此我們不知道後端微服務的 IP 位址,所以我們使用在 Deploymentmetadata.name 節點下所指定的名稱。 Kubernetes 會負責其餘部分。
  4. 使用下列命令將容器部署至 Kubernetes:

    kubectl apply -f frontend-deploy.yml
    

    您可以再次使用 kubectl get pods 來查看部署狀態。 只要 storefrontend 資料列在 [狀態] 資料行下顯示正在執行,即表示一切都已準備就緒。

  5. 若要測試前端服務,請切換至 [連接埠] 索引標籤,然後在 [前端] 連接埠的本機位址右側,選取地球圖示。 瀏覽器會顯示首頁。

  6. 選取產品。 目錄會顯示 Contoso 的商品。

    A screenshot of the eSHopLite products page.

在此練習中,您建立了部署檔案,詳細描述了您希望容器在 Kubernetes 中如何執行。 然後,您讓 Kubernetes 從 Docker Hub 下載映像,並啟動容器。