FlixTube 微服務架構採用 Docker 容器化技術封裝個別服務,簡化佈署流程並確保環境一致性。透過 Dockerfile 定義映像建置步驟,開發者能輕鬆建立包含所有必要依賴項的容器映像。接著,利用 Docker CLI 工具將映像釋出至容器登入中心,方便 Kubernetes 叢集存取。Kubernetes 作為容器協調系統,負責自動化佈署、擴充套件和管理容器化應用,確保 FlixTube 微服務在生產環境中的高用性和高擴充套件性。kubectl 命令列工具提供操作 Kubernetes 叢集的介面,方便開發者佈署、更新和監控微服務。此外,文章也介紹如何使用 GitHub Actions 建立 CI/CD 管線,自動化建置、測試和佈署流程,進一步提升開發效率。

容器登記冊

容器登記冊是儲存和管理 Docker 容器映像的重要元件。透過使用容器登記冊,我們可以輕鬆地管理和佈署我們的微服務。

Kubernetes 叢集

Kubernetes 叢集是用於自動化佈署、擴充套件和管理容器化應用的容器協調系統。透過使用 Kubernetes,我們可以建立一個高用性和高擴充套件性的雲端環境。

FlixTube 開發

在 FlixTube 的開發過程中,我們使用 Docker 來封裝和釋出我們的微服務。Docker 提供了一種輕量級和便捷的方式來封裝和佈署應用程式。

使用 Docker 封裝微服務

透過使用 Docker,我們可以將我們的微服務封裝成容器,並將其釋出到容器登記冊中。這樣,我們就可以輕鬆地管理和佈署我們的微服務。

使用 kubectl 佈署微服務

kubectl 是 Kubernetes 的命令列工具,透過使用 kubectl,我們可以佈署和管理我們的微服務到 Kubernetes 叢集中。

生產環境佈署

在生產環境中,我們應該使用 azure-storage 服務來取代 mock-storage 服務。azure-storage 服務提供了一種安全和高可用性的方式來儲存和管理資料。

內容解密:

# 使用 Docker 封裝微服務
docker build -t my-service.

# 將微服務釋出到容器登記冊
docker tag my-service:latest <registry-url>/my-service:latest
docker push <registry-url>/my-service:latest

# 使用 kubectl 佈署微服務到 Kubernetes 叢集
kubectl apply -f deployment.yaml

圖表翻譯:

  graph LR
    A[Docker] -->|封裝|> B[容器]
    B -->|釋出|> C[容器登記冊]
    C -->|佈署|> D[Kubernetes 叢集]
    D -->|執行|> E[微服務]

在這個圖表中,我們可以看到 Docker 封裝微服務,然後釋出到容器登記冊中。接著,Kubernetes 叢集佈署微服務,並執行它。這個過程展示瞭如何使用 Docker 和 Kubernetes 來建立一個高用性和高擴充套件性的雲端環境。

Kubernetes 生產環境佈署

10.9.2 生產環境佈署

在將微服務映象發布到容器登入函式庫之前,我們需要登入登入函式庫並設定一些環境變數,這些變數將被用於佈署過程。

首先,開啟終端機並設定以下環境變數:

export CONTAINER_REGISTRY=<url-to-your-container-registry>

注意,Windows 使用者需要使用 WSL2 Linux 終端機來執行這些命令和指令碼。

接下來,使用以下命令登入容器登入函式庫:

docker login $CONTAINER_REGISTRY

輸入您的登入函式庫使用者名和密碼後,您就可以在同一終端機中執行生產環境佈署指令碼:

cd chapter-10/scripts/production-kub
./deploy.sh

這個指令碼會建立和佈署所有 FlixTube 微服務。雖然這個指令碼仍然有一些重複的程式碼,但這是為了簡化您的閱讀體驗。

比較生產環境佈署指令碼和本地佈署指令碼(在 10.8.2 節中),您會發現生產環境佈署指令碼會將映象推播到容器登入函式庫,並使用 envsubst 命令(在第 8 章 8.9.2 節中介紹)填充每個微服務的範本組態。這些組態會使用 CONTAINER_REGISTRY 環境變數,並將擴充套件的範本組態傳遞給 kubectl 來佈署每個微服務到 Kubernetes。

內容解密:

在這個過程中,我們使用了 docker login 命令來登入容器登入函式庫,並設定了 CONTAINER_REGISTRY 環境變數。然後,我們執行了生產環境佈署指令碼,該指令碼會建立和佈署所有 FlixTube 微服務。

圖表翻譯:

  flowchart TD
    A[設定環境變數] --> B[登入容器登入函式庫]
    B --> C[執行生產環境佈署指令碼]
    C --> D[建立和佈署微服務]
    D --> E[使用 kubectl 佈署到 Kubernetes]

這個流程圖展示了生產環境佈署的步驟,從設定環境變數到使用 kubectl 佈署微服務到 Kubernetes。

10.9.3 測試生產環境佈署

當 FlixTube 佈署到生產環境的 Kubernetes 叢集後,我們應該驗證它是否正常運作。同樣地,我們可以使用 kubectl get podskubectl get deploykubectl get services 來檢視為 FlixTube 建立的 Kubernetes 資源。關於測試已佈署的微服務的更多資訊,請參考第 6 章,6.11.5 和 6.11.6 節。

kubectl get services 的輸出中,我們可以找到入口微服務的 IP 地址。開啟瀏覽器並導航到該 IP 地址的網頁:關於測試本地佈署的更多細節,請參考第 6 章,6.8.5 和 6.8.6 節。

10.9.4 刪除生產環境佈署

當您完成測試和實驗後,使用提供的 shell 指令碼刪除佈署:

./delete.sh

該 shell 指令碼會為每個微服務呼叫 kubectl delete,從 Kubernetes 中刪除它們。

10.10 持續佈署到生產環境

在手動佈署 FlixTube 到生產環境並進行測試和實驗後,我們現在準備啟用 CD 管道。您可以跟隨,但這可能比之前的章節更具挑戰性。如果出現問題,您可能需要傳回到本地或手動佈署(我們剛剛在 10.8 和 10.9 節中完成的內容)來排除問題。 如同第 8 章中所做的,我們將使用 GitHub Actions 建立 CD 管道。它應該相對容易轉移到其他 CD 平臺。如我在第 8 章中所說,CD 管道基本上只是一種執行 shell 指令碼的方式,即使一些提供者也提供了漂亮的 UI。圖 10.16 展示了 FlixTube 的 CD 管道結構。

開發人員提交程式碼到本地倉函式庫。 開發人員將程式碼變更推播到託管程式碼倉函式庫。 各種 GitHub Actions 的組態檔案定義了我們微服務的持續佈署管道。 CD 管道由玄貓自動呼叫; 因此,佈署由玄貓控制。

內容解密:

上述過程描述瞭如何測試和刪除生產環境佈署,以及如何啟用 CD 管道。首先,我們使用 kubectl 命令來驗證 FlixTube 的佈署狀態。然後,我們使用 shell 指令碼刪除佈署。最後,我們啟用 CD 管道,使用 GitHub Actions 來自動化佈署過程。

圖表翻譯:

  graph LR
    A[開發人員提交程式碼] --> B[開發人員推播程式碼變更]
    B --> C[GitHub Actions 組態檔案]
    C --> D[CD 管道自動呼叫]
    D --> E[佈署由玄貓控制]

上述圖表展示了 CD 管道的流程,從開發人員提交程式碼到佈署由玄貓控制。每個步驟都清楚地展示了過程中的邏輯關係。

微服務佈署流程:Docker 和 kubectl 的應用

在現代軟體開發中,微服務架構已成為了一種主流的設計模式。它允許我們將一個大型應用程式拆分成多個小型、獨立的服務,每個服務負責一部分的功能。然而,管理和佈署這些微服務可能會變得複雜。為了簡化這個過程,我們可以使用 Docker 和 kubectl 這兩個強大的工具。

Docker:容器化的解決方案

Docker 是一個容器化平臺,允許我們將應用程式和其依賴包裝成一個容器,然後在任何支援 Docker 的環境中執行。這意味著我們可以在本地開發環境中建立一個微服務,然後直接佈署到生產環境中,而不需要擔心環境差異的問題。

建立 Docker 映像

要建立一個 Docker 映像,我們需要建立一個 Dockerfile,它包含了建立映像的指令。例如:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt.

RUN pip install -r requirements.txt

COPY..

CMD ["python", "app.py"]

這個 Dockerfile 告訴 Docker 使用 Python 3.9 的基礎映像,複製 requirements.txt 到工作目錄,安裝依賴包,然後複製應用程式程式碼到工作目錄。最後,設定命令來執行應用程式。

執行 Docker 容器

一旦我們建立了 Docker 映像,就可以使用 docker run 命令來執行容器:

docker run -p 8000:8000 my-microservice

這個命令啟動一個新的容器從 my-microservice 映像,並將容器的 8000 連線埠對映到主機的 8000 連線埠。

kubectl:Kubernetes 的命令列工具

kubectl 是 Kubernetes 的命令列工具,允許我們管理和佈署微服務到 Kubernetes 叢集。要使用 kubectl,我們需要先建立一個 Kubernetes 叢集,然後組態 kubectl 來連線到叢集。

佈署微服務到 Kubernetes

要佈署微服務到 Kubernetes,我們需要建立一個佈署組態檔(deployment YAML 檔案),它定義了微服務的佈署細節。例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-microservice
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-microservice
  template:
    metadata:
      labels:
        app: my-microservice
    spec:
      containers:
      - name: my-microservice
        image: my-microservice:latest
        ports:
        - containerPort: 8000

這個 YAML 檔案定義了一個名為 my-microservice 的佈署,具有 3 個複製品,使用 my-microservice:latest 映像,並將容器的 8000 連線埠暴露給外界。

應用佈署組態

要應用這個佈署組態,我們可以使用 kubectl apply 命令:

kubectl apply -f deployment.yaml

這個命令告訴 kubectl 應用 deployment.yaml 檔案中的組態,建立或更新 my-microservice 佈署。

GitHub Actions:自動化佈署流程

GitHub Actions 是一個連續整合和連續佈署(CI/CD)工具,允許我們自動化軟體開發和佈署流程。要使用 GitHub Actions,我們需要在 GitHub 儲存函式庫中建立一個工作流程組態檔(workflow YAML 檔案),它定義了自動化流程的細節。

建立工作流程組態

例如:

name: Deploy to Kubernetes

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Login to Kubernetes
        uses: kubernetes/login-action@v1
        with:
          token: ${{ secrets.KUBE_TOKEN }}
      - name: Deploy to Kubernetes
        run: |
          kubectl apply -f deployment.yaml

這個 YAML 檔案定義了一個名為 Deploy to Kubernetes 的工作流程,當 main 分支收到推播時觸發。工作流程包括三個步驟:簽出程式碼、登入 Kubernetes,以及佈署到 Kubernetes。

自動化佈署

當我們推播程式碼到 main 分支時,GitHub Actions 會自動觸發工作流程,執行佈署步驟,將微服務佈署到 Kubernetes 叢集。

Kubernetes 環境下的 FlixTube 持續佈署

在本文中,我們將探討如何實作 FlixTube 的持續佈署(Continuous Deployment, CD)到 Kubernetes 環境中。為了跟隨本文的內容,您需要有一個 GitHub 帳戶,並且已經完成了第 8 章中的相關設定。

10.10.1 持續佈署的前置條件

要實作持續佈署,您需要滿足以下條件:

  • 您需要有一個 GitHub 帳戶。如果您已經完成了第 8 章中的內容,您應該已經有一個 GitHub 帳戶。
  • 您需要一個容器註冊中心(Container Registry)和一個 Kubernetes 叢集。這些資源的設定請參考第 10.9.1 節。
  • 您需要將您的 Kubernetes 叢集的認證資料編碼為 Base64 格式。這部分的操作請參考第 8 章中的 8.9.5 節。

10.10.2 設定您的程式碼倉函式庫

要執行 FlixTube 的持續佈署Pipeline,您需要 fork 第 10 章的程式碼倉函式庫,並按照第 8 章中的 8.9.9 節的指導增加必要的秘密(Secrets)。您需要在您的程式碼倉函式庫中增加以下秘密:

  • CONTAINER_REGISTRY:您的容器註冊中心 URL
  • REGISTRY_UN:您的容器註冊中心使用者名
  • REGISTRY_PW:您的容器註冊中心密碼
  • KUBE_CONFIG:Base64 編碼的 Kubernetes 叢集組態,用於認證您的 kubectl 客戶端

10.10.3 佈署基礎設施

在使用持續佈署佈署 FlixTube 之前,我們需要先手動佈署 FlixTube 所依賴的基礎設施,包括 MongoDB 和 RabbitMQ。由於這些基礎設施不會頻繁變化,因此我們只需要佈署一次。

在第 10 章的程式碼倉函式庫中,有一個 shell 指令碼可以幫助您完成這一步:

cd chapter-10
./scripts/cd/infrastructure.sh

您可以檢視這個 shell 指令碼,它相當簡單,主要是使用 kubectl apply 命令來佈署 MongoDB 和 RabbitMQ 的組態到您的 Kubernetes 叢集中。

回顧第 4 章,我們曾經討論過如何使 Kubernetes 叢集變得「無狀態」(Stateless),也就是說,從叢集中移除持久化的 MongoDB 資料函式庫,並使用外部管理的資料函式庫來儲存資料。在這裡,我們直接將 MongoDB 佈署到叢集中,這主要是為了方便您自己佈署和測試。如果您正在開發一個生產級別的應用程式,建議您將資料函式庫抽取出來,使用外部管理的 MongoDB 服務。這樣可以更好地管理資料和應用程式的可擴充套件性。

個別微服務的 CD Pipeline

在 chapter-10 程式碼倉函式庫中,檢視 .github/workflows 目錄,您將看到每個微服務都有單獨的 GitHub Actions 工作流程檔案(YAML 檔案)。例如,開啟 gateway 微服務的 CD Pipeline組態檔案(chapter-10/.github/workflows/gateway.yaml),您將看到整個工作流程,如清單 10.16 所示。注意,大部分工作都委託給由玄貓組態的 shell 指令碼。

name: 佈署 gateway
on:
  push:
    branches:
      - main
    paths:
      - gateway/**
  workflow_dispatch:
jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      VERSION: ${{ github.sha }}
      REGISTRY_UN: ${{ secrets.REGISTRY_UN }}
      REGISTRY_PW: ${{ secrets.REGISTRY_PW }}
      NAME: gateway
      DIRECTORY: gateway
    steps:
      - uses: actions/checkout@v3
      - name: 建立
        run:./scripts/cd/build-image.sh
      - name: 釋出
        run:./scripts/cd/push-image.sh
      - uses: tale/kubectl-action@v1
        with:
          base64-kube-config: ${{ secrets.KUBE_CONFIG }}
          kubectl-version: v1.24.2
      - name: 佈署
        run:./scripts/cd/deploy.sh

清單 10.16 啟用 gateway 的個別 CD Pipeline

  • 命名 CD Pipeline
  • 在推播到 main 分支時執行工作流程
  • 將 CD Pipeline範圍限定為 gateway 子目錄。這個工作流程只會在 gateway 微服務發生變化時執行。這就是允許在 monorepo 中為微服務啟用獨立 CD Pipeline的原因。
  • 允許從 GitHub Actions UI 觸發 CD Pipeline
  • 設定在 shell 指令碼中使用的環境變數

內容解密:

這個 YAML 檔案定義了一個 GitHub Actions 工作流程,該工作流程負責佈署 gateway 微服務。工作流程在推播到 main 分支且變更發生在 gateway 子目錄時觸發。它使用環境變數儲存版本、登入倉函式庫憑據和 Kubernetes 組態等訊息。工作流程包括四個步驟:簽出程式碼、建立映像、釋出映像和佈署應用程式。每個步驟都委託給 shell 指令碼,這些指令碼組態和維護由玄貓負責。

圖表翻譯:

  flowchart TD
    A[推播到 main 分支] --> B[工作流程觸發]
    B --> C[簽出程式碼]
    C --> D[建立映像]
    D --> E[釋出映像]
    E --> F[佈署應用程式]

此圖表展示了 CD Pipeline的工作流程。當程式碼推播到 main 分支時,工作流程被觸發,然後依次執行簽出程式碼、建立映像、釋出映像和佈署應用程式的步驟。

10.10 持續佈署管線

持續佈署(Continuous Deployment,CD)是一種自動化佈署流程,當程式碼變更時,會自動構建、測試和佈署應用程式。以下是 FlixTube 的 CD 管線組態:

10.10.1 建立 Docker 映像

  • 使用 Dockerfile 建立 Docker 映像
  • 將映像釋出到容器登入中心

10.10.2 安裝和組態 kubectl

  • 安裝 kubectl 工具
  • 組態 kubectl 連線到 Kubernetes 叢集

10.10.3 擴充套件組態範本

  • 使用 envsubst 擴充套件組態範本
  • 將組態檔案應用到 Kubernetes 叢集

10.10.4 佈署微服務

  • 佈署微服務到 Kubernetes 叢集
  • 確保微服務正常執行

10.11 FlixTube 的未來

恭喜!如果您已經完成了本章的內容,您現在已經有了一個執行在生產環境中的 FlixTube 應用程式,並且您已經準備好繼續開發和演進它。您可以進行程式碼變更,測試它們,並且佈署您的更新到生產環境。

FlixTube 的未來是什麼?這取決於您的想象力!在第 12 章中,我們將討論 FlixTube 未來的技術方面:

  • 如何擴充套件以滿足不斷增長的使用者基數?
  • 如何擴充套件開發和佈署流程,以滿足應用程式的增長和開發團隊的增長?

現在,只需想象一下,您想在未來為 FlixTube 增加哪些微服務。圖 10.17 給您了一些靈感,展示了 FlixTube 未來可能的樣子。

10.12 繼續學習

在本章中,我們研究了 FlixTube 示例應用程式的結構和佈局。我們構建、執行和測試了它,並且透過其 CD 管線將其佈署到生產環境。

您現在已經有了一個執行的 FlixTube 應用程式,那麼接下來呢?閱讀任何書籍只能帶您走到一定的程度。掌握這些技能的關鍵是練習、練習和再次練習。嘗試使用程式碼,嘗試增加功能,嘗試增加新的微服務,甚至嘗試破壞 FlixTube 以檢視會發生什麼。練習開發藝術是帶您到下一個級別的關鍵。

  graph LR
    A[開始] --> B[構建Docker映像]
    B --> C[釋出Docker映像]
    C --> D[安裝和組態kubectl]
    D --> E[擴充套件組態範本]
    E --> F[佈署微服務]

內容解密:

上述 Mermaid 圖表展示了 FlixTube 的 CD 管線流程。流程從構建 Docker 映像開始,然後釋出映像到容器登入中心。接下來,安裝和組態 kubectl 工具,以便連線到 Kubernetes 叢集。然後,使用 envsubst 擴充套件組態範本,並將組態檔案應用到 Kubernetes 叢集。最後,佈署微服務到 Kubernetes 叢集,並確保微服務正常執行。

圖表翻譯:

這個圖表展示了 FlixTube 的 CD 管線流程。流程包括構建 Docker 映像、釋出映像、安裝和組態 kubectl、擴充套件組態範本和佈署微服務。每一步驟都很重要,以確保 FlixTube 應用程式可以順暢地佈署到生產環境。透過這個圖表,我們可以清晰地看到 CD 管線的流程和每一步驟的重要性。

Kubernetes叢集架構設計

在設計Kubernetes叢集時,需要考慮多個因素,以確保叢集的可擴充套件性、安全性和高用性。以下是Kubernetes叢集架構設計的一些關鍵要素:

元資料管理

元資料是指描述Kubernetes資源的資料,例如Pod、ReplicaSet、Deployment等。元資料管理是指如何儲存、管理和查詢這些元資料。Kubernetes提供了etcd作為元資料儲存的解決方案。

影片上傳和串流

在FlixTube應用中,影片上傳和串流是兩個重要的功能。Kubernetes提供了多種方式來實作這些功能,例如使用Azure Storage作為影片儲存的解決方案,使用LoadBalancer或Ingress作為影片串流的入口。

Azure Storage

Azure Storage是一種雲端儲存解決方案,提供了高用性和可擴充套件性的儲存服務。Kubernetes可以與Azure Storage整合,實作影片儲存和串流的功能。

歷史記錄

歷史記錄是指Kubernetes叢集的操作記錄,例如建立、更新和刪除資源的記錄。Kubernetes提供了audit log作為歷史記錄的解決方案。

外部儲存

外部儲存是指Kubernetes叢集以外的儲存解決方案,例如雲端儲存或分散式檔案系統。Kubernetes可以與外部儲存整合,實作資源的分享和儲存。

雲端儲存

雲端儲存是一種雲端計算的儲存解決方案,提供了高用性和可擴充套件性的儲存服務。Kubernetes可以與雲端儲存整合,實作資源的分享和儲存。

多個入口

多個入口是指Kubernetes叢集提供多個入口點,以便不同的應用可以存取不同的資源。Kubernetes提供了Ingress作為多個入口的解決方案。

使用者/帳戶管理

使用者/帳戶管理是指Kubernetes叢集的使用者和帳戶管理,例如建立、更新和刪除使用者和帳戶。Kubernetes提供了RBAC(Role-Based Access Control)作為使用者/帳戶管理的解決方案。

客戶門戶

客戶門戶是指Kubernetes叢集的客戶門戶,例如FlixTube應用的客戶門戶。Kubernetes提供了Ingress作為客戶門戶的解決方案。

FlixTube使用者

FlixTube使用者是指FlixTube應用的使用者,例如建立、更新和刪除FlixTube使用者。Kubernetes提供了RBAC(Role-Based Access Control)作為FlixTube使用者管理的解決方案。

內容解密:

以上內容介紹了Kubernetes叢集架構設計的一些關鍵要素,包括元資料管理、影片上傳和串流、Azure Storage、歷史記錄、外部儲存、雲端儲存、多個入口、使用者/帳戶管理、客戶門戶和FlixTube使用者。這些要素都是Kubernetes叢集設計中非常重要的部分,可以幫助您設計一個可擴充套件性、安全性和高可用性的Kubernetes叢集。

  graph LR
    A[元資料管理] --> B[影片上傳和串流]
    B --> C[Azure Storage]
    C --> D[歷史記錄]
    D --> E[外部儲存]
    E --> F[雲端儲存]
    F --> G[多個入口]
    G --> H[使用者/帳戶管理]
    H --> I[客戶門戶]
    I --> J[FlixTube使用者]

圖表翻譯:

以上圖表展示了Kubernetes叢集架構設計的一些關鍵要素之間的關係,包括元資料管理、影片上傳和串流、Azure Storage、歷史記錄、外部儲存、雲端儲存、多個入口、使用者/帳戶管理、客戶門戶和FlixTube使用者。這些要素都是Kubernetes叢集設計中非常重要的部分,可以幫助您設計一個可擴充套件性、安全性和高可用性的Kubernetes叢集。

FlixTube 的微服務架構在 Docker 與 Kubernetes 的協同下,展現了現代雲原生應用程式的高度彈性與可擴充套件性。透過容器化技術封裝微服務,搭配 Kubernetes 叢集的自動化佈署和管理,有效簡化了複雜的佈署流程並提升了系統的可靠性。然而,生產環境的佈署仍需考量安全性及效能最佳化,例如 Azure Storage 的整合以及持續佈署管線的完善,才能確保服務的穩定執行。技術團隊應著重於最佳化容器映像大小、資源組態以及網路效能等關鍵挑戰,才能充分釋放此架構的潛力。隨著雲原生技術的持續發展,預見未來 FlixTube 將能更靈活地應對不斷變化的市場需求,並持續提升使用者經驗。玄貓認為,此架構符合現代軟體開發的趨勢,值得更多企業借鏡與實踐。